diff --git a/dist/htmx.js b/dist/htmx.js index 18ff0eb54..c7ea3f451 100644 --- a/dist/htmx.js +++ b/dist/htmx.js @@ -82,7 +82,7 @@ return (function () { sock.binaryType = htmx.config.wsBinaryType; return sock; }, - version: "1.9.1" + version: "1.9.2" }; /** @type {import("./htmx").HtmxInternalApi} */ @@ -921,8 +921,9 @@ return (function () { }); } if (internalData.onHandlers) { - for (var eventName of internalData.onHandlers) { - element.removeEventListener(eventName, internalData.onHandlers[eventName]); + for (let i = 0; i < internalData.onHandlers.length; i++) { + const handlerInfo = internalData.onHandlers[i]; + element.removeEventListener(handlerInfo.name, handlerInfo.handler); } } } @@ -1867,12 +1868,12 @@ return (function () { function addHxOnEventHandler(elt, eventName, code) { var nodeData = getInternalData(elt); - nodeData.onHandlers ||= {}; + nodeData.onHandlers = []; var func = new Function("event", code + "; return;"); var listener = elt.addEventListener(eventName, function (e) { return func.call(elt, e); }); - nodeData.onHandlers[eventName] = listener; + nodeData.onHandlers.push({event:eventName, listener:listener}); return {nodeData, code, func, listener}; } diff --git a/dist/htmx.min.js b/dist/htmx.min.js index 1a7f2423f..f889d0ea5 100644 --- a/dist/htmx.min.js +++ b/dist/htmx.min.js @@ -1 +1 @@ -(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var z={onLoad:t,process:Tt,on:le,off:ue,trigger:ie,ajax:dr,find:b,findAll:f,closest:d,values:function(e,t){var r=Jt(e,t||"post");return r.values},remove:B,addClass:j,removeClass:n,toggleClass:U,takeClass:V,defineExtension:yr,removeExtension:br,logAll:F,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false},parseInterval:v,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=z.config.wsBinaryType;return t},version:"1.9.1"};var C={addTriggerHandler:xt,bodyContains:ee,canAccessLocalStorage:D,filterValues:er,hasAttribute:q,getAttributeValue:G,getClosestMatch:c,getExpressionVars:fr,getHeaders:Qt,getInputValues:Jt,getInternalData:Y,getSwapSpecification:rr,getTriggerSpecs:ze,getTarget:de,makeFragment:l,mergeObjects:te,makeSettleInfo:S,oobSwap:me,selectAndSwap:Me,settleImmediately:Bt,shouldCancel:Ke,triggerEvent:ie,triggerErrorEvent:ne,withExtensions:w};var R=["get","post","put","delete","patch"];var O=R.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function v(e){if(e==undefined){return undefined}if(e.slice(-2)=="ms"){return parseFloat(e.slice(0,-2))||undefined}if(e.slice(-1)=="s"){return parseFloat(e.slice(0,-1))*1e3||undefined}if(e.slice(-1)=="m"){return parseFloat(e.slice(0,-1))*1e3*60||undefined}return parseFloat(e)||undefined}function $(e,t){return e.getAttribute&&e.getAttribute(t)}function q(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function G(e,t){return $(e,t)||$(e,"data-"+t)}function u(e){return e.parentElement}function J(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function T(e,t,r){var n=G(t,r);var i=G(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function Z(t,r){var n=null;c(t,function(e){return n=T(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function H(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=J().createDocumentFragment()}return i}function L(e){return e.match(/",0);return r.querySelector("template").content}else{var n=H(e);switch(n){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i(""+e+"
",1);case"col":return i(""+e+"
",2);case"tr":return i(""+e+"
",2);case"td":case"th":return i(""+e+"
",3);case"script":return i("
"+e+"
",1);default:return i(e,0)}}}function K(e){if(e){e()}}function A(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function N(e){return A(e,"Function")}function I(e){return A(e,"Object")}function Y(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function k(e){var t=[];if(e){for(var r=0;r=0}function ee(e){if(e.getRootNode&&e.getRootNode()instanceof ShadowRoot){return J().body.contains(e.getRootNode().host)}else{return J().body.contains(e)}}function M(e){return e.trim().split(/\s+/)}function te(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){x(e);return null}}function D(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function X(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!t.match("^/$")){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function e(e){return sr(J().body,function(){return eval(e)})}function t(t){var e=z.on("htmx:load",function(e){t(e.detail.elt)});return e}function F(){z.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function b(e,t){if(t){return e.querySelector(t)}else{return b(J(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(J(),e)}}function B(e,t){e=s(e);if(t){setTimeout(function(){B(e);e=null},t)}else{e.parentElement.removeChild(e)}}function j(e,t,r){e=s(e);if(r){setTimeout(function(){j(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=s(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function U(e,t){e=s(e);e.classList.toggle(t)}function V(e,t){e=s(e);Q(e.parentElement.children,function(e){n(e,t)});j(e,t)}function d(e,t){e=s(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function r(e){var t=e.trim();if(t.startsWith("<")&&t.endsWith("/>")){return t.substring(1,t.length-2)}else{return t}}function _(e,t){if(t.indexOf("closest ")===0){return[d(e,r(t.substr(8)))]}else if(t.indexOf("find ")===0){return[b(e,r(t.substr(5)))]}else if(t.indexOf("next ")===0){return[W(e,r(t.substr(5)))]}else if(t.indexOf("previous ")===0){return[oe(e,r(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else{return J().querySelectorAll(r(t))}}var W=function(e,t){var r=J().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function re(e,t){if(t){return _(e,t)[0]}else{return _(J().body,e)[0]}}function s(e){if(A(e,"String")){return b(e)}else{return e}}function se(e,t,r){if(N(t)){return{target:J().body,event:e,listener:t}}else{return{target:s(e),event:t,listener:r}}}function le(t,r,n){Sr(function(){var e=se(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=N(r);return e?r:n}function ue(t,r,n){Sr(function(){var e=se(t,r,n);e.target.removeEventListener(e.event,e.listener)});return N(r)?r:n}var fe=J().createElement("output");function ce(e,t){var r=Z(e,t);if(r){if(r==="this"){return[he(e,t)]}else{var n=_(e,r);if(n.length===0){x('The selector "'+r+'" on '+t+" returned no matches!");return[fe]}else{return n}}}}function he(e,t){return c(e,function(e){return G(e,t)!=null})}function de(e){var t=Z(e,"hx-target");if(t){if(t==="this"){return he(e,"hx-target")}else{return re(e,t)}}else{var r=Y(e);if(r.boosted){return J().body}else{return e}}}function ve(e){var t=z.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=J().querySelectorAll(t);if(r){Q(r,function(e){var t;var r=i.cloneNode(true);t=J().createDocumentFragment();t.appendChild(r);if(!pe(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ie(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){ke(o,e,e,t,a)}Q(a.elts,function(e){ie(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);ne(J().body,"htmx:oobErrorNoTarget",{content:i})}return e}function xe(e,t,r){var n=Z(e,"hx-select-oob");if(n){var i=n.split(",");for(let e=0;e0){var t=e.id.replace("'","\\'");var r=e.tagName.replace(":","\\:");var n=a.querySelector(r+"[id='"+t+"']");if(n&&n!==a){var i=e.cloneNode();ge(e,n);o.tasks.push(function(){ge(e,i)})}}})}function we(e){return function(){n(e,z.config.addedClass);Tt(e);bt(e);Se(e);ie(e,"htmx:load")}}function Se(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){be(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;j(i,z.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(we(i))}}}function Ee(e,t){var r=0;while(r-1){var t=e.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,"");var r=t.match(/]*>|>)([\s\S]*?)<\/title>/im);if(r){return r[2]}}}function Me(e,t,r,n,i){i.title=Pe(n);var a=l(n);if(a){xe(r,a,i);a=Ie(r,a);ye(a);return ke(e,r,t,a,i)}}function De(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=y(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!I(o)){o={value:o}}ie(r,a,o)}}}else{ie(r,n,[])}}var Xe=/\s/;var g=/[\s,]/;var Fe=/[_$a-zA-Z]/;var Be=/[_$a-zA-Z0-9]/;var je=['"',"'","/"];var p=/[^\s]/;function Ue(e){var t=[];var r=0;while(r0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=sr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){ne(J().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Ve(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function m(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}var We="input, textarea, select";function ze(e){var t=G(e,"hx-trigger");var r=[];if(t){var n=Ue(t);do{m(n,p);var i=n.length;var a=m(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};m(n,p);o.pollInterval=v(m(n,/[,\[\s]/));m(n,p);var s=_e(e,n,"event");if(s){o.eventFilter=s}r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var l={trigger:a};var s=_e(e,n,"event");if(s){l.eventFilter=s}while(n.length>0&&n[0]!==","){m(n,p);var u=n.shift();if(u==="changed"){l.changed=true}else if(u==="once"){l.once=true}else if(u==="consume"){l.consume=true}else if(u==="delay"&&n[0]===":"){n.shift();l.delay=v(m(n,g))}else if(u==="from"&&n[0]===":"){n.shift();var f=m(n,g);if(f==="closest"||f==="find"||f==="next"||f==="previous"){n.shift();f+=" "+m(n,g)}l.from=f}else if(u==="target"&&n[0]===":"){n.shift();l.target=m(n,g)}else if(u==="throttle"&&n[0]===":"){n.shift();l.throttle=v(m(n,g))}else if(u==="queue"&&n[0]===":"){n.shift();l.queue=m(n,g)}else if((u==="root"||u==="threshold")&&n[0]===":"){n.shift();l[u]=m(n,g)}else{ne(e,"htmx:syntax:error",{token:n.shift()})}}r.push(l)}}if(n.length===i){ne(e,"htmx:syntax:error",{token:n.shift()})}m(n,p)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"]')){return[{trigger:"click"}]}else if(h(e,We)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function $e(e){Y(e).cancelled=true}function Ge(e,t,r){var n=Y(e);n.timeout=setTimeout(function(){if(ee(e)&&n.cancelled!==true){if(!Qe(r,Lt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}Ge(e,t,r)}},r.pollInterval)}function Je(e){return location.hostname===e.hostname&&$(e,"href")&&$(e,"href").indexOf("#")!==0}function Ze(t,r,e){if(t.tagName==="A"&&Je(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=t.href}else{var a=$(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=$(t,"action")}e.forEach(function(e){et(t,function(e,t){ae(n,i,e,t)},r,e,true)})}}function Ke(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&d(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function Ye(e,t){return Y(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function Qe(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){ne(J().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function et(i,a,e,o,s){var l=Y(i);var t;if(o.from){t=_(i,o.from)}else{t=[i]}if(o.changed){l.lastValue=i.value}Q(t,function(r){var n=function(e){if(!ee(i)){r.removeEventListener(o.trigger,n);return}if(Ye(i,e)){return}if(s||Ke(e,i)){e.preventDefault()}if(Qe(o,e)){return}var t=Y(e);t.triggerSpec=o;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(i)<0){t.handledFor.push(i);if(o.consume){e.stopPropagation()}if(o.target&&e.target){if(!h(e.target,o.target)){return}}if(o.once){if(l.triggeredOnce){return}else{l.triggeredOnce=true}}if(o.changed){if(l.lastValue===i.value){return}else{l.lastValue=i.value}}if(l.delayed){clearTimeout(l.delayed)}if(l.throttle){return}if(o.throttle){if(!l.throttle){a(i,e);l.throttle=setTimeout(function(){l.throttle=null},o.throttle)}}else if(o.delay){l.delayed=setTimeout(function(){a(i,e)},o.delay)}else{ie(i,"htmx:trigger");a(i,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:o.trigger,listener:n,on:r});r.addEventListener(o.trigger,n)})}var tt=false;var rt=null;function nt(){if(!rt){rt=function(){tt=true};window.addEventListener("scroll",rt);setInterval(function(){if(tt){tt=false;Q(J().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){it(e)})}},200)}}function it(t){if(!q(t,"data-hx-revealed")&&P(t)){t.setAttribute("data-hx-revealed","true");var e=Y(t);if(e.initHash){ie(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ie(t,"revealed")},{once:true})}}}function at(e,t,r){var n=M(r);for(var i=0;i=0){var t=ut(n);setTimeout(function(){ot(s,r,n+1)},t)}};t.onopen=function(e){n=0};Y(s).webSocket=t;t.addEventListener("message",function(e){if(st(s)){return}var t=e.data;w(s,function(e){t=e.transformResponse(t,null,s)});var r=S(s);var n=l(t);var i=k(n.children);for(var a=0;a0){ie(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(Ke(e,u)){e.preventDefault()}})}else{ne(u,"htmx:noWebSocketSourceError")}}function ut(e){var t=z.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}x('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function ft(e,t,r){var n=M(r);for(var i=0;i0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Ct(o)}for(var l in r){Rt(e,l,r[l])}}}function qt(t){if(t.closest&&t.closest(z.config.disableSelector)){return}var r=Y(t);if(r.initHash!==Ce(t)){r.initHash=Ce(t);Re(t);Ot(t);ie(t,"htmx:beforeProcessNode");if(t.value){r.lastValue=t.value}var e=ze(t);var n=mt(t,r,e);if(!n){if(Z(t,"hx-boost")==="true"){Ze(t,r,e)}else if(q(t,"hx-trigger")){e.forEach(function(e){xt(t,e,r,function(){})})}}if(t.tagName==="FORM"){Et(t)}var i=G(t,"hx-sse");if(i){ft(t,r,i)}var a=G(t,"hx-ws");if(a){at(t,r,a)}ie(t,"htmx:afterProcessNode")}}function Tt(e){e=s(e);qt(e);Q(St(e),function(e){qt(e)})}function Ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Lt(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=J().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function ne(e,t,r){ie(e,t,te({error:t},r))}function At(e){return e==="htmx:afterProcessNode"}function w(e,t){Q(wr(e),function(e){try{t(e)}catch(e){x(e)}})}function x(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function ie(e,t,r){e=s(e);if(r==null){r={}}r["elt"]=e;var n=Lt(t,r);if(z.logger&&!At(t)){z.logger(e,t,r)}if(r.error){x(r.error);ie(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=Ht(t);if(i&&a!==t){var o=Lt(a,n.detail);i=i&&e.dispatchEvent(o)}w(e,function(e){i=i&&e.onEvent(t,n)!==false});return i}var Nt=location.pathname+location.search;function It(){var e=J().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||J().body}function kt(e,t,r,n){if(!D()){return}e=X(e);var i=y(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;az.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){ne(J().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Pt(e){if(!D()){return null}e=X(e);var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ie(J().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=It();var r=S(t);var n=Pe(this.response);if(n){var i=b("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ne(t,e,r);Bt(r.tasks);Nt=a;ie(J().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{ne(J().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function Ut(e){Dt();e=e||location.pathname+location.search;var t=Pt(e);if(t){var r=l(t.content);var n=It();var i=S(n);Ne(n,r,i);Bt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Nt=e;ie(J().body,"htmx:historyRestore",{path:e,item:t})}else{if(z.config.refreshOnHistoryMiss){window.location.reload(true)}else{jt(e)}}}function Vt(e){var t=ce(e,"hx-indicator");if(t==null){t=[e]}Q(t,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,z.config.requestClass)});return t}function _t(e){Q(e,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,z.config.requestClass)}})}function Wt(e,t){for(var r=0;r=0}function rr(e,t){var r=t?t:Z(e,"hx-swap");var n={swapStyle:Y(e).boosted?"innerHTML":z.config.defaultSwapStyle,swapDelay:z.config.defaultSwapDelay,settleDelay:z.config.defaultSettleDelay};if(Y(e).boosted&&!tr(e)){n["show"]="top"}if(r){var i=M(r);if(i.length>0){n["swapStyle"]=i[0];for(var a=1;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}if(o.indexOf("focus-scroll:")===0){var d=o.substr("focus-scroll:".length);n["focusScroll"]=d=="true"}}}}return n}function nr(e){return Z(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&$(e,"enctype")==="multipart/form-data"}function ir(t,r,n){var i=null;w(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(nr(r)){return Yt(n)}else{return Kt(n)}}}function S(e){return{tasks:[],elts:[e]}}function ar(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=re(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=re(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:z.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:z.config.scrollBehavior})}}}function or(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=G(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=sr(e,function(){return Function("return ("+a+")")()},{})}else{s=y(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return or(u(e),t,r,n)}function sr(e,t,r){if(z.config.allowEval){return t()}else{ne(e,"htmx:evalDisallowedError");return r}}function lr(e,t){return or(e,"hx-vars",true,t)}function ur(e,t){return or(e,"hx-vals",false,t)}function fr(e){return te(lr(e),ur(e))}function cr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function hr(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){ne(J().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function E(e,t){return e.getAllResponseHeaders().match(t)}function dr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||A(r,"String")){return ae(e,t,null,null,{targetOverride:s(r),returnPromise:true})}else{return ae(e,t,s(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:s(r.target),swapOverride:r.swap,returnPromise:true})}}else{return ae(e,t,null,null,{returnPromise:true})}}function vr(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function ae(e,t,n,r,i,M){var a=null;var o=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var s=new Promise(function(e,t){a=e;o=t})}if(n==null){n=J().body}var D=i.handler||pr;if(!ee(n)){return}var l=i.targetOverride||de(n);if(l==null||l==fe){ne(n,"htmx:targetError",{target:G(n,"hx-target")});return}if(!M){var X=function(){return ae(e,t,n,r,i,true)};var F={target:l,elt:n,path:t,verb:e,triggeringEvent:r,etc:i,issueRequest:X};if(ie(n,"htmx:confirm",F)===false){return}}var u=n;var f=Y(n);var c=Z(n,"hx-sync");var h=null;var d=false;if(c){var v=c.split(":");var g=v[0].trim();if(g==="this"){u=he(n,"hx-sync")}else{u=re(n,g)}c=(v[1]||"drop").trim();f=Y(u);if(c==="drop"&&f.xhr&&f.abortable!==true){return}else if(c==="abort"){if(f.xhr){return}else{d=true}}else if(c==="replace"){ie(u,"htmx:abort")}else if(c.indexOf("queue")===0){var B=c.split(" ");h=(B[1]||"last").trim()}}if(f.xhr){if(f.abortable){ie(u,"htmx:abort")}else{if(h==null){if(r){var p=Y(r);if(p&&p.triggerSpec&&p.triggerSpec.queue){h=p.triggerSpec.queue}}if(h==null){h="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(h==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="all"){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){ae(e,t,n,r,i)})}return}}var m=new XMLHttpRequest;f.xhr=m;f.abortable=d;var x=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var y=Z(n,"hx-prompt");if(y){var b=prompt(y);if(b===null||!ie(n,"htmx:prompt",{prompt:b,target:l})){K(a);x();return s}}var w=Z(n,"hx-confirm");if(w){if(!confirm(w)){K(a);x();return s}}var S=Qt(n,l,b);if(i.headers){S=te(S,i.headers)}var E=Jt(n,e);var C=E.errors;var R=E.values;if(i.values){R=te(R,i.values)}var j=fr(n);var O=te(R,j);var q=er(O,n);if(e!=="get"&&!nr(n)){S["Content-Type"]="application/x-www-form-urlencoded"}if(z.config.getCacheBusterParam&&e==="get"){q["org.htmx.cache-buster"]=$(l,"id")||"true"}if(t==null||t===""){t=J().location.href}var T=or(n,"hx-request");var H=Y(n).boosted;var L={boosted:H,parameters:q,unfilteredParameters:O,headers:S,target:l,verb:e,errors:C,withCredentials:i.credentials||T.credentials||z.config.withCredentials,timeout:i.timeout||T.timeout||z.config.timeout,path:t,triggeringEvent:r};if(!ie(n,"htmx:configRequest",L)){K(a);x();return s}t=L.path;e=L.verb;S=L.headers;q=L.parameters;C=L.errors;if(C&&C.length>0){ie(n,"htmx:validation:halted",L);K(a);x();return s}var U=t.split("#");var V=U[0];var A=U[1];var N=null;if(e==="get"){N=V;var _=Object.keys(q).length!==0;if(_){if(N.indexOf("?")<0){N+="?"}else{N+="&"}N+=Kt(q);if(A){N+="#"+A}}m.open("GET",N,true)}else{m.open(e.toUpperCase(),t,true)}m.overrideMimeType("text/html");m.withCredentials=L.withCredentials;m.timeout=L.timeout;if(T.noHeaders){}else{for(var I in S){if(S.hasOwnProperty(I)){var W=S[I];cr(m,I,W)}}}var k={xhr:m,target:l,requestConfig:L,etc:i,boosted:H,pathInfo:{requestPath:t,finalRequestPath:N||t,anchor:A}};m.onload=function(){try{var e=vr(n);k.pathInfo.responsePath=hr(m);D(n,k);_t(P);ie(n,"htmx:afterRequest",k);ie(n,"htmx:afterOnLoad",k);if(!ee(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(ee(r)){t=r}}if(t){ie(t,"htmx:afterRequest",k);ie(t,"htmx:afterOnLoad",k)}}K(a);x()}catch(e){ne(n,"htmx:onLoadError",te({error:e},k));throw e}};m.onerror=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendError",k);K(o);x()};m.onabort=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendAbort",k);K(o);x()};m.ontimeout=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:timeout",k);K(o);x()};if(!ie(n,"htmx:beforeRequest",k)){K(a);x();return s}var P=Vt(n);Q(["loadstart","loadend","progress","abort"],function(t){Q([m,m.upload],function(e){e.addEventListener(t,function(e){ie(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ie(n,"htmx:beforeSend",k);m.send(e==="get"?null:ir(m,n,q));return s}function gr(e,t){var r=t.xhr;var n=null;var i=null;if(E(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(E(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(E(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=Z(e,"hx-push-url");var l=Z(e,"hx-replace-url");var u=Y(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function pr(s,l){var u=l.xhr;var f=l.target;var e=l.etc;if(!ie(s,"htmx:beforeOnLoad",l))return;if(E(u,/HX-Trigger:/i)){De(u,"HX-Trigger",s)}if(E(u,/HX-Location:/i)){Dt();var t=u.getResponseHeader("HX-Location");var c;if(t.indexOf("{")===0){c=y(t);t=c["path"];delete c["path"]}dr("GET",t,c).then(function(){Xt(t)});return}if(E(u,/HX-Redirect:/i)){location.href=u.getResponseHeader("HX-Redirect");return}if(E(u,/HX-Refresh:/i)){if("true"===u.getResponseHeader("HX-Refresh")){location.reload();return}}if(E(u,/HX-Retarget:/i)){l.target=J().querySelector(u.getResponseHeader("HX-Retarget"))}var h=gr(s,l);var r=u.status>=200&&u.status<400&&u.status!==204;var d=u.response;var n=u.status>=400;var i=te({shouldSwap:r,serverResponse:d,isError:n},l);if(!ie(f,"htmx:beforeSwap",i))return;f=i.target;d=i.serverResponse;n=i.isError;l.target=f;l.failed=n;l.successful=!n;if(i.shouldSwap){if(u.status===286){$e(s)}w(s,function(e){d=e.transformResponse(d,u,s)});if(h.type){Dt()}var a=e.swapOverride;if(E(u,/HX-Reswap:/i)){a=u.getResponseHeader("HX-Reswap")}var c=rr(s,a);f.classList.add(z.config.swappingClass);var v=null;var g=null;var o=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var n=S(f);Me(c.swapStyle,f,s,d,n);if(t.elt&&!ee(t.elt)&&t.elt.id){var r=document.getElementById(t.elt.id);var i={preventScroll:c.focusScroll!==undefined?!c.focusScroll:!z.config.defaultFocusScroll};if(r){if(t.start&&r.setSelectionRange){try{r.setSelectionRange(t.start,t.end)}catch(e){}}r.focus(i)}}f.classList.remove(z.config.swappingClass);Q(n.elts,function(e){if(e.classList){e.classList.add(z.config.settlingClass)}ie(e,"htmx:afterSwap",l)});if(E(u,/HX-Trigger-After-Swap:/i)){var a=s;if(!ee(s)){a=J().body}De(u,"HX-Trigger-After-Swap",a)}var o=function(){Q(n.tasks,function(e){e.call()});Q(n.elts,function(e){if(e.classList){e.classList.remove(z.config.settlingClass)}ie(e,"htmx:afterSettle",l)});if(h.type){if(h.type==="push"){Xt(h.path);ie(J().body,"htmx:pushedIntoHistory",{path:h.path})}else{Ft(h.path);ie(J().body,"htmx:replacedInHistory",{path:h.path})}}if(l.pathInfo.anchor){var e=b("#"+l.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title){var t=b("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}ar(n.elts,c);if(E(u,/HX-Trigger-After-Settle:/i)){var r=s;if(!ee(s)){r=J().body}De(u,"HX-Trigger-After-Settle",r)}K(v)};if(c.settleDelay>0){setTimeout(o,c.settleDelay)}else{o()}}catch(e){ne(s,"htmx:swapError",l);K(g);throw e}};var p=z.config.globalViewTransitions;if(c.hasOwnProperty("transition")){p=c.transition}if(p&&ie(s,"htmx:beforeTransition",l)&&typeof Promise!=="undefined"&&document.startViewTransition){var m=new Promise(function(e,t){v=e;g=t});var x=o;o=function(){document.startViewTransition(function(){x();return m})}}if(c.swapDelay>0){setTimeout(o,c.swapDelay)}else{o()}}if(n){ne(s,"htmx:responseError",te({error:"Response Status Error Code "+u.status+" from "+l.pathInfo.requestPath},l))}}var mr={};function xr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function yr(e,t){if(t.init){t.init(C)}mr[e]=te(xr(),t)}function br(e){delete mr[e]}function wr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=G(e,"hx-ext");if(t){Q(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=mr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return wr(u(e),r,n)}function Sr(e){if(J().readyState!=="loading"){e()}else{J().addEventListener("DOMContentLoaded",e)}}function Er(){if(z.config.includeIndicatorStyles!==false){J().head.insertAdjacentHTML("beforeend","")}}function Cr(){var e=J().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function Rr(){var e=Cr();if(e){z.config=te(z.config,e)}}Sr(function(){Rr();Er();var e=J().body;Tt(e);var t=J().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=Y(t);if(r&&r.xhr){r.xhr.abort()}});var r=window.onpopstate;window.onpopstate=function(e){if(e.state&&e.state.htmx){Ut();Q(t,function(e){ie(e,"htmx:restored",{document:J(),triggerEvent:ie})})}else{if(r){r(e)}}};setTimeout(function(){ie(e,"htmx:load",{});e=null},0)});return z}()}); \ No newline at end of file +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var z={onLoad:t,process:Tt,on:le,off:ue,trigger:ie,ajax:dr,find:b,findAll:f,closest:d,values:function(e,t){var r=Jt(e,t||"post");return r.values},remove:B,addClass:j,removeClass:n,toggleClass:U,takeClass:V,defineExtension:yr,removeExtension:br,logAll:F,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false},parseInterval:v,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=z.config.wsBinaryType;return t},version:"1.9.2"};var C={addTriggerHandler:xt,bodyContains:ee,canAccessLocalStorage:D,filterValues:er,hasAttribute:q,getAttributeValue:G,getClosestMatch:c,getExpressionVars:fr,getHeaders:Qt,getInputValues:Jt,getInternalData:Y,getSwapSpecification:rr,getTriggerSpecs:ze,getTarget:de,makeFragment:l,mergeObjects:te,makeSettleInfo:S,oobSwap:me,selectAndSwap:Me,settleImmediately:Bt,shouldCancel:Ke,triggerEvent:ie,triggerErrorEvent:ne,withExtensions:w};var R=["get","post","put","delete","patch"];var O=R.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function v(e){if(e==undefined){return undefined}if(e.slice(-2)=="ms"){return parseFloat(e.slice(0,-2))||undefined}if(e.slice(-1)=="s"){return parseFloat(e.slice(0,-1))*1e3||undefined}if(e.slice(-1)=="m"){return parseFloat(e.slice(0,-1))*1e3*60||undefined}return parseFloat(e)||undefined}function $(e,t){return e.getAttribute&&e.getAttribute(t)}function q(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function G(e,t){return $(e,t)||$(e,"data-"+t)}function u(e){return e.parentElement}function J(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function T(e,t,r){var n=G(t,r);var i=G(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function Z(t,r){var n=null;c(t,function(e){return n=T(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function H(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=J().createDocumentFragment()}return i}function L(e){return e.match(/",0);return r.querySelector("template").content}else{var n=H(e);switch(n){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i(""+e+"
",1);case"col":return i(""+e+"
",2);case"tr":return i(""+e+"
",2);case"td":case"th":return i(""+e+"
",3);case"script":return i("
"+e+"
",1);default:return i(e,0)}}}function K(e){if(e){e()}}function A(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function N(e){return A(e,"Function")}function I(e){return A(e,"Object")}function Y(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function k(e){var t=[];if(e){for(var r=0;r=0}function ee(e){if(e.getRootNode&&e.getRootNode()instanceof ShadowRoot){return J().body.contains(e.getRootNode().host)}else{return J().body.contains(e)}}function M(e){return e.trim().split(/\s+/)}function te(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){x(e);return null}}function D(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function X(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!t.match("^/$")){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function e(e){return sr(J().body,function(){return eval(e)})}function t(t){var e=z.on("htmx:load",function(e){t(e.detail.elt)});return e}function F(){z.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function b(e,t){if(t){return e.querySelector(t)}else{return b(J(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(J(),e)}}function B(e,t){e=s(e);if(t){setTimeout(function(){B(e);e=null},t)}else{e.parentElement.removeChild(e)}}function j(e,t,r){e=s(e);if(r){setTimeout(function(){j(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=s(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function U(e,t){e=s(e);e.classList.toggle(t)}function V(e,t){e=s(e);Q(e.parentElement.children,function(e){n(e,t)});j(e,t)}function d(e,t){e=s(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function r(e){var t=e.trim();if(t.startsWith("<")&&t.endsWith("/>")){return t.substring(1,t.length-2)}else{return t}}function _(e,t){if(t.indexOf("closest ")===0){return[d(e,r(t.substr(8)))]}else if(t.indexOf("find ")===0){return[b(e,r(t.substr(5)))]}else if(t.indexOf("next ")===0){return[W(e,r(t.substr(5)))]}else if(t.indexOf("previous ")===0){return[oe(e,r(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else{return J().querySelectorAll(r(t))}}var W=function(e,t){var r=J().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function re(e,t){if(t){return _(e,t)[0]}else{return _(J().body,e)[0]}}function s(e){if(A(e,"String")){return b(e)}else{return e}}function se(e,t,r){if(N(t)){return{target:J().body,event:e,listener:t}}else{return{target:s(e),event:t,listener:r}}}function le(t,r,n){Sr(function(){var e=se(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=N(r);return e?r:n}function ue(t,r,n){Sr(function(){var e=se(t,r,n);e.target.removeEventListener(e.event,e.listener)});return N(r)?r:n}var fe=J().createElement("output");function ce(e,t){var r=Z(e,t);if(r){if(r==="this"){return[he(e,t)]}else{var n=_(e,r);if(n.length===0){x('The selector "'+r+'" on '+t+" returned no matches!");return[fe]}else{return n}}}}function he(e,t){return c(e,function(e){return G(e,t)!=null})}function de(e){var t=Z(e,"hx-target");if(t){if(t==="this"){return he(e,"hx-target")}else{return re(e,t)}}else{var r=Y(e);if(r.boosted){return J().body}else{return e}}}function ve(e){var t=z.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=J().querySelectorAll(t);if(r){Q(r,function(e){var t;var r=i.cloneNode(true);t=J().createDocumentFragment();t.appendChild(r);if(!pe(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ie(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){ke(o,e,e,t,a)}Q(a.elts,function(e){ie(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);ne(J().body,"htmx:oobErrorNoTarget",{content:i})}return e}function xe(e,t,r){var n=Z(e,"hx-select-oob");if(n){var i=n.split(",");for(let e=0;e0){var t=e.id.replace("'","\\'");var r=e.tagName.replace(":","\\:");var n=a.querySelector(r+"[id='"+t+"']");if(n&&n!==a){var i=e.cloneNode();ge(e,n);o.tasks.push(function(){ge(e,i)})}}})}function we(e){return function(){n(e,z.config.addedClass);Tt(e);bt(e);Se(e);ie(e,"htmx:load")}}function Se(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){be(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;j(i,z.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(we(i))}}}function Ee(e,t){var r=0;while(r-1){var t=e.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,"");var r=t.match(/]*>|>)([\s\S]*?)<\/title>/im);if(r){return r[2]}}}function Me(e,t,r,n,i){i.title=Pe(n);var a=l(n);if(a){xe(r,a,i);a=Ie(r,a);ye(a);return ke(e,r,t,a,i)}}function De(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=y(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!I(o)){o={value:o}}ie(r,a,o)}}}else{ie(r,n,[])}}var Xe=/\s/;var g=/[\s,]/;var Fe=/[_$a-zA-Z]/;var Be=/[_$a-zA-Z0-9]/;var je=['"',"'","/"];var p=/[^\s]/;function Ue(e){var t=[];var r=0;while(r0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=sr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){ne(J().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Ve(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function m(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}var We="input, textarea, select";function ze(e){var t=G(e,"hx-trigger");var r=[];if(t){var n=Ue(t);do{m(n,p);var i=n.length;var a=m(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};m(n,p);o.pollInterval=v(m(n,/[,\[\s]/));m(n,p);var s=_e(e,n,"event");if(s){o.eventFilter=s}r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var l={trigger:a};var s=_e(e,n,"event");if(s){l.eventFilter=s}while(n.length>0&&n[0]!==","){m(n,p);var u=n.shift();if(u==="changed"){l.changed=true}else if(u==="once"){l.once=true}else if(u==="consume"){l.consume=true}else if(u==="delay"&&n[0]===":"){n.shift();l.delay=v(m(n,g))}else if(u==="from"&&n[0]===":"){n.shift();var f=m(n,g);if(f==="closest"||f==="find"||f==="next"||f==="previous"){n.shift();f+=" "+m(n,g)}l.from=f}else if(u==="target"&&n[0]===":"){n.shift();l.target=m(n,g)}else if(u==="throttle"&&n[0]===":"){n.shift();l.throttle=v(m(n,g))}else if(u==="queue"&&n[0]===":"){n.shift();l.queue=m(n,g)}else if((u==="root"||u==="threshold")&&n[0]===":"){n.shift();l[u]=m(n,g)}else{ne(e,"htmx:syntax:error",{token:n.shift()})}}r.push(l)}}if(n.length===i){ne(e,"htmx:syntax:error",{token:n.shift()})}m(n,p)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"]')){return[{trigger:"click"}]}else if(h(e,We)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function $e(e){Y(e).cancelled=true}function Ge(e,t,r){var n=Y(e);n.timeout=setTimeout(function(){if(ee(e)&&n.cancelled!==true){if(!Qe(r,Lt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}Ge(e,t,r)}},r.pollInterval)}function Je(e){return location.hostname===e.hostname&&$(e,"href")&&$(e,"href").indexOf("#")!==0}function Ze(t,r,e){if(t.tagName==="A"&&Je(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=t.href}else{var a=$(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=$(t,"action")}e.forEach(function(e){et(t,function(e,t){ae(n,i,e,t)},r,e,true)})}}function Ke(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&d(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function Ye(e,t){return Y(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function Qe(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){ne(J().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function et(i,a,e,o,s){var l=Y(i);var t;if(o.from){t=_(i,o.from)}else{t=[i]}if(o.changed){l.lastValue=i.value}Q(t,function(r){var n=function(e){if(!ee(i)){r.removeEventListener(o.trigger,n);return}if(Ye(i,e)){return}if(s||Ke(e,i)){e.preventDefault()}if(Qe(o,e)){return}var t=Y(e);t.triggerSpec=o;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(i)<0){t.handledFor.push(i);if(o.consume){e.stopPropagation()}if(o.target&&e.target){if(!h(e.target,o.target)){return}}if(o.once){if(l.triggeredOnce){return}else{l.triggeredOnce=true}}if(o.changed){if(l.lastValue===i.value){return}else{l.lastValue=i.value}}if(l.delayed){clearTimeout(l.delayed)}if(l.throttle){return}if(o.throttle){if(!l.throttle){a(i,e);l.throttle=setTimeout(function(){l.throttle=null},o.throttle)}}else if(o.delay){l.delayed=setTimeout(function(){a(i,e)},o.delay)}else{ie(i,"htmx:trigger");a(i,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:o.trigger,listener:n,on:r});r.addEventListener(o.trigger,n)})}var tt=false;var rt=null;function nt(){if(!rt){rt=function(){tt=true};window.addEventListener("scroll",rt);setInterval(function(){if(tt){tt=false;Q(J().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){it(e)})}},200)}}function it(t){if(!q(t,"data-hx-revealed")&&P(t)){t.setAttribute("data-hx-revealed","true");var e=Y(t);if(e.initHash){ie(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ie(t,"revealed")},{once:true})}}}function at(e,t,r){var n=M(r);for(var i=0;i=0){var t=ut(n);setTimeout(function(){ot(s,r,n+1)},t)}};t.onopen=function(e){n=0};Y(s).webSocket=t;t.addEventListener("message",function(e){if(st(s)){return}var t=e.data;w(s,function(e){t=e.transformResponse(t,null,s)});var r=S(s);var n=l(t);var i=k(n.children);for(var a=0;a0){ie(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(Ke(e,u)){e.preventDefault()}})}else{ne(u,"htmx:noWebSocketSourceError")}}function ut(e){var t=z.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}x('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function ft(e,t,r){var n=M(r);for(var i=0;i0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Ct(o)}for(var l in r){Rt(e,l,r[l])}}}function qt(t){if(t.closest&&t.closest(z.config.disableSelector)){return}var r=Y(t);if(r.initHash!==Ce(t)){r.initHash=Ce(t);Re(t);Ot(t);ie(t,"htmx:beforeProcessNode");if(t.value){r.lastValue=t.value}var e=ze(t);var n=mt(t,r,e);if(!n){if(Z(t,"hx-boost")==="true"){Ze(t,r,e)}else if(q(t,"hx-trigger")){e.forEach(function(e){xt(t,e,r,function(){})})}}if(t.tagName==="FORM"){Et(t)}var i=G(t,"hx-sse");if(i){ft(t,r,i)}var a=G(t,"hx-ws");if(a){at(t,r,a)}ie(t,"htmx:afterProcessNode")}}function Tt(e){e=s(e);qt(e);Q(St(e),function(e){qt(e)})}function Ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Lt(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=J().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function ne(e,t,r){ie(e,t,te({error:t},r))}function At(e){return e==="htmx:afterProcessNode"}function w(e,t){Q(wr(e),function(e){try{t(e)}catch(e){x(e)}})}function x(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function ie(e,t,r){e=s(e);if(r==null){r={}}r["elt"]=e;var n=Lt(t,r);if(z.logger&&!At(t)){z.logger(e,t,r)}if(r.error){x(r.error);ie(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=Ht(t);if(i&&a!==t){var o=Lt(a,n.detail);i=i&&e.dispatchEvent(o)}w(e,function(e){i=i&&e.onEvent(t,n)!==false});return i}var Nt=location.pathname+location.search;function It(){var e=J().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||J().body}function kt(e,t,r,n){if(!D()){return}e=X(e);var i=y(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;az.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){ne(J().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Pt(e){if(!D()){return null}e=X(e);var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ie(J().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=It();var r=S(t);var n=Pe(this.response);if(n){var i=b("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ne(t,e,r);Bt(r.tasks);Nt=a;ie(J().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{ne(J().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function Ut(e){Dt();e=e||location.pathname+location.search;var t=Pt(e);if(t){var r=l(t.content);var n=It();var i=S(n);Ne(n,r,i);Bt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Nt=e;ie(J().body,"htmx:historyRestore",{path:e,item:t})}else{if(z.config.refreshOnHistoryMiss){window.location.reload(true)}else{jt(e)}}}function Vt(e){var t=ce(e,"hx-indicator");if(t==null){t=[e]}Q(t,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,z.config.requestClass)});return t}function _t(e){Q(e,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,z.config.requestClass)}})}function Wt(e,t){for(var r=0;r=0}function rr(e,t){var r=t?t:Z(e,"hx-swap");var n={swapStyle:Y(e).boosted?"innerHTML":z.config.defaultSwapStyle,swapDelay:z.config.defaultSwapDelay,settleDelay:z.config.defaultSettleDelay};if(Y(e).boosted&&!tr(e)){n["show"]="top"}if(r){var i=M(r);if(i.length>0){n["swapStyle"]=i[0];for(var a=1;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}if(o.indexOf("focus-scroll:")===0){var d=o.substr("focus-scroll:".length);n["focusScroll"]=d=="true"}}}}return n}function nr(e){return Z(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&$(e,"enctype")==="multipart/form-data"}function ir(t,r,n){var i=null;w(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(nr(r)){return Yt(n)}else{return Kt(n)}}}function S(e){return{tasks:[],elts:[e]}}function ar(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=re(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=re(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:z.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:z.config.scrollBehavior})}}}function or(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=G(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=sr(e,function(){return Function("return ("+a+")")()},{})}else{s=y(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return or(u(e),t,r,n)}function sr(e,t,r){if(z.config.allowEval){return t()}else{ne(e,"htmx:evalDisallowedError");return r}}function lr(e,t){return or(e,"hx-vars",true,t)}function ur(e,t){return or(e,"hx-vals",false,t)}function fr(e){return te(lr(e),ur(e))}function cr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function hr(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){ne(J().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function E(e,t){return e.getAllResponseHeaders().match(t)}function dr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||A(r,"String")){return ae(e,t,null,null,{targetOverride:s(r),returnPromise:true})}else{return ae(e,t,s(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:s(r.target),swapOverride:r.swap,returnPromise:true})}}else{return ae(e,t,null,null,{returnPromise:true})}}function vr(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function ae(e,t,n,r,i,M){var a=null;var o=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var s=new Promise(function(e,t){a=e;o=t})}if(n==null){n=J().body}var D=i.handler||pr;if(!ee(n)){return}var l=i.targetOverride||de(n);if(l==null||l==fe){ne(n,"htmx:targetError",{target:G(n,"hx-target")});return}if(!M){var X=function(){return ae(e,t,n,r,i,true)};var F={target:l,elt:n,path:t,verb:e,triggeringEvent:r,etc:i,issueRequest:X};if(ie(n,"htmx:confirm",F)===false){return}}var u=n;var f=Y(n);var c=Z(n,"hx-sync");var h=null;var d=false;if(c){var v=c.split(":");var g=v[0].trim();if(g==="this"){u=he(n,"hx-sync")}else{u=re(n,g)}c=(v[1]||"drop").trim();f=Y(u);if(c==="drop"&&f.xhr&&f.abortable!==true){return}else if(c==="abort"){if(f.xhr){return}else{d=true}}else if(c==="replace"){ie(u,"htmx:abort")}else if(c.indexOf("queue")===0){var B=c.split(" ");h=(B[1]||"last").trim()}}if(f.xhr){if(f.abortable){ie(u,"htmx:abort")}else{if(h==null){if(r){var p=Y(r);if(p&&p.triggerSpec&&p.triggerSpec.queue){h=p.triggerSpec.queue}}if(h==null){h="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(h==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="all"){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){ae(e,t,n,r,i)})}return}}var m=new XMLHttpRequest;f.xhr=m;f.abortable=d;var x=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var y=Z(n,"hx-prompt");if(y){var b=prompt(y);if(b===null||!ie(n,"htmx:prompt",{prompt:b,target:l})){K(a);x();return s}}var w=Z(n,"hx-confirm");if(w){if(!confirm(w)){K(a);x();return s}}var S=Qt(n,l,b);if(i.headers){S=te(S,i.headers)}var E=Jt(n,e);var C=E.errors;var R=E.values;if(i.values){R=te(R,i.values)}var j=fr(n);var O=te(R,j);var q=er(O,n);if(e!=="get"&&!nr(n)){S["Content-Type"]="application/x-www-form-urlencoded"}if(z.config.getCacheBusterParam&&e==="get"){q["org.htmx.cache-buster"]=$(l,"id")||"true"}if(t==null||t===""){t=J().location.href}var T=or(n,"hx-request");var H=Y(n).boosted;var L={boosted:H,parameters:q,unfilteredParameters:O,headers:S,target:l,verb:e,errors:C,withCredentials:i.credentials||T.credentials||z.config.withCredentials,timeout:i.timeout||T.timeout||z.config.timeout,path:t,triggeringEvent:r};if(!ie(n,"htmx:configRequest",L)){K(a);x();return s}t=L.path;e=L.verb;S=L.headers;q=L.parameters;C=L.errors;if(C&&C.length>0){ie(n,"htmx:validation:halted",L);K(a);x();return s}var U=t.split("#");var V=U[0];var A=U[1];var N=null;if(e==="get"){N=V;var _=Object.keys(q).length!==0;if(_){if(N.indexOf("?")<0){N+="?"}else{N+="&"}N+=Kt(q);if(A){N+="#"+A}}m.open("GET",N,true)}else{m.open(e.toUpperCase(),t,true)}m.overrideMimeType("text/html");m.withCredentials=L.withCredentials;m.timeout=L.timeout;if(T.noHeaders){}else{for(var I in S){if(S.hasOwnProperty(I)){var W=S[I];cr(m,I,W)}}}var k={xhr:m,target:l,requestConfig:L,etc:i,boosted:H,pathInfo:{requestPath:t,finalRequestPath:N||t,anchor:A}};m.onload=function(){try{var e=vr(n);k.pathInfo.responsePath=hr(m);D(n,k);_t(P);ie(n,"htmx:afterRequest",k);ie(n,"htmx:afterOnLoad",k);if(!ee(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(ee(r)){t=r}}if(t){ie(t,"htmx:afterRequest",k);ie(t,"htmx:afterOnLoad",k)}}K(a);x()}catch(e){ne(n,"htmx:onLoadError",te({error:e},k));throw e}};m.onerror=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendError",k);K(o);x()};m.onabort=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendAbort",k);K(o);x()};m.ontimeout=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:timeout",k);K(o);x()};if(!ie(n,"htmx:beforeRequest",k)){K(a);x();return s}var P=Vt(n);Q(["loadstart","loadend","progress","abort"],function(t){Q([m,m.upload],function(e){e.addEventListener(t,function(e){ie(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ie(n,"htmx:beforeSend",k);m.send(e==="get"?null:ir(m,n,q));return s}function gr(e,t){var r=t.xhr;var n=null;var i=null;if(E(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(E(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(E(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=Z(e,"hx-push-url");var l=Z(e,"hx-replace-url");var u=Y(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function pr(s,l){var u=l.xhr;var f=l.target;var e=l.etc;if(!ie(s,"htmx:beforeOnLoad",l))return;if(E(u,/HX-Trigger:/i)){De(u,"HX-Trigger",s)}if(E(u,/HX-Location:/i)){Dt();var t=u.getResponseHeader("HX-Location");var c;if(t.indexOf("{")===0){c=y(t);t=c["path"];delete c["path"]}dr("GET",t,c).then(function(){Xt(t)});return}if(E(u,/HX-Redirect:/i)){location.href=u.getResponseHeader("HX-Redirect");return}if(E(u,/HX-Refresh:/i)){if("true"===u.getResponseHeader("HX-Refresh")){location.reload();return}}if(E(u,/HX-Retarget:/i)){l.target=J().querySelector(u.getResponseHeader("HX-Retarget"))}var h=gr(s,l);var r=u.status>=200&&u.status<400&&u.status!==204;var d=u.response;var n=u.status>=400;var i=te({shouldSwap:r,serverResponse:d,isError:n},l);if(!ie(f,"htmx:beforeSwap",i))return;f=i.target;d=i.serverResponse;n=i.isError;l.target=f;l.failed=n;l.successful=!n;if(i.shouldSwap){if(u.status===286){$e(s)}w(s,function(e){d=e.transformResponse(d,u,s)});if(h.type){Dt()}var a=e.swapOverride;if(E(u,/HX-Reswap:/i)){a=u.getResponseHeader("HX-Reswap")}var c=rr(s,a);f.classList.add(z.config.swappingClass);var v=null;var g=null;var o=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var n=S(f);Me(c.swapStyle,f,s,d,n);if(t.elt&&!ee(t.elt)&&t.elt.id){var r=document.getElementById(t.elt.id);var i={preventScroll:c.focusScroll!==undefined?!c.focusScroll:!z.config.defaultFocusScroll};if(r){if(t.start&&r.setSelectionRange){try{r.setSelectionRange(t.start,t.end)}catch(e){}}r.focus(i)}}f.classList.remove(z.config.swappingClass);Q(n.elts,function(e){if(e.classList){e.classList.add(z.config.settlingClass)}ie(e,"htmx:afterSwap",l)});if(E(u,/HX-Trigger-After-Swap:/i)){var a=s;if(!ee(s)){a=J().body}De(u,"HX-Trigger-After-Swap",a)}var o=function(){Q(n.tasks,function(e){e.call()});Q(n.elts,function(e){if(e.classList){e.classList.remove(z.config.settlingClass)}ie(e,"htmx:afterSettle",l)});if(h.type){if(h.type==="push"){Xt(h.path);ie(J().body,"htmx:pushedIntoHistory",{path:h.path})}else{Ft(h.path);ie(J().body,"htmx:replacedInHistory",{path:h.path})}}if(l.pathInfo.anchor){var e=b("#"+l.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title){var t=b("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}ar(n.elts,c);if(E(u,/HX-Trigger-After-Settle:/i)){var r=s;if(!ee(s)){r=J().body}De(u,"HX-Trigger-After-Settle",r)}K(v)};if(c.settleDelay>0){setTimeout(o,c.settleDelay)}else{o()}}catch(e){ne(s,"htmx:swapError",l);K(g);throw e}};var p=z.config.globalViewTransitions;if(c.hasOwnProperty("transition")){p=c.transition}if(p&&ie(s,"htmx:beforeTransition",l)&&typeof Promise!=="undefined"&&document.startViewTransition){var m=new Promise(function(e,t){v=e;g=t});var x=o;o=function(){document.startViewTransition(function(){x();return m})}}if(c.swapDelay>0){setTimeout(o,c.swapDelay)}else{o()}}if(n){ne(s,"htmx:responseError",te({error:"Response Status Error Code "+u.status+" from "+l.pathInfo.requestPath},l))}}var mr={};function xr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function yr(e,t){if(t.init){t.init(C)}mr[e]=te(xr(),t)}function br(e){delete mr[e]}function wr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=G(e,"hx-ext");if(t){Q(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=mr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return wr(u(e),r,n)}function Sr(e){if(J().readyState!=="loading"){e()}else{J().addEventListener("DOMContentLoaded",e)}}function Er(){if(z.config.includeIndicatorStyles!==false){J().head.insertAdjacentHTML("beforeend","")}}function Cr(){var e=J().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function Rr(){var e=Cr();if(e){z.config=te(z.config,e)}}Sr(function(){Rr();Er();var e=J().body;Tt(e);var t=J().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=Y(t);if(r&&r.xhr){r.xhr.abort()}});var r=window.onpopstate;window.onpopstate=function(e){if(e.state&&e.state.htmx){Ut();Q(t,function(e){ie(e,"htmx:restored",{document:J(),triggerEvent:ie})})}else{if(r){r(e)}}};setTimeout(function(){ie(e,"htmx:load",{});e=null},0)});return z}()}); \ No newline at end of file diff --git a/dist/htmx.min.js.gz b/dist/htmx.min.js.gz index ed83224e8..0221f592e 100644 Binary files a/dist/htmx.min.js.gz and b/dist/htmx.min.js.gz differ diff --git a/www/static/test/1.9.2/node_modules/chai-dom/chai-dom.js b/www/static/test/1.9.2/node_modules/chai-dom/chai-dom.js new file mode 100644 index 000000000..23a3d31df --- /dev/null +++ b/www/static/test/1.9.2/node_modules/chai-dom/chai-dom.js @@ -0,0 +1,429 @@ +(function(chaiDom) { + if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') { + module.exports = chaiDom + } else if (typeof define === 'function' && define.amd) { + define(function() { + return chaiDom + }) + } else { + chai.use(chaiDom) + } +}(function(chai, utils) { + var flag = utils.flag, + + elToString = function(el) { + var desc + if (isNodeList(el)) { + if (el.length === 0) { + return 'empty NodeList' + } + + desc = Array.prototype.slice.call(el, 0, 5).map(elToString).join(', ') + return el.length > 5 ? desc + '... (+' + (el.length - 5) + ' more)' : desc + } + if (!isHTMLElement(el)) { + return String(el) + } + + desc = el.tagName.toLowerCase() + if (el.id) { + desc += '#' + el.id + } + if (el.className) { + desc += '.' + String(el.className).replace(/\s+/g, '.') + } + Array.prototype.forEach.call(el.attributes, function(attr) { + if (attr.name !== 'class' && attr.name !== 'id') { + desc += '[' + attr.name + (attr.value ? '="' + attr.value + '"]' : ']') + } + }) + return desc + }, + + attrAssert = function(name, val) { + var el = flag(this, 'object'), actual = el.getAttribute(name) + + if (!flag(this, 'negate') || undefined === val) { + this.assert( + !!el.attributes[name] + , 'expected ' + elToString(el) + ' to have an attribute #{exp}' + , 'expected ' + elToString(el) + ' not to have an attribute #{exp}' + , name + ) + } + + if (undefined !== val) { + this.assert( + val === actual + , 'expected ' + elToString(el) + ' to have an attribute ' + utils.inspect(name) + ' with the value #{exp}, but the value was #{act}' + , 'expected ' + elToString(el) + ' not to have an attribute ' + utils.inspect(name) + ' with the value #{act}' + , val + , actual + ) + } + + flag(this, 'object', actual) + }, + + isHTMLElement = function(el) { + return el.nodeType === 1 // window.Node.ELEMENT_NODE + }, + + isNodeList = function(obj) { + return Object.prototype.toString.call(obj) === '[object NodeList]' + } + + utils.elToString = elToString + chai.Assertion.addMethod('attr', attrAssert) + chai.Assertion.addMethod('attribute', attrAssert) + + chai.Assertion.addMethod('class', function(className) { + var el = flag(this, 'object') + + if (className instanceof RegExp) { + return this.assert( + Array.from(el.classList).some(function(cls) { return className.test(cls) }) + , 'expected ' + elToString(el) + ' to have class matching #{exp}' + , 'expected ' + elToString(el) + ' not to have class matching #{exp}' + , className + ) + } + + this.assert( + el.classList.contains(className) + , 'expected ' + elToString(el) + ' to have class #{exp}' + , 'expected ' + elToString(el) + ' not to have class #{exp}' + , className + ) + }) + + chai.Assertion.addMethod('id', function(id) { + var el = flag(this, 'object') + this.assert( + el.id == id + , 'expected ' + elToString(el) + ' to have id #{exp}' + , 'expected ' + elToString(el) + ' not to have id #{exp}' + , id + ) + }) + + chai.Assertion.addMethod('html', function(html) { + var el = flag(this, 'object'), actual = flag(this, 'object').innerHTML + + if (flag(this, 'contains')) { + this.assert( + actual.indexOf(html) >= 0 + , 'expected #{act} to contain HTML #{exp}' + , 'expected #{act} not to contain HTML #{exp}' + , html + , actual + ) + } else { + this.assert( + actual === html + , 'expected ' + elToString(el) + ' to have HTML #{exp}, but the HTML was #{act}' + , 'expected ' + elToString(el) + ' not to have HTML #{exp}' + , html + , actual + ) + } + }) + + chai.Assertion.addChainableMethod('trimmed', null, function() { + flag(this, 'trim-text', true) + }) + + chai.Assertion.addProperty('rendered', function() { + flag(this, 'rendered-text', true) + }) + + chai.Assertion.addMethod('text', function(text) { + var obj = flag(this, 'object'), contains = flag(this, 'contains'), + trim = flag(this, 'trim-text'), actual, result + var property = flag(this, 'rendered-text') ? 'innerText' : 'textContent' + + if (isNodeList(obj)) { + actual = Array.prototype.map.call(obj, function(el) { return trim ? el[property].trim() : el[property] }) + if (Array.isArray(text)) { + result = contains ? + text[flag(this, 'negate') ? 'some' : 'every'](function(t) { + return Array.prototype.some.call(obj, function(el) { + return (trim ? el[property].trim() : el[property]) === t + }) + }) + : + utils.eql(actual, text) + + actual = actual.join() + text = text.join() + } else { + actual = actual.join('') + result = contains ? actual.indexOf(text) >= 0 : actual === text + } + } else { + actual = trim ? obj[property].trim() : obj[property] + result = contains ? actual.indexOf(text) >= 0 : actual === text + } + + var objDesc = elToString(obj) + var textMsg = '' + + if (trim) { + textMsg += 'trimmed ' + } + if (flag(this, 'rendered-text')) { + textMsg += 'rendered ' + } + textMsg += 'text' + + if (contains) { + this.assert( + result + , 'expected ' + objDesc + ' to contain #{exp}, but the ' + textMsg + ' was #{act}' + , 'expected ' + objDesc + ' not to contain #{exp}, but the ' + textMsg + ' was #{act}' + , text + , actual + ) + } else { + this.assert( + result + , 'expected ' + objDesc + ' to have ' + textMsg + ' #{exp}, but the ' + textMsg + ' was #{act}' + , 'expected ' + objDesc + ' not to have ' + textMsg + ' #{exp}' + , text + , actual + ) + } + }) + + chai.Assertion.addMethod('value', function(value) { + var el = flag(this, 'object'), actual = flag(this, 'object').value + this.assert( + flag(this, 'object').value === value + , 'expected ' + elToString(el) + ' to have value #{exp}, but the value was #{act}' + , 'expected ' + elToString(el) + ' not to have value #{exp}' + , value + , actual + ) + }) + + chai.Assertion.overwriteProperty('exist', function(_super) { + return function() { + var obj = flag(this, 'object') + if (isNodeList(obj)) { + this.assert( + obj.length > 0 + , 'expected an empty NodeList to have nodes' + , 'expected ' + elToString(obj) + ' to not exist') + } else { + _super.apply(this, arguments) + } + } + }) + + chai.Assertion.overwriteProperty('empty', function(_super) { + return function() { + var obj = flag(this, 'object') + if (isHTMLElement(obj)) { + this.assert( + obj.children.length === 0 + , 'expected ' + elToString(obj) + ' to be empty' + , 'expected ' + elToString(obj) + ' to not be empty') + } else if (isNodeList(obj)) { + this.assert( + obj.length === 0 + , 'expected ' + elToString(obj) + ' to be empty' + , 'expected ' + elToString(obj) + ' to not be empty') + } else { + _super.apply(this, arguments) + } + } + }) + + chai.Assertion.overwriteChainableMethod('length', + function(_super) { + return function(length) { + var obj = flag(this, 'object') + if (isNodeList(obj) || isHTMLElement(obj)) { + var actualLength = obj.children ? obj.children.length : obj.length + this.assert( + actualLength === length + , 'expected ' + elToString(obj) + ' to have #{exp} children but it had #{act} children' + , 'expected ' + elToString(obj) + ' to not have #{exp} children' + , length + , actualLength + ) + } else { + _super.apply(this, arguments) + } + } + }, + function(_super) { + return function() { + _super.call(this) + } + } + ) + + + chai.Assertion.overwriteMethod('match', function(_super) { + return function(selector) { + var obj = flag(this, 'object') + if (isHTMLElement(obj)) { + this.assert( + obj.matches(selector) + , 'expected ' + elToString(obj) + ' to match #{exp}' + , 'expected ' + elToString(obj) + ' to not match #{exp}' + , selector + ) + } else if (isNodeList(obj)) { + this.assert( + (!!obj.length && Array.prototype.every.call(obj, function(el) { return el.matches(selector) })) + , 'expected ' + elToString(obj) + ' to match #{exp}' + , 'expected ' + elToString(obj) + ' to not match #{exp}' + , selector + ) + } else { + _super.apply(this, arguments) + } + } + }) + + chai.Assertion.overwriteChainableMethod('contain', + function(_super) { + return function(subitem) { + var obj = flag(this, 'object') + if (isHTMLElement(obj)) { + if (typeof subitem === 'string') { + this.assert( + !!obj.querySelector(subitem) + , 'expected ' + elToString(obj) + ' to contain #{exp}' + , 'expected ' + elToString(obj) + ' to not contain #{exp}' + , subitem) + } else { + this.assert( + obj.contains(subitem) + , 'expected ' + elToString(obj) + ' to contain ' + elToString(subitem) + , 'expected ' + elToString(obj) + ' to not contain ' + elToString(subitem)) + } + } else { + _super.apply(this, arguments) + } + } + }, + function(_super) { + return function() { + _super.call(this) + } + } + ) + + chai.Assertion.addMethod('descendant', function(subitem) { + var obj = flag(this, 'object'), actual = subitem + + if (typeof subitem === 'string') { + actual = obj.querySelector(subitem) + this.assert( + !!actual + , 'expected ' + elToString(obj) + ' to have descendant #{exp}' + , 'expected ' + elToString(obj) + ' to not have descendant #{exp}' + , subitem) + } else { + this.assert( + obj.contains(subitem) + , 'expected ' + elToString(obj) + ' to contain ' + elToString(subitem) + , 'expected ' + elToString(obj) + ' to not contain ' + elToString(subitem)) + } + + flag(this, 'object', actual) + }) + + chai.Assertion.addMethod('descendants', function(selector) { + var obj = flag(this, 'object'), + actual = obj.querySelectorAll(selector) + this.assert( + !!actual.length + , 'expected ' + elToString(obj) + ' to have descendants #{exp}' + , 'expected ' + elToString(obj) + ' to not have descendants #{exp}' + , selector) + flag(this, 'object', actual) + }) + + chai.Assertion.addProperty('displayed', function() { + var el = flag(this, 'object'), + actual = document.body.contains(el) ? window.getComputedStyle(el).display : el.style.display + + this.assert( + actual !== 'none' + , 'expected ' + elToString(el) + ' to be displayed, but it was not' + , 'expected ' + elToString(el) + ' to not be displayed, but it was as ' + actual + , actual + ) + }) + + chai.Assertion.addProperty('visible', function() { + var el = flag(this, 'object'), + actual = document.body.contains(el) ? window.getComputedStyle(el).visibility : el.style.visibility + + this.assert( + actual !== 'hidden' && actual !== 'collapse' + , 'expected ' + elToString(el) + ' to be visible, but it was ' + (actual === 'hidden' ? 'hidden' : 'collapsed') + , 'expected ' + elToString(el) + ' to not be visible, but it was' + , actual + ) + }) + + chai.Assertion.addMethod('tagName', function(tagName) { + var el = flag(this, 'object'), + actual = el.tagName; + + this.assert( + actual.toUpperCase() === tagName.toUpperCase() + , 'expected ' + elToString(el) + ' to have tagName ' + tagName + ', but it was ' + actual + , 'expected ' + elToString(el) + ' to not have tagName ' + tagName + ', but it was ' + actual + , actual + ) + }) + + chai.Assertion.addMethod('style', function (styleProp, styleValue) { + var el = flag(this, 'object'), + style = window.getComputedStyle(el), + actual = style.getPropertyValue(styleProp).trim(); + + this.assert( + actual === styleValue + , 'expected ' + elToString(el) + ' to have style property ' + styleProp + ' equal to ' + styleValue + ', but it was equal to ' + actual + , 'expected ' + elToString(el) + ' to not have style property ' + styleProp + ' equal to ' + styleValue + ', but it was equal to ' + actual + , actual + ) + }) + + chai.Assertion.overwriteProperty('focus', function() { + return function () { + var el = flag(this, 'object'), actual = el.ownerDocument.activeElement + + this.assert( + el === el.ownerDocument.activeElement + , 'expected #{this} to have focus' + , 'expected #{this} not to have focus' + , el + , actual + ) + + } + }) + + chai.Assertion.overwriteProperty('checked', function() { + return function () { + var el = flag(this, 'object') + + if(!(el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio'))) { + throw new TypeError(elToString(el) + ' is not a checkbox or radio input'); + } + + this.assert( + el.checked + , 'expected ' + elToString(el) + ' to be checked' + , 'expected ' + elToString(el) + ' to not be checked') + } + }) +})); diff --git a/www/static/test/1.9.2/node_modules/chai/chai.js b/www/static/test/1.9.2/node_modules/chai/chai.js new file mode 100644 index 000000000..741f67582 --- /dev/null +++ b/www/static/test/1.9.2/node_modules/chai/chai.js @@ -0,0 +1,11495 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.chai = f()}})(function(){var define,module,exports;return (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 + * MIT Licensed + */ + +var used = []; + +/*! + * Chai version + */ + +exports.version = '4.3.3'; + +/*! + * Assertion Error + */ + +exports.AssertionError = require('assertion-error'); + +/*! + * Utils for plugins (not exported) + */ + +var util = require('./chai/utils'); + +/** + * # .use(function) + * + * Provides a way to extend the internals of Chai. + * + * @param {Function} + * @returns {this} for chaining + * @api public + */ + +exports.use = function (fn) { + if (!~used.indexOf(fn)) { + fn(exports, util); + used.push(fn); + } + + return exports; +}; + +/*! + * Utility Functions + */ + +exports.util = util; + +/*! + * Configuration + */ + +var config = require('./chai/config'); +exports.config = config; + +/*! + * Primary `Assertion` prototype + */ + +var assertion = require('./chai/assertion'); +exports.use(assertion); + +/*! + * Core Assertions + */ + +var core = require('./chai/core/assertions'); +exports.use(core); + +/*! + * Expect interface + */ + +var expect = require('./chai/interface/expect'); +exports.use(expect); + +/*! + * Should interface + */ + +var should = require('./chai/interface/should'); +exports.use(should); + +/*! + * Assert interface + */ + +var assert = require('./chai/interface/assert'); +exports.use(assert); + +},{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/interface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai/utils":22,"assertion-error":33}],3:[function(require,module,exports){ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +var config = require('./config'); + +module.exports = function (_chai, util) { + /*! + * Module dependencies. + */ + + var AssertionError = _chai.AssertionError + , flag = util.flag; + + /*! + * Module export. + */ + + _chai.Assertion = Assertion; + + /*! + * Assertion Constructor + * + * Creates object for chaining. + * + * `Assertion` objects contain metadata in the form of flags. Three flags can + * be assigned during instantiation by passing arguments to this constructor: + * + * - `object`: This flag contains the target of the assertion. For example, in + * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will + * contain `numKittens` so that the `equal` assertion can reference it when + * needed. + * + * - `message`: This flag contains an optional custom error message to be + * prepended to the error message that's generated by the assertion when it + * fails. + * + * - `ssfi`: This flag stands for "start stack function indicator". It + * contains a function reference that serves as the starting point for + * removing frames from the stack trace of the error that's created by the + * assertion when it fails. The goal is to provide a cleaner stack trace to + * end users by removing Chai's internal functions. Note that it only works + * in environments that support `Error.captureStackTrace`, and only when + * `Chai.config.includeStack` hasn't been set to `false`. + * + * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag + * should retain its current value, even as assertions are chained off of + * this object. This is usually set to `true` when creating a new assertion + * from within another assertion. It's also temporarily set to `true` before + * an overwritten assertion gets called by the overwriting assertion. + * + * @param {Mixed} obj target of the assertion + * @param {String} msg (optional) custom error message + * @param {Function} ssfi (optional) starting point for removing stack frames + * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked + * @api private + */ + + function Assertion (obj, msg, ssfi, lockSsfi) { + flag(this, 'ssfi', ssfi || Assertion); + flag(this, 'lockSsfi', lockSsfi); + flag(this, 'object', obj); + flag(this, 'message', msg); + + return util.proxify(this); + } + + Object.defineProperty(Assertion, 'includeStack', { + get: function() { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + return config.includeStack; + }, + set: function(value) { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + config.includeStack = value; + } + }); + + Object.defineProperty(Assertion, 'showDiff', { + get: function() { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + return config.showDiff; + }, + set: function(value) { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + config.showDiff = value; + } + }); + + Assertion.addProperty = function (name, fn) { + util.addProperty(this.prototype, name, fn); + }; + + Assertion.addMethod = function (name, fn) { + util.addMethod(this.prototype, name, fn); + }; + + Assertion.addChainableMethod = function (name, fn, chainingBehavior) { + util.addChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + Assertion.overwriteProperty = function (name, fn) { + util.overwriteProperty(this.prototype, name, fn); + }; + + Assertion.overwriteMethod = function (name, fn) { + util.overwriteMethod(this.prototype, name, fn); + }; + + Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { + util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + /** + * ### .assert(expression, message, negateMessage, expected, actual, showDiff) + * + * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. + * + * @name assert + * @param {Philosophical} expression to be tested + * @param {String|Function} message or function that returns message to display if expression fails + * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails + * @param {Mixed} expected value (remember to check for negation) + * @param {Mixed} actual (optional) will default to `this.obj` + * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails + * @api private + */ + + Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { + var ok = util.test(this, arguments); + if (false !== showDiff) showDiff = true; + if (undefined === expected && undefined === _actual) showDiff = false; + if (true !== config.showDiff) showDiff = false; + + if (!ok) { + msg = util.getMessage(this, arguments); + var actual = util.getActual(this, arguments); + var assertionErrorObjectProperties = { + actual: actual + , expected: expected + , showDiff: showDiff + }; + + var operator = util.getOperator(this, arguments); + if (operator) { + assertionErrorObjectProperties.operator = operator; + } + + throw new AssertionError( + msg, + assertionErrorObjectProperties, + (config.includeStack) ? this.assert : flag(this, 'ssfi')); + } + }; + + /*! + * ### ._obj + * + * Quick reference to stored `actual` value for plugin developers. + * + * @api private + */ + + Object.defineProperty(Assertion.prototype, '_obj', + { get: function () { + return flag(this, 'object'); + } + , set: function (val) { + flag(this, 'object', val); + } + }); +}; + +},{"./config":4}],4:[function(require,module,exports){ +module.exports = { + + /** + * ### config.includeStack + * + * User configurable property, influences whether stack trace + * is included in Assertion error message. Default of false + * suppresses stack trace in the error message. + * + * chai.config.includeStack = true; // enable stack on error + * + * @param {Boolean} + * @api public + */ + + includeStack: false, + + /** + * ### config.showDiff + * + * User configurable property, influences whether or not + * the `showDiff` flag should be included in the thrown + * AssertionErrors. `false` will always be `false`; `true` + * will be true when the assertion has requested a diff + * be shown. + * + * @param {Boolean} + * @api public + */ + + showDiff: true, + + /** + * ### config.truncateThreshold + * + * User configurable property, sets length threshold for actual and + * expected values in assertion errors. If this threshold is exceeded, for + * example for large data structures, the value is replaced with something + * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. + * + * Set it to zero if you want to disable truncating altogether. + * + * This is especially userful when doing assertions on arrays: having this + * set to a reasonable large value makes the failure messages readily + * inspectable. + * + * chai.config.truncateThreshold = 0; // disable truncating + * + * @param {Number} + * @api public + */ + + truncateThreshold: 40, + + /** + * ### config.useProxy + * + * User configurable property, defines if chai will use a Proxy to throw + * an error when a non-existent property is read, which protects users + * from typos when using property-based assertions. + * + * Set it to false if you want to disable this feature. + * + * chai.config.useProxy = false; // disable use of Proxy + * + * This feature is automatically disabled regardless of this config value + * in environments that don't support proxies. + * + * @param {Boolean} + * @api public + */ + + useProxy: true, + + /** + * ### config.proxyExcludedKeys + * + * User configurable property, defines which properties should be ignored + * instead of throwing an error if they do not exist on the assertion. + * This is only applied if the environment Chai is running in supports proxies and + * if the `useProxy` configuration setting is enabled. + * By default, `then` and `inspect` will not throw an error if they do not exist on the + * assertion object because the `.inspect` property is read by `util.inspect` (for example, when + * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking. + * + * // By default these keys will not throw an error if they do not exist on the assertion object + * chai.config.proxyExcludedKeys = ['then', 'inspect']; + * + * @param {Array} + * @api public + */ + + proxyExcludedKeys: ['then', 'catch', 'inspect', 'toJSON'] +}; + +},{}],5:[function(require,module,exports){ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, _) { + var Assertion = chai.Assertion + , AssertionError = chai.AssertionError + , flag = _.flag; + + /** + * ### Language Chains + * + * The following are provided as chainable getters to improve the readability + * of your assertions. + * + * **Chains** + * + * - to + * - be + * - been + * - is + * - that + * - which + * - and + * - has + * - have + * - with + * - at + * - of + * - same + * - but + * - does + * - still + * - also + * + * @name language chains + * @namespace BDD + * @api public + */ + + [ 'to', 'be', 'been', 'is' + , 'and', 'has', 'have', 'with' + , 'that', 'which', 'at', 'of' + , 'same', 'but', 'does', 'still', "also" ].forEach(function (chain) { + Assertion.addProperty(chain); + }); + + /** + * ### .not + * + * Negates all assertions that follow in the chain. + * + * expect(function () {}).to.not.throw(); + * expect({a: 1}).to.not.have.property('b'); + * expect([1, 2]).to.be.an('array').that.does.not.include(3); + * + * Just because you can negate any assertion with `.not` doesn't mean you + * should. With great power comes great responsibility. It's often best to + * assert that the one expected output was produced, rather than asserting + * that one of countless unexpected outputs wasn't produced. See individual + * assertions for specific guidance. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.equal(1); // Not recommended + * + * @name not + * @namespace BDD + * @api public + */ + + Assertion.addProperty('not', function () { + flag(this, 'negate', true); + }); + + /** + * ### .deep + * + * Causes all `.equal`, `.include`, `.members`, `.keys`, and `.property` + * assertions that follow in the chain to use deep equality instead of strict + * (`===`) equality. See the `deep-eql` project page for info on the deep + * equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) equals `{a: 1}` + * expect({a: 1}).to.deep.equal({a: 1}); + * expect({a: 1}).to.not.equal({a: 1}); + * + * // Target array deeply (but not strictly) includes `{a: 1}` + * expect([{a: 1}]).to.deep.include({a: 1}); + * expect([{a: 1}]).to.not.include({a: 1}); + * + * // Target object deeply (but not strictly) includes `x: {a: 1}` + * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); + * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); + * + * // Target array deeply (but not strictly) has member `{a: 1}` + * expect([{a: 1}]).to.have.deep.members([{a: 1}]); + * expect([{a: 1}]).to.not.have.members([{a: 1}]); + * + * // Target set deeply (but not strictly) has key `{a: 1}` + * expect(new Set([{a: 1}])).to.have.deep.keys([{a: 1}]); + * expect(new Set([{a: 1}])).to.not.have.keys([{a: 1}]); + * + * // Target object deeply (but not strictly) has property `x: {a: 1}` + * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); + * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); + * + * @name deep + * @namespace BDD + * @api public + */ + + Assertion.addProperty('deep', function () { + flag(this, 'deep', true); + }); + + /** + * ### .nested + * + * Enables dot- and bracket-notation in all `.property` and `.include` + * assertions that follow in the chain. + * + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); + * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); + * expect({'.a': {'[b]': 'x'}}).to.nested.include({'\\.a.\\[b\\]': 'x'}); + * + * `.nested` cannot be combined with `.own`. + * + * @name nested + * @namespace BDD + * @api public + */ + + Assertion.addProperty('nested', function () { + flag(this, 'nested', true); + }); + + /** + * ### .own + * + * Causes all `.property` and `.include` assertions that follow in the chain + * to ignore inherited properties. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.have.own.property('a'); + * expect({a: 1}).to.have.property('b'); + * expect({a: 1}).to.not.have.own.property('b'); + * + * expect({a: 1}).to.own.include({a: 1}); + * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); + * + * `.own` cannot be combined with `.nested`. + * + * @name own + * @namespace BDD + * @api public + */ + + Assertion.addProperty('own', function () { + flag(this, 'own', true); + }); + + /** + * ### .ordered + * + * Causes all `.members` assertions that follow in the chain to require that + * members be in the same order. + * + * expect([1, 2]).to.have.ordered.members([1, 2]) + * .but.not.have.ordered.members([2, 1]); + * + * When `.include` and `.ordered` are combined, the ordering begins at the + * start of both arrays. + * + * expect([1, 2, 3]).to.include.ordered.members([1, 2]) + * .but.not.include.ordered.members([2, 3]); + * + * @name ordered + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ordered', function () { + flag(this, 'ordered', true); + }); + + /** + * ### .any + * + * Causes all `.keys` assertions that follow in the chain to only require that + * the target have at least one of the given keys. This is the opposite of + * `.all`, which requires that the target have all of the given keys. + * + * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); + * + * See the `.keys` doc for guidance on when to use `.any` or `.all`. + * + * @name any + * @namespace BDD + * @api public + */ + + Assertion.addProperty('any', function () { + flag(this, 'any', true); + flag(this, 'all', false); + }); + + /** + * ### .all + * + * Causes all `.keys` assertions that follow in the chain to require that the + * target have all of the given keys. This is the opposite of `.any`, which + * only requires that the target have at least one of the given keys. + * + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * + * Note that `.all` is used by default when neither `.all` nor `.any` are + * added earlier in the chain. However, it's often best to add `.all` anyway + * because it improves readability. + * + * See the `.keys` doc for guidance on when to use `.any` or `.all`. + * + * @name all + * @namespace BDD + * @api public + */ + + Assertion.addProperty('all', function () { + flag(this, 'all', true); + flag(this, 'any', false); + }); + + /** + * ### .a(type[, msg]) + * + * Asserts that the target's type is equal to the given string `type`. Types + * are case insensitive. See the `type-detect` project page for info on the + * type detection algorithm: https://github.com/chaijs/type-detect. + * + * expect('foo').to.be.a('string'); + * expect({a: 1}).to.be.an('object'); + * expect(null).to.be.a('null'); + * expect(undefined).to.be.an('undefined'); + * expect(new Error).to.be.an('error'); + * expect(Promise.resolve()).to.be.a('promise'); + * expect(new Float32Array).to.be.a('float32array'); + * expect(Symbol()).to.be.a('symbol'); + * + * `.a` supports objects that have a custom type set via `Symbol.toStringTag`. + * + * var myObj = { + * [Symbol.toStringTag]: 'myCustomType' + * }; + * + * expect(myObj).to.be.a('myCustomType').but.not.an('object'); + * + * It's often best to use `.a` to check a target's type before making more + * assertions on the same target. That way, you avoid unexpected behavior from + * any assertion that does different things based on the target's type. + * + * expect([1, 2, 3]).to.be.an('array').that.includes(2); + * expect([]).to.be.an('array').that.is.empty; + * + * Add `.not` earlier in the chain to negate `.a`. However, it's often best to + * assert that the target is the expected type, rather than asserting that it + * isn't one of many unexpected types. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.an('array'); // Not recommended + * + * `.a` accepts an optional `msg` argument which is a custom error message to + * show when the assertion fails. The message can also be given as the second + * argument to `expect`. + * + * expect(1).to.be.a('string', 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.a('string'); + * + * `.a` can also be used as a language chain to improve the readability of + * your assertions. + * + * expect({b: 2}).to.have.a.property('b'); + * + * The alias `.an` can be used interchangeably with `.a`. + * + * @name a + * @alias an + * @param {String} type + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function an (type, msg) { + if (msg) flag(this, 'message', msg); + type = type.toLowerCase(); + var obj = flag(this, 'object') + , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; + + this.assert( + type === _.type(obj).toLowerCase() + , 'expected #{this} to be ' + article + type + , 'expected #{this} not to be ' + article + type + ); + } + + Assertion.addChainableMethod('an', an); + Assertion.addChainableMethod('a', an); + + /** + * ### .include(val[, msg]) + * + * When the target is a string, `.include` asserts that the given string `val` + * is a substring of the target. + * + * expect('foobar').to.include('foo'); + * + * When the target is an array, `.include` asserts that the given `val` is a + * member of the target. + * + * expect([1, 2, 3]).to.include(2); + * + * When the target is an object, `.include` asserts that the given object + * `val`'s properties are a subset of the target's properties. + * + * expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2}); + * + * When the target is a Set or WeakSet, `.include` asserts that the given `val` is a + * member of the target. SameValueZero equality algorithm is used. + * + * expect(new Set([1, 2])).to.include(2); + * + * When the target is a Map, `.include` asserts that the given `val` is one of + * the values of the target. SameValueZero equality algorithm is used. + * + * expect(new Map([['a', 1], ['b', 2]])).to.include(2); + * + * Because `.include` does different things based on the target's type, it's + * important to check the target's type before using `.include`. See the `.a` + * doc for info on testing a target's type. + * + * expect([1, 2, 3]).to.be.an('array').that.includes(2); + * + * By default, strict (`===`) equality is used to compare array members and + * object properties. Add `.deep` earlier in the chain to use deep equality + * instead (WeakSet targets are not supported). See the `deep-eql` project + * page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target array deeply (but not strictly) includes `{a: 1}` + * expect([{a: 1}]).to.deep.include({a: 1}); + * expect([{a: 1}]).to.not.include({a: 1}); + * + * // Target object deeply (but not strictly) includes `x: {a: 1}` + * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); + * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); + * + * By default, all of the target's properties are searched when working with + * objects. This includes properties that are inherited and/or non-enumerable. + * Add `.own` earlier in the chain to exclude the target's inherited + * properties from the search. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.own.include({a: 1}); + * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); + * + * Note that a target object is always only searched for `val`'s own + * enumerable properties. + * + * `.deep` and `.own` can be combined. + * + * expect({a: {b: 2}}).to.deep.own.include({a: {b: 2}}); + * + * Add `.nested` earlier in the chain to enable dot- and bracket-notation when + * referencing nested properties. + * + * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 2}}).to.nested.include({'\\.a.\\[b\\]': 2}); + * + * `.deep` and `.nested` can be combined. + * + * expect({a: {b: [{c: 3}]}}).to.deep.nested.include({'a.b[0]': {c: 3}}); + * + * `.own` and `.nested` cannot be combined. + * + * Add `.not` earlier in the chain to negate `.include`. + * + * expect('foobar').to.not.include('taco'); + * expect([1, 2, 3]).to.not.include(4); + * + * However, it's dangerous to negate `.include` when the target is an object. + * The problem is that it creates uncertain expectations by asserting that the + * target object doesn't have all of `val`'s key/value pairs but may or may + * not have some of them. It's often best to identify the exact output that's + * expected, and then write an assertion that only accepts that exact output. + * + * When the target object isn't even expected to have `val`'s keys, it's + * often best to assert exactly that. + * + * expect({c: 3}).to.not.have.any.keys('a', 'b'); // Recommended + * expect({c: 3}).to.not.include({a: 1, b: 2}); // Not recommended + * + * When the target object is expected to have `val`'s keys, it's often best to + * assert that each of the properties has its expected value, rather than + * asserting that each property doesn't have one of many unexpected values. + * + * expect({a: 3, b: 4}).to.include({a: 3, b: 4}); // Recommended + * expect({a: 3, b: 4}).to.not.include({a: 1, b: 2}); // Not recommended + * + * `.include` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2, 3]).to.include(4, 'nooo why fail??'); + * expect([1, 2, 3], 'nooo why fail??').to.include(4); + * + * `.include` can also be used as a language chain, causing all `.members` and + * `.keys` assertions that follow in the chain to require the target to be a + * superset of the expected set, rather than an identical set. Note that + * `.members` ignores duplicates in the subset when `.include` is added. + * + * // Target object's keys are a superset of ['a', 'b'] but not identical + * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); + * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); + * + * // Target array is a superset of [1, 2] but not identical + * expect([1, 2, 3]).to.include.members([1, 2]); + * expect([1, 2, 3]).to.not.have.members([1, 2]); + * + * // Duplicates in the subset are ignored + * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); + * + * Note that adding `.any` earlier in the chain causes the `.keys` assertion + * to ignore `.include`. + * + * // Both assertions are identical + * expect({a: 1}).to.include.any.keys('a', 'b'); + * expect({a: 1}).to.have.any.keys('a', 'b'); + * + * The aliases `.includes`, `.contain`, and `.contains` can be used + * interchangeably with `.include`. + * + * @name include + * @alias contain + * @alias includes + * @alias contains + * @param {Mixed} val + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function SameValueZero(a, b) { + return (_.isNaN(a) && _.isNaN(b)) || a === b; + } + + function includeChainingBehavior () { + flag(this, 'contains', true); + } + + function include (val, msg) { + if (msg) flag(this, 'message', msg); + + var obj = flag(this, 'object') + , objType = _.type(obj).toLowerCase() + , flagMsg = flag(this, 'message') + , negate = flag(this, 'negate') + , ssfi = flag(this, 'ssfi') + , isDeep = flag(this, 'deep') + , descriptor = isDeep ? 'deep ' : ''; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + var included = false; + + switch (objType) { + case 'string': + included = obj.indexOf(val) !== -1; + break; + + case 'weakset': + if (isDeep) { + throw new AssertionError( + flagMsg + 'unable to use .deep.include with WeakSet', + undefined, + ssfi + ); + } + + included = obj.has(val); + break; + + case 'map': + var isEql = isDeep ? _.eql : SameValueZero; + obj.forEach(function (item) { + included = included || isEql(item, val); + }); + break; + + case 'set': + if (isDeep) { + obj.forEach(function (item) { + included = included || _.eql(item, val); + }); + } else { + included = obj.has(val); + } + break; + + case 'array': + if (isDeep) { + included = obj.some(function (item) { + return _.eql(item, val); + }) + } else { + included = obj.indexOf(val) !== -1; + } + break; + + default: + // This block is for asserting a subset of properties in an object. + // `_.expectTypes` isn't used here because `.include` should work with + // objects with a custom `@@toStringTag`. + if (val !== Object(val)) { + throw new AssertionError( + flagMsg + 'the given combination of arguments (' + + objType + ' and ' + + _.type(val).toLowerCase() + ')' + + ' is invalid for this assertion. ' + + 'You can use an array, a map, an object, a set, a string, ' + + 'or a weakset instead of a ' + + _.type(val).toLowerCase(), + undefined, + ssfi + ); + } + + var props = Object.keys(val) + , firstErr = null + , numErrs = 0; + + props.forEach(function (prop) { + var propAssertion = new Assertion(obj); + _.transferFlags(this, propAssertion, true); + flag(propAssertion, 'lockSsfi', true); + + if (!negate || props.length === 1) { + propAssertion.property(prop, val[prop]); + return; + } + + try { + propAssertion.property(prop, val[prop]); + } catch (err) { + if (!_.checkError.compatibleConstructor(err, AssertionError)) { + throw err; + } + if (firstErr === null) firstErr = err; + numErrs++; + } + }, this); + + // When validating .not.include with multiple properties, we only want + // to throw an assertion error if all of the properties are included, + // in which case we throw the first property assertion error that we + // encountered. + if (negate && props.length > 1 && numErrs === props.length) { + throw firstErr; + } + return; + } + + // Assert inclusion in collection or substring in a string. + this.assert( + included + , 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val) + , 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val)); + } + + Assertion.addChainableMethod('include', include, includeChainingBehavior); + Assertion.addChainableMethod('contain', include, includeChainingBehavior); + Assertion.addChainableMethod('contains', include, includeChainingBehavior); + Assertion.addChainableMethod('includes', include, includeChainingBehavior); + + /** + * ### .ok + * + * Asserts that the target is a truthy value (considered `true` in boolean context). + * However, it's often best to assert that the target is strictly (`===`) or + * deeply equal to its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.ok; // Not recommended + * + * expect(true).to.be.true; // Recommended + * expect(true).to.be.ok; // Not recommended + * + * Add `.not` earlier in the chain to negate `.ok`. + * + * expect(0).to.equal(0); // Recommended + * expect(0).to.not.be.ok; // Not recommended + * + * expect(false).to.be.false; // Recommended + * expect(false).to.not.be.ok; // Not recommended + * + * expect(null).to.be.null; // Recommended + * expect(null).to.not.be.ok; // Not recommended + * + * expect(undefined).to.be.undefined; // Recommended + * expect(undefined).to.not.be.ok; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(false, 'nooo why fail??').to.be.ok; + * + * @name ok + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ok', function () { + this.assert( + flag(this, 'object') + , 'expected #{this} to be truthy' + , 'expected #{this} to be falsy'); + }); + + /** + * ### .true + * + * Asserts that the target is strictly (`===`) equal to `true`. + * + * expect(true).to.be.true; + * + * Add `.not` earlier in the chain to negate `.true`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `true`. + * + * expect(false).to.be.false; // Recommended + * expect(false).to.not.be.true; // Not recommended + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.true; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(false, 'nooo why fail??').to.be.true; + * + * @name true + * @namespace BDD + * @api public + */ + + Assertion.addProperty('true', function () { + this.assert( + true === flag(this, 'object') + , 'expected #{this} to be true' + , 'expected #{this} to be false' + , flag(this, 'negate') ? false : true + ); + }); + + /** + * ### .false + * + * Asserts that the target is strictly (`===`) equal to `false`. + * + * expect(false).to.be.false; + * + * Add `.not` earlier in the chain to negate `.false`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to `false`. + * + * expect(true).to.be.true; // Recommended + * expect(true).to.not.be.false; // Not recommended + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.false; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(true, 'nooo why fail??').to.be.false; + * + * @name false + * @namespace BDD + * @api public + */ + + Assertion.addProperty('false', function () { + this.assert( + false === flag(this, 'object') + , 'expected #{this} to be false' + , 'expected #{this} to be true' + , flag(this, 'negate') ? true : false + ); + }); + + /** + * ### .null + * + * Asserts that the target is strictly (`===`) equal to `null`. + * + * expect(null).to.be.null; + * + * Add `.not` earlier in the chain to negate `.null`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `null`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.null; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.null; + * + * @name null + * @namespace BDD + * @api public + */ + + Assertion.addProperty('null', function () { + this.assert( + null === flag(this, 'object') + , 'expected #{this} to be null' + , 'expected #{this} not to be null' + ); + }); + + /** + * ### .undefined + * + * Asserts that the target is strictly (`===`) equal to `undefined`. + * + * expect(undefined).to.be.undefined; + * + * Add `.not` earlier in the chain to negate `.undefined`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to `undefined`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.undefined; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.undefined; + * + * @name undefined + * @namespace BDD + * @api public + */ + + Assertion.addProperty('undefined', function () { + this.assert( + undefined === flag(this, 'object') + , 'expected #{this} to be undefined' + , 'expected #{this} not to be undefined' + ); + }); + + /** + * ### .NaN + * + * Asserts that the target is exactly `NaN`. + * + * expect(NaN).to.be.NaN; + * + * Add `.not` earlier in the chain to negate `.NaN`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `NaN`. + * + * expect('foo').to.equal('foo'); // Recommended + * expect('foo').to.not.be.NaN; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.NaN; + * + * @name NaN + * @namespace BDD + * @api public + */ + + Assertion.addProperty('NaN', function () { + this.assert( + _.isNaN(flag(this, 'object')) + , 'expected #{this} to be NaN' + , 'expected #{this} not to be NaN' + ); + }); + + /** + * ### .exist + * + * Asserts that the target is not strictly (`===`) equal to either `null` or + * `undefined`. However, it's often best to assert that the target is equal to + * its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.exist; // Not recommended + * + * expect(0).to.equal(0); // Recommended + * expect(0).to.exist; // Not recommended + * + * Add `.not` earlier in the chain to negate `.exist`. + * + * expect(null).to.be.null; // Recommended + * expect(null).to.not.exist; // Not recommended + * + * expect(undefined).to.be.undefined; // Recommended + * expect(undefined).to.not.exist; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(null, 'nooo why fail??').to.exist; + * + * The alias `.exists` can be used interchangeably with `.exist`. + * + * @name exist + * @alias exists + * @namespace BDD + * @api public + */ + + function assertExist () { + var val = flag(this, 'object'); + this.assert( + val !== null && val !== undefined + , 'expected #{this} to exist' + , 'expected #{this} to not exist' + ); + } + + Assertion.addProperty('exist', assertExist); + Assertion.addProperty('exists', assertExist); + + /** + * ### .empty + * + * When the target is a string or array, `.empty` asserts that the target's + * `length` property is strictly (`===`) equal to `0`. + * + * expect([]).to.be.empty; + * expect('').to.be.empty; + * + * When the target is a map or set, `.empty` asserts that the target's `size` + * property is strictly equal to `0`. + * + * expect(new Set()).to.be.empty; + * expect(new Map()).to.be.empty; + * + * When the target is a non-function object, `.empty` asserts that the target + * doesn't have any own enumerable properties. Properties with Symbol-based + * keys are excluded from the count. + * + * expect({}).to.be.empty; + * + * Because `.empty` does different things based on the target's type, it's + * important to check the target's type before using `.empty`. See the `.a` + * doc for info on testing a target's type. + * + * expect([]).to.be.an('array').that.is.empty; + * + * Add `.not` earlier in the chain to negate `.empty`. However, it's often + * best to assert that the target contains its expected number of values, + * rather than asserting that it's not empty. + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.not.be.empty; // Not recommended + * + * expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended + * expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended + * + * expect(Object.keys({a: 1})).to.have.lengthOf(1); // Recommended + * expect({a: 1}).to.not.be.empty; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect([1, 2, 3], 'nooo why fail??').to.be.empty; + * + * @name empty + * @namespace BDD + * @api public + */ + + Assertion.addProperty('empty', function () { + var val = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , flagMsg = flag(this, 'message') + , itemsCount; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + switch (_.type(val).toLowerCase()) { + case 'array': + case 'string': + itemsCount = val.length; + break; + case 'map': + case 'set': + itemsCount = val.size; + break; + case 'weakmap': + case 'weakset': + throw new AssertionError( + flagMsg + '.empty was passed a weak collection', + undefined, + ssfi + ); + case 'function': + var msg = flagMsg + '.empty was passed a function ' + _.getName(val); + throw new AssertionError(msg.trim(), undefined, ssfi); + default: + if (val !== Object(val)) { + throw new AssertionError( + flagMsg + '.empty was passed non-string primitive ' + _.inspect(val), + undefined, + ssfi + ); + } + itemsCount = Object.keys(val).length; + } + + this.assert( + 0 === itemsCount + , 'expected #{this} to be empty' + , 'expected #{this} not to be empty' + ); + }); + + /** + * ### .arguments + * + * Asserts that the target is an `arguments` object. + * + * function test () { + * expect(arguments).to.be.arguments; + * } + * + * test(); + * + * Add `.not` earlier in the chain to negate `.arguments`. However, it's often + * best to assert which type the target is expected to be, rather than + * asserting that it’s not an `arguments` object. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.arguments; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({}, 'nooo why fail??').to.be.arguments; + * + * The alias `.Arguments` can be used interchangeably with `.arguments`. + * + * @name arguments + * @alias Arguments + * @namespace BDD + * @api public + */ + + function checkArguments () { + var obj = flag(this, 'object') + , type = _.type(obj); + this.assert( + 'Arguments' === type + , 'expected #{this} to be arguments but got ' + type + , 'expected #{this} to not be arguments' + ); + } + + Assertion.addProperty('arguments', checkArguments); + Assertion.addProperty('Arguments', checkArguments); + + /** + * ### .equal(val[, msg]) + * + * Asserts that the target is strictly (`===`) equal to the given `val`. + * + * expect(1).to.equal(1); + * expect('foo').to.equal('foo'); + * + * Add `.deep` earlier in the chain to use deep equality instead. See the + * `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) equals `{a: 1}` + * expect({a: 1}).to.deep.equal({a: 1}); + * expect({a: 1}).to.not.equal({a: 1}); + * + * // Target array deeply (but not strictly) equals `[1, 2]` + * expect([1, 2]).to.deep.equal([1, 2]); + * expect([1, 2]).to.not.equal([1, 2]); + * + * Add `.not` earlier in the chain to negate `.equal`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to one of countless unexpected values. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.equal(2); // Not recommended + * + * `.equal` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.equal(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.equal(2); + * + * The aliases `.equals` and `eq` can be used interchangeably with `.equal`. + * + * @name equal + * @alias equals + * @alias eq + * @param {Mixed} val + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertEqual (val, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'deep')) { + var prevLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + this.eql(val); + flag(this, 'lockSsfi', prevLockSsfi); + } else { + this.assert( + val === obj + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{exp}' + , val + , this._obj + , true + ); + } + } + + Assertion.addMethod('equal', assertEqual); + Assertion.addMethod('equals', assertEqual); + Assertion.addMethod('eq', assertEqual); + + /** + * ### .eql(obj[, msg]) + * + * Asserts that the target is deeply equal to the given `obj`. See the + * `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target object is deeply (but not strictly) equal to {a: 1} + * expect({a: 1}).to.eql({a: 1}).but.not.equal({a: 1}); + * + * // Target array is deeply (but not strictly) equal to [1, 2] + * expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]); + * + * Add `.not` earlier in the chain to negate `.eql`. However, it's often best + * to assert that the target is deeply equal to its expected value, rather + * than not deeply equal to one of countless unexpected values. + * + * expect({a: 1}).to.eql({a: 1}); // Recommended + * expect({a: 1}).to.not.eql({b: 2}); // Not recommended + * + * `.eql` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect({a: 1}).to.eql({b: 2}, 'nooo why fail??'); + * expect({a: 1}, 'nooo why fail??').to.eql({b: 2}); + * + * The alias `.eqls` can be used interchangeably with `.eql`. + * + * The `.deep.equal` assertion is almost identical to `.eql` but with one + * difference: `.deep.equal` causes deep equality comparisons to also be used + * for any other assertions that follow in the chain. + * + * @name eql + * @alias eqls + * @param {Mixed} obj + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertEql(obj, msg) { + if (msg) flag(this, 'message', msg); + this.assert( + _.eql(obj, flag(this, 'object')) + , 'expected #{this} to deeply equal #{exp}' + , 'expected #{this} to not deeply equal #{exp}' + , obj + , this._obj + , true + ); + } + + Assertion.addMethod('eql', assertEql); + Assertion.addMethod('eqls', assertEql); + + /** + * ### .above(n[, msg]) + * + * Asserts that the target is a number or a date greater than the given number or date `n` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.above(1); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.above(2); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.above`. + * + * expect(2).to.equal(2); // Recommended + * expect(1).to.not.be.above(2); // Not recommended + * + * `.above` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.above(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.above(2); + * + * The aliases `.gt` and `.greaterThan` can be used interchangeably with + * `.above`. + * + * @name above + * @alias gt + * @alias greaterThan + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertAbove (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to above must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to above must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount > n + , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' above #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj > n + , 'expected #{this} to be above #{exp}' + , 'expected #{this} to be at most #{exp}' + , n + ); + } + } + + Assertion.addMethod('above', assertAbove); + Assertion.addMethod('gt', assertAbove); + Assertion.addMethod('greaterThan', assertAbove); + + /** + * ### .least(n[, msg]) + * + * Asserts that the target is a number or a date greater than or equal to the given + * number or date `n` respectively. However, it's often best to assert that the target is equal to + * its expected value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.at.least(1); // Not recommended + * expect(2).to.be.at.least(2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than or equal to the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.at.least(2); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.least`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.at.least(2); // Not recommended + * + * `.least` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.at.least(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.at.least(2); + * + * The aliases `.gte` and `.greaterThanOrEqual` can be used interchangeably with + * `.least`. + * + * @name least + * @alias gte + * @alias greaterThanOrEqual + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertLeast (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to least must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to least must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount >= n + , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}' + , 'expected #{this} to have a ' + descriptor + ' below #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj >= n + , 'expected #{this} to be at least #{exp}' + , 'expected #{this} to be below #{exp}' + , n + ); + } + } + + Assertion.addMethod('least', assertLeast); + Assertion.addMethod('gte', assertLeast); + Assertion.addMethod('greaterThanOrEqual', assertLeast); + + /** + * ### .below(n[, msg]) + * + * Asserts that the target is a number or a date less than the given number or date `n` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.below(2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is less than the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.below(4); // Not recommended + * + * expect([1, 2, 3]).to.have.length(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.below`. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.be.below(1); // Not recommended + * + * `.below` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(2).to.be.below(1, 'nooo why fail??'); + * expect(2, 'nooo why fail??').to.be.below(1); + * + * The aliases `.lt` and `.lessThan` can be used interchangeably with + * `.below`. + * + * @name below + * @alias lt + * @alias lessThan + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertBelow (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to below must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to below must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount < n + , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' below #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj < n + , 'expected #{this} to be below #{exp}' + , 'expected #{this} to be at least #{exp}' + , n + ); + } + } + + Assertion.addMethod('below', assertBelow); + Assertion.addMethod('lt', assertBelow); + Assertion.addMethod('lessThan', assertBelow); + + /** + * ### .most(n[, msg]) + * + * Asserts that the target is a number or a date less than or equal to the given number + * or date `n` respectively. However, it's often best to assert that the target is equal to its + * expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.at.most(2); // Not recommended + * expect(1).to.be.at.most(1); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is less than or equal to the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.at.most(4); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.most`. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.be.at.most(1); // Not recommended + * + * `.most` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(2).to.be.at.most(1, 'nooo why fail??'); + * expect(2, 'nooo why fail??').to.be.at.most(1); + * + * The aliases `.lte` and `.lessThanOrEqual` can be used interchangeably with + * `.most`. + * + * @name most + * @alias lte + * @alias lessThanOrEqual + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertMost (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to most must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to most must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount <= n + , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}' + , 'expected #{this} to have a ' + descriptor + ' above #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj <= n + , 'expected #{this} to be at most #{exp}' + , 'expected #{this} to be above #{exp}' + , n + ); + } + } + + Assertion.addMethod('most', assertMost); + Assertion.addMethod('lte', assertMost); + Assertion.addMethod('lessThanOrEqual', assertMost); + + /** + * ### .within(start, finish[, msg]) + * + * Asserts that the target is a number or a date greater than or equal to the given + * number or date `start`, and less than or equal to the given number or date `finish` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.within(1, 3); // Not recommended + * expect(2).to.be.within(2, 3); // Not recommended + * expect(2).to.be.within(1, 2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than or equal to the given number `start`, and less + * than or equal to the given number `finish`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.within(2, 4); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.within`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.within(2, 4); // Not recommended + * + * `.within` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(4).to.be.within(1, 3, 'nooo why fail??'); + * expect(4, 'nooo why fail??').to.be.within(1, 3); + * + * @name within + * @param {Number} start lower bound inclusive + * @param {Number} finish upper bound inclusive + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('within', function (start, finish, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , startType = _.type(start).toLowerCase() + , finishType = _.type(finish).toLowerCase() + , errorMessage + , shouldThrow = true + , range = (startType === 'date' && finishType === 'date') + ? start.toISOString() + '..' + finish.toISOString() + : start + '..' + finish; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) { + errorMessage = msgPrefix + 'the arguments to within must be dates'; + } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the arguments to within must be numbers'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount >= start && itemsCount <= finish + , 'expected #{this} to have a ' + descriptor + ' within ' + range + , 'expected #{this} to not have a ' + descriptor + ' within ' + range + ); + } else { + this.assert( + obj >= start && obj <= finish + , 'expected #{this} to be within ' + range + , 'expected #{this} to not be within ' + range + ); + } + }); + + /** + * ### .instanceof(constructor[, msg]) + * + * Asserts that the target is an instance of the given `constructor`. + * + * function Cat () { } + * + * expect(new Cat()).to.be.an.instanceof(Cat); + * expect([1, 2]).to.be.an.instanceof(Array); + * + * Add `.not` earlier in the chain to negate `.instanceof`. + * + * expect({a: 1}).to.not.be.an.instanceof(Array); + * + * `.instanceof` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1).to.be.an.instanceof(Array, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.an.instanceof(Array); + * + * Due to limitations in ES5, `.instanceof` may not always work as expected + * when using a transpiler such as Babel or TypeScript. In particular, it may + * produce unexpected results when subclassing built-in object such as + * `Array`, `Error`, and `Map`. See your transpiler's docs for details: + * + * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) + * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) + * + * The alias `.instanceOf` can be used interchangeably with `.instanceof`. + * + * @name instanceof + * @param {Constructor} constructor + * @param {String} msg _optional_ + * @alias instanceOf + * @namespace BDD + * @api public + */ + + function assertInstanceOf (constructor, msg) { + if (msg) flag(this, 'message', msg); + + var target = flag(this, 'object') + var ssfi = flag(this, 'ssfi'); + var flagMsg = flag(this, 'message'); + + try { + var isInstanceOf = target instanceof constructor; + } catch (err) { + if (err instanceof TypeError) { + flagMsg = flagMsg ? flagMsg + ': ' : ''; + throw new AssertionError( + flagMsg + 'The instanceof assertion needs a constructor but ' + + _.type(constructor) + ' was given.', + undefined, + ssfi + ); + } + throw err; + } + + var name = _.getName(constructor); + if (name === null) { + name = 'an unnamed constructor'; + } + + this.assert( + isInstanceOf + , 'expected #{this} to be an instance of ' + name + , 'expected #{this} to not be an instance of ' + name + ); + }; + + Assertion.addMethod('instanceof', assertInstanceOf); + Assertion.addMethod('instanceOf', assertInstanceOf); + + /** + * ### .property(name[, val[, msg]]) + * + * Asserts that the target has a property with the given key `name`. + * + * expect({a: 1}).to.have.property('a'); + * + * When `val` is provided, `.property` also asserts that the property's value + * is equal to the given `val`. + * + * expect({a: 1}).to.have.property('a', 1); + * + * By default, strict (`===`) equality is used. Add `.deep` earlier in the + * chain to use deep equality instead. See the `deep-eql` project page for + * info on the deep equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) has property `x: {a: 1}` + * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); + * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); + * + * The target's enumerable and non-enumerable properties are always included + * in the search. By default, both own and inherited properties are included. + * Add `.own` earlier in the chain to exclude inherited properties from the + * search. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.have.own.property('a'); + * expect({a: 1}).to.have.own.property('a', 1); + * expect({a: 1}).to.have.property('b'); + * expect({a: 1}).to.not.have.own.property('b'); + * + * `.deep` and `.own` can be combined. + * + * expect({x: {a: 1}}).to.have.deep.own.property('x', {a: 1}); + * + * Add `.nested` earlier in the chain to enable dot- and bracket-notation when + * referencing nested properties. + * + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]', 'y'); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); + * + * `.deep` and `.nested` can be combined. + * + * expect({a: {b: [{c: 3}]}}) + * .to.have.deep.nested.property('a.b[0]', {c: 3}); + * + * `.own` and `.nested` cannot be combined. + * + * Add `.not` earlier in the chain to negate `.property`. + * + * expect({a: 1}).to.not.have.property('b'); + * + * However, it's dangerous to negate `.property` when providing `val`. The + * problem is that it creates uncertain expectations by asserting that the + * target either doesn't have a property with the given key `name`, or that it + * does have a property with the given key `name` but its value isn't equal to + * the given `val`. It's often best to identify the exact output that's + * expected, and then write an assertion that only accepts that exact output. + * + * When the target isn't expected to have a property with the given key + * `name`, it's often best to assert exactly that. + * + * expect({b: 2}).to.not.have.property('a'); // Recommended + * expect({b: 2}).to.not.have.property('a', 1); // Not recommended + * + * When the target is expected to have a property with the given key `name`, + * it's often best to assert that the property has its expected value, rather + * than asserting that it doesn't have one of many unexpected values. + * + * expect({a: 3}).to.have.property('a', 3); // Recommended + * expect({a: 3}).to.not.have.property('a', 1); // Not recommended + * + * `.property` changes the target of any assertions that follow in the chain + * to be the value of the property from the original target object. + * + * expect({a: 1}).to.have.property('a').that.is.a('number'); + * + * `.property` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing `val`, only use the + * second form. + * + * // Recommended + * expect({a: 1}).to.have.property('a', 2, 'nooo why fail??'); + * expect({a: 1}, 'nooo why fail??').to.have.property('a', 2); + * expect({a: 1}, 'nooo why fail??').to.have.property('b'); + * + * // Not recommended + * expect({a: 1}).to.have.property('b', undefined, 'nooo why fail??'); + * + * The above assertion isn't the same thing as not providing `val`. Instead, + * it's asserting that the target object has a `b` property that's equal to + * `undefined`. + * + * The assertions `.ownProperty` and `.haveOwnProperty` can be used + * interchangeably with `.own.property`. + * + * @name property + * @param {String} name + * @param {Mixed} val (optional) + * @param {String} msg _optional_ + * @returns value of property for chaining + * @namespace BDD + * @api public + */ + + function assertProperty (name, val, msg) { + if (msg) flag(this, 'message', msg); + + var isNested = flag(this, 'nested') + , isOwn = flag(this, 'own') + , flagMsg = flag(this, 'message') + , obj = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , nameType = typeof name; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + if (isNested) { + if (nameType !== 'string') { + throw new AssertionError( + flagMsg + 'the argument to property must be a string when using nested syntax', + undefined, + ssfi + ); + } + } else { + if (nameType !== 'string' && nameType !== 'number' && nameType !== 'symbol') { + throw new AssertionError( + flagMsg + 'the argument to property must be a string, number, or symbol', + undefined, + ssfi + ); + } + } + + if (isNested && isOwn) { + throw new AssertionError( + flagMsg + 'The "nested" and "own" flags cannot be combined.', + undefined, + ssfi + ); + } + + if (obj === null || obj === undefined) { + throw new AssertionError( + flagMsg + 'Target cannot be null or undefined.', + undefined, + ssfi + ); + } + + var isDeep = flag(this, 'deep') + , negate = flag(this, 'negate') + , pathInfo = isNested ? _.getPathInfo(obj, name) : null + , value = isNested ? pathInfo.value : obj[name]; + + var descriptor = ''; + if (isDeep) descriptor += 'deep '; + if (isOwn) descriptor += 'own '; + if (isNested) descriptor += 'nested '; + descriptor += 'property '; + + var hasProperty; + if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); + else if (isNested) hasProperty = pathInfo.exists; + else hasProperty = _.hasProperty(obj, name); + + // When performing a negated assertion for both name and val, merely having + // a property with the given name isn't enough to cause the assertion to + // fail. It must both have a property with the given name, and the value of + // that property must equal the given val. Therefore, skip this assertion in + // favor of the next. + if (!negate || arguments.length === 1) { + this.assert( + hasProperty + , 'expected #{this} to have ' + descriptor + _.inspect(name) + , 'expected #{this} to not have ' + descriptor + _.inspect(name)); + } + + if (arguments.length > 1) { + this.assert( + hasProperty && (isDeep ? _.eql(val, value) : val === value) + , 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' + , 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}' + , val + , value + ); + } + + flag(this, 'object', value); + } + + Assertion.addMethod('property', assertProperty); + + function assertOwnProperty (name, value, msg) { + flag(this, 'own', true); + assertProperty.apply(this, arguments); + } + + Assertion.addMethod('ownProperty', assertOwnProperty); + Assertion.addMethod('haveOwnProperty', assertOwnProperty); + + /** + * ### .ownPropertyDescriptor(name[, descriptor[, msg]]) + * + * Asserts that the target has its own property descriptor with the given key + * `name`. Enumerable and non-enumerable properties are included in the + * search. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a'); + * + * When `descriptor` is provided, `.ownPropertyDescriptor` also asserts that + * the property's descriptor is deeply equal to the given `descriptor`. See + * the `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * Add `.not` earlier in the chain to negate `.ownPropertyDescriptor`. + * + * expect({a: 1}).to.not.have.ownPropertyDescriptor('b'); + * + * However, it's dangerous to negate `.ownPropertyDescriptor` when providing + * a `descriptor`. The problem is that it creates uncertain expectations by + * asserting that the target either doesn't have a property descriptor with + * the given key `name`, or that it does have a property descriptor with the + * given key `name` but it’s not deeply equal to the given `descriptor`. It's + * often best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to have a property descriptor with the given + * key `name`, it's often best to assert exactly that. + * + * // Recommended + * expect({b: 2}).to.not.have.ownPropertyDescriptor('a'); + * + * // Not recommended + * expect({b: 2}).to.not.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * When the target is expected to have a property descriptor with the given + * key `name`, it's often best to assert that the property has its expected + * descriptor, rather than asserting that it doesn't have one of many + * unexpected descriptors. + * + * // Recommended + * expect({a: 3}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 3, + * }); + * + * // Not recommended + * expect({a: 3}).to.not.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * `.ownPropertyDescriptor` changes the target of any assertions that follow + * in the chain to be the value of the property descriptor from the original + * target object. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a') + * .that.has.property('enumerable', true); + * + * `.ownPropertyDescriptor` accepts an optional `msg` argument which is a + * custom error message to show when the assertion fails. The message can also + * be given as the second argument to `expect`. When not providing + * `descriptor`, only use the second form. + * + * // Recommended + * expect({a: 1}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 2, + * }, 'nooo why fail??'); + * + * // Recommended + * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 2, + * }); + * + * // Recommended + * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('b'); + * + * // Not recommended + * expect({a: 1}) + * .to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??'); + * + * The above assertion isn't the same thing as not providing `descriptor`. + * Instead, it's asserting that the target object has a `b` property + * descriptor that's deeply equal to `undefined`. + * + * The alias `.haveOwnPropertyDescriptor` can be used interchangeably with + * `.ownPropertyDescriptor`. + * + * @name ownPropertyDescriptor + * @alias haveOwnPropertyDescriptor + * @param {String} name + * @param {Object} descriptor _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertOwnPropertyDescriptor (name, descriptor, msg) { + if (typeof descriptor === 'string') { + msg = descriptor; + descriptor = null; + } + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); + if (actualDescriptor && descriptor) { + this.assert( + _.eql(descriptor, actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor) + , descriptor + , actualDescriptor + , true + ); + } else { + this.assert( + actualDescriptor + , 'expected #{this} to have an own property descriptor for ' + _.inspect(name) + , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name) + ); + } + flag(this, 'object', actualDescriptor); + } + + Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor); + Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); + + /** + * ### .lengthOf(n[, msg]) + * + * Asserts that the target's `length` or `size` is equal to the given number + * `n`. + * + * expect([1, 2, 3]).to.have.lengthOf(3); + * expect('foo').to.have.lengthOf(3); + * expect(new Set([1, 2, 3])).to.have.lengthOf(3); + * expect(new Map([['a', 1], ['b', 2], ['c', 3]])).to.have.lengthOf(3); + * + * Add `.not` earlier in the chain to negate `.lengthOf`. However, it's often + * best to assert that the target's `length` property is equal to its expected + * value, rather than not equal to one of many unexpected values. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.not.have.lengthOf(4); // Not recommended + * + * `.lengthOf` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??'); + * expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2); + * + * `.lengthOf` can also be used as a language chain, causing all `.above`, + * `.below`, `.least`, `.most`, and `.within` assertions that follow in the + * chain to use the target's `length` property as the target. However, it's + * often best to assert that the target's `length` property is equal to its + * expected length, rather than asserting that its `length` property falls + * within some range of values. + * + * // Recommended + * expect([1, 2, 3]).to.have.lengthOf(3); + * + * // Not recommended + * expect([1, 2, 3]).to.have.lengthOf.above(2); + * expect([1, 2, 3]).to.have.lengthOf.below(4); + * expect([1, 2, 3]).to.have.lengthOf.at.least(3); + * expect([1, 2, 3]).to.have.lengthOf.at.most(3); + * expect([1, 2, 3]).to.have.lengthOf.within(2,4); + * + * Due to a compatibility issue, the alias `.length` can't be chained directly + * off of an uninvoked method such as `.a`. Therefore, `.length` can't be used + * interchangeably with `.lengthOf` in every situation. It's recommended to + * always use `.lengthOf` instead of `.length`. + * + * expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error + * expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected + * + * @name lengthOf + * @alias length + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertLengthChain () { + flag(this, 'doLength', true); + } + + function assertLength (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , objType = _.type(obj).toLowerCase() + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi') + , descriptor = 'length' + , itemsCount; + + switch (objType) { + case 'map': + case 'set': + descriptor = 'size'; + itemsCount = obj.size; + break; + default: + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + itemsCount = obj.length; + } + + this.assert( + itemsCount == n + , 'expected #{this} to have a ' + descriptor + ' of #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' of #{act}' + , n + , itemsCount + ); + } + + Assertion.addChainableMethod('length', assertLength, assertLengthChain); + Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain); + + /** + * ### .match(re[, msg]) + * + * Asserts that the target matches the given regular expression `re`. + * + * expect('foobar').to.match(/^foo/); + * + * Add `.not` earlier in the chain to negate `.match`. + * + * expect('foobar').to.not.match(/taco/); + * + * `.match` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect('foobar').to.match(/taco/, 'nooo why fail??'); + * expect('foobar', 'nooo why fail??').to.match(/taco/); + * + * The alias `.matches` can be used interchangeably with `.match`. + * + * @name match + * @alias matches + * @param {RegExp} re + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + function assertMatch(re, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + this.assert( + re.exec(obj) + , 'expected #{this} to match ' + re + , 'expected #{this} not to match ' + re + ); + } + + Assertion.addMethod('match', assertMatch); + Assertion.addMethod('matches', assertMatch); + + /** + * ### .string(str[, msg]) + * + * Asserts that the target string contains the given substring `str`. + * + * expect('foobar').to.have.string('bar'); + * + * Add `.not` earlier in the chain to negate `.string`. + * + * expect('foobar').to.not.have.string('taco'); + * + * `.string` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect('foobar').to.have.string('taco', 'nooo why fail??'); + * expect('foobar', 'nooo why fail??').to.have.string('taco'); + * + * @name string + * @param {String} str + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('string', function (str, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(obj, flagMsg, ssfi, true).is.a('string'); + + this.assert( + ~obj.indexOf(str) + , 'expected #{this} to contain ' + _.inspect(str) + , 'expected #{this} to not contain ' + _.inspect(str) + ); + }); + + /** + * ### .keys(key1[, key2[, ...]]) + * + * Asserts that the target object, array, map, or set has the given keys. Only + * the target's own inherited properties are included in the search. + * + * When the target is an object or array, keys can be provided as one or more + * string arguments, a single array argument, or a single object argument. In + * the latter case, only the keys in the given object matter; the values are + * ignored. + * + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * expect(['x', 'y']).to.have.all.keys(0, 1); + * + * expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']); + * expect(['x', 'y']).to.have.all.keys([0, 1]); + * + * expect({a: 1, b: 2}).to.have.all.keys({a: 4, b: 5}); // ignore 4 and 5 + * expect(['x', 'y']).to.have.all.keys({0: 4, 1: 5}); // ignore 4 and 5 + * + * When the target is a map or set, each key must be provided as a separate + * argument. + * + * expect(new Map([['a', 1], ['b', 2]])).to.have.all.keys('a', 'b'); + * expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b'); + * + * Because `.keys` does different things based on the target's type, it's + * important to check the target's type before using `.keys`. See the `.a` doc + * for info on testing a target's type. + * + * expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b'); + * + * By default, strict (`===`) equality is used to compare keys of maps and + * sets. Add `.deep` earlier in the chain to use deep equality instead. See + * the `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target set deeply (but not strictly) has key `{a: 1}` + * expect(new Set([{a: 1}])).to.have.all.deep.keys([{a: 1}]); + * expect(new Set([{a: 1}])).to.not.have.all.keys([{a: 1}]); + * + * By default, the target must have all of the given keys and no more. Add + * `.any` earlier in the chain to only require that the target have at least + * one of the given keys. Also, add `.not` earlier in the chain to negate + * `.keys`. It's often best to add `.any` when negating `.keys`, and to use + * `.all` when asserting `.keys` without negation. + * + * When negating `.keys`, `.any` is preferred because `.not.any.keys` asserts + * exactly what's expected of the output, whereas `.not.all.keys` creates + * uncertain expectations. + * + * // Recommended; asserts that target doesn't have any of the given keys + * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); + * + * // Not recommended; asserts that target doesn't have all of the given + * // keys but may or may not have some of them + * expect({a: 1, b: 2}).to.not.have.all.keys('c', 'd'); + * + * When asserting `.keys` without negation, `.all` is preferred because + * `.all.keys` asserts exactly what's expected of the output, whereas + * `.any.keys` creates uncertain expectations. + * + * // Recommended; asserts that target has all the given keys + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * + * // Not recommended; asserts that target has at least one of the given + * // keys but may or may not have more of them + * expect({a: 1, b: 2}).to.have.any.keys('a', 'b'); + * + * Note that `.all` is used by default when neither `.all` nor `.any` appear + * earlier in the chain. However, it's often best to add `.all` anyway because + * it improves readability. + * + * // Both assertions are identical + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); // Recommended + * expect({a: 1, b: 2}).to.have.keys('a', 'b'); // Not recommended + * + * Add `.include` earlier in the chain to require that the target's keys be a + * superset of the expected keys, rather than identical sets. + * + * // Target object's keys are a superset of ['a', 'b'] but not identical + * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); + * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); + * + * However, if `.any` and `.include` are combined, only the `.any` takes + * effect. The `.include` is ignored in this case. + * + * // Both assertions are identical + * expect({a: 1}).to.have.any.keys('a', 'b'); + * expect({a: 1}).to.include.any.keys('a', 'b'); + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.have.key('b'); + * + * The alias `.key` can be used interchangeably with `.keys`. + * + * @name keys + * @alias key + * @param {...String|Array|Object} keys + * @namespace BDD + * @api public + */ + + function assertKeys (keys) { + var obj = flag(this, 'object') + , objType = _.type(obj) + , keysType = _.type(keys) + , ssfi = flag(this, 'ssfi') + , isDeep = flag(this, 'deep') + , str + , deepStr = '' + , actual + , ok = true + , flagMsg = flag(this, 'message'); + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments'; + + if (objType === 'Map' || objType === 'Set') { + deepStr = isDeep ? 'deeply ' : ''; + actual = []; + + // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach. + obj.forEach(function (val, key) { actual.push(key) }); + + if (keysType !== 'Array') { + keys = Array.prototype.slice.call(arguments); + } + } else { + actual = _.getOwnEnumerableProperties(obj); + + switch (keysType) { + case 'Array': + if (arguments.length > 1) { + throw new AssertionError(mixedArgsMsg, undefined, ssfi); + } + break; + case 'Object': + if (arguments.length > 1) { + throw new AssertionError(mixedArgsMsg, undefined, ssfi); + } + keys = Object.keys(keys); + break; + default: + keys = Array.prototype.slice.call(arguments); + } + + // Only stringify non-Symbols because Symbols would become "Symbol()" + keys = keys.map(function (val) { + return typeof val === 'symbol' ? val : String(val); + }); + } + + if (!keys.length) { + throw new AssertionError(flagMsg + 'keys required', undefined, ssfi); + } + + var len = keys.length + , any = flag(this, 'any') + , all = flag(this, 'all') + , expected = keys; + + if (!any && !all) { + all = true; + } + + // Has any + if (any) { + ok = expected.some(function(expectedKey) { + return actual.some(function(actualKey) { + if (isDeep) { + return _.eql(expectedKey, actualKey); + } else { + return expectedKey === actualKey; + } + }); + }); + } + + // Has all + if (all) { + ok = expected.every(function(expectedKey) { + return actual.some(function(actualKey) { + if (isDeep) { + return _.eql(expectedKey, actualKey); + } else { + return expectedKey === actualKey; + } + }); + }); + + if (!flag(this, 'contains')) { + ok = ok && keys.length == actual.length; + } + } + + // Key string + if (len > 1) { + keys = keys.map(function(key) { + return _.inspect(key); + }); + var last = keys.pop(); + if (all) { + str = keys.join(', ') + ', and ' + last; + } + if (any) { + str = keys.join(', ') + ', or ' + last; + } + } else { + str = _.inspect(keys[0]); + } + + // Form + str = (len > 1 ? 'keys ' : 'key ') + str; + + // Have / include + str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; + + // Assertion + this.assert( + ok + , 'expected #{this} to ' + deepStr + str + , 'expected #{this} to not ' + deepStr + str + , expected.slice(0).sort(_.compareByInspect) + , actual.sort(_.compareByInspect) + , true + ); + } + + Assertion.addMethod('keys', assertKeys); + Assertion.addMethod('key', assertKeys); + + /** + * ### .throw([errorLike], [errMsgMatcher], [msg]) + * + * When no arguments are provided, `.throw` invokes the target function and + * asserts that an error is thrown. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(); + * + * When one argument is provided, and it's an error constructor, `.throw` + * invokes the target function and asserts that an error is thrown that's an + * instance of that error constructor. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(TypeError); + * + * When one argument is provided, and it's an error instance, `.throw` invokes + * the target function and asserts that an error is thrown that's strictly + * (`===`) equal to that error instance. + * + * var err = new TypeError('Illegal salmon!'); + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(err); + * + * When one argument is provided, and it's a string, `.throw` invokes the + * target function and asserts that an error is thrown with a message that + * contains that string. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw('salmon'); + * + * When one argument is provided, and it's a regular expression, `.throw` + * invokes the target function and asserts that an error is thrown with a + * message that matches that regular expression. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(/salmon/); + * + * When two arguments are provided, and the first is an error instance or + * constructor, and the second is a string or regular expression, `.throw` + * invokes the function and asserts that an error is thrown that fulfills both + * conditions as described above. + * + * var err = new TypeError('Illegal salmon!'); + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(TypeError, 'salmon'); + * expect(badFn).to.throw(TypeError, /salmon/); + * expect(badFn).to.throw(err, 'salmon'); + * expect(badFn).to.throw(err, /salmon/); + * + * Add `.not` earlier in the chain to negate `.throw`. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.not.throw(); + * + * However, it's dangerous to negate `.throw` when providing any arguments. + * The problem is that it creates uncertain expectations by asserting that the + * target either doesn't throw an error, or that it throws an error but of a + * different type than the given type, or that it throws an error of the given + * type but with a message that doesn't include the given string. It's often + * best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to throw an error, it's often best to assert + * exactly that. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.not.throw(); // Recommended + * expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended + * + * When the target is expected to throw an error, it's often best to assert + * that the error is of its expected type, and has a message that includes an + * expected string, rather than asserting that it doesn't have one of many + * unexpected types, and doesn't have a message that includes some string. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(TypeError, 'salmon'); // Recommended + * expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended + * + * `.throw` changes the target of any assertions that follow in the chain to + * be the error object that's thrown. + * + * var err = new TypeError('Illegal salmon!'); + * err.code = 42; + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(TypeError).with.property('code', 42); + * + * `.throw` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. When not providing two arguments, always use + * the second form. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??'); + * expect(goodFn, 'nooo why fail??').to.throw(); + * + * Due to limitations in ES5, `.throw` may not always work as expected when + * using a transpiler such as Babel or TypeScript. In particular, it may + * produce unexpected results when subclassing the built-in `Error` object and + * then passing the subclassed constructor to `.throw`. See your transpiler's + * docs for details: + * + * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) + * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) + * + * Beware of some common mistakes when using the `throw` assertion. One common + * mistake is to accidentally invoke the function yourself instead of letting + * the `throw` assertion invoke the function for you. For example, when + * testing if a function named `fn` throws, provide `fn` instead of `fn()` as + * the target for the assertion. + * + * expect(fn).to.throw(); // Good! Tests `fn` as desired + * expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn` + * + * If you need to assert that your function `fn` throws when passed certain + * arguments, then wrap a call to `fn` inside of another function. + * + * expect(function () { fn(42); }).to.throw(); // Function expression + * expect(() => fn(42)).to.throw(); // ES6 arrow function + * + * Another common mistake is to provide an object method (or any stand-alone + * function that relies on `this`) as the target of the assertion. Doing so is + * problematic because the `this` context will be lost when the function is + * invoked by `.throw`; there's no way for it to know what `this` is supposed + * to be. There are two ways around this problem. One solution is to wrap the + * method or function call inside of another function. Another solution is to + * use `bind`. + * + * expect(function () { cat.meow(); }).to.throw(); // Function expression + * expect(() => cat.meow()).to.throw(); // ES6 arrow function + * expect(cat.meow.bind(cat)).to.throw(); // Bind + * + * Finally, it's worth mentioning that it's a best practice in JavaScript to + * only throw `Error` and derivatives of `Error` such as `ReferenceError`, + * `TypeError`, and user-defined objects that extend `Error`. No other type of + * value will generate a stack trace when initialized. With that said, the + * `throw` assertion does technically support any type of value being thrown, + * not just `Error` and its derivatives. + * + * The aliases `.throws` and `.Throw` can be used interchangeably with + * `.throw`. + * + * @name throw + * @alias throws + * @alias Throw + * @param {Error|ErrorConstructor} errorLike + * @param {String|RegExp} errMsgMatcher error message + * @param {String} msg _optional_ + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @returns error for chaining (null if no error) + * @namespace BDD + * @api public + */ + + function assertThrows (errorLike, errMsgMatcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , flagMsg = flag(this, 'message') + , negate = flag(this, 'negate') || false; + new Assertion(obj, flagMsg, ssfi, true).is.a('function'); + + if (errorLike instanceof RegExp || typeof errorLike === 'string') { + errMsgMatcher = errorLike; + errorLike = null; + } + + var caughtErr; + try { + obj(); + } catch (err) { + caughtErr = err; + } + + // If we have the negate flag enabled and at least one valid argument it means we do expect an error + // but we want it to match a given set of criteria + var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined; + + // If we've got the negate flag enabled and both args, we should only fail if both aren't compatible + // See Issue #551 and PR #683@GitHub + var everyArgIsDefined = Boolean(errorLike && errMsgMatcher); + var errorLikeFail = false; + var errMsgMatcherFail = false; + + // Checking if error was thrown + if (everyArgIsUndefined || !everyArgIsUndefined && !negate) { + // We need this to display results correctly according to their types + var errorLikeString = 'an error'; + if (errorLike instanceof Error) { + errorLikeString = '#{exp}'; + } else if (errorLike) { + errorLikeString = _.checkError.getConstructorName(errorLike); + } + + this.assert( + caughtErr + , 'expected #{this} to throw ' + errorLikeString + , 'expected #{this} to not throw an error but #{act} was thrown' + , errorLike && errorLike.toString() + , (caughtErr instanceof Error ? + caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && + _.checkError.getConstructorName(caughtErr))) + ); + } + + if (errorLike && caughtErr) { + // We should compare instances only if `errorLike` is an instance of `Error` + if (errorLike instanceof Error) { + var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike); + + if (isCompatibleInstance === negate) { + // These checks were created to ensure we won't fail too soon when we've got both args and a negate + // See Issue #551 and PR #683@GitHub + if (everyArgIsDefined && negate) { + errorLikeFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : '') + , errorLike.toString() + , caughtErr.toString() + ); + } + } + } + + var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike); + if (isCompatibleConstructor === negate) { + if (everyArgIsDefined && negate) { + errorLikeFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') + , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + ); + } + } + } + + if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) { + // Here we check compatible messages + var placeholder = 'including'; + if (errMsgMatcher instanceof RegExp) { + placeholder = 'matching' + } + + var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher); + if (isCompatibleMessage === negate) { + if (everyArgIsDefined && negate) { + errMsgMatcherFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}' + , 'expected #{this} to throw error not ' + placeholder + ' #{exp}' + , errMsgMatcher + , _.checkError.getMessage(caughtErr) + ); + } + } + } + + // If both assertions failed and both should've matched we throw an error + if (errorLikeFail && errMsgMatcherFail) { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') + , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + ); + } + + flag(this, 'object', caughtErr); + }; + + Assertion.addMethod('throw', assertThrows); + Assertion.addMethod('throws', assertThrows); + Assertion.addMethod('Throw', assertThrows); + + /** + * ### .respondTo(method[, msg]) + * + * When the target is a non-function object, `.respondTo` asserts that the + * target has a method with the given name `method`. The method can be own or + * inherited, and it can be enumerable or non-enumerable. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(new Cat()).to.respondTo('meow'); + * + * When the target is a function, `.respondTo` asserts that the target's + * `prototype` property has a method with the given name `method`. Again, the + * method can be own or inherited, and it can be enumerable or non-enumerable. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(Cat).to.respondTo('meow'); + * + * Add `.itself` earlier in the chain to force `.respondTo` to treat the + * target as a non-function object, even if it's a function. Thus, it asserts + * that the target has a method with the given name `method`, rather than + * asserting that the target's `prototype` property has a method with the + * given name `method`. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * Cat.hiss = function () {}; + * + * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); + * + * When not adding `.itself`, it's important to check the target's type before + * using `.respondTo`. See the `.a` doc for info on checking a target's type. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(new Cat()).to.be.an('object').that.respondsTo('meow'); + * + * Add `.not` earlier in the chain to negate `.respondTo`. + * + * function Dog () {} + * Dog.prototype.bark = function () {}; + * + * expect(new Dog()).to.not.respondTo('meow'); + * + * `.respondTo` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect({}).to.respondTo('meow', 'nooo why fail??'); + * expect({}, 'nooo why fail??').to.respondTo('meow'); + * + * The alias `.respondsTo` can be used interchangeably with `.respondTo`. + * + * @name respondTo + * @alias respondsTo + * @param {String} method + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function respondTo (method, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , itself = flag(this, 'itself') + , context = ('function' === typeof obj && !itself) + ? obj.prototype[method] + : obj[method]; + + this.assert( + 'function' === typeof context + , 'expected #{this} to respond to ' + _.inspect(method) + , 'expected #{this} to not respond to ' + _.inspect(method) + ); + } + + Assertion.addMethod('respondTo', respondTo); + Assertion.addMethod('respondsTo', respondTo); + + /** + * ### .itself + * + * Forces all `.respondTo` assertions that follow in the chain to behave as if + * the target is a non-function object, even if it's a function. Thus, it + * causes `.respondTo` to assert that the target has a method with the given + * name, rather than asserting that the target's `prototype` property has a + * method with the given name. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * Cat.hiss = function () {}; + * + * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); + * + * @name itself + * @namespace BDD + * @api public + */ + + Assertion.addProperty('itself', function () { + flag(this, 'itself', true); + }); + + /** + * ### .satisfy(matcher[, msg]) + * + * Invokes the given `matcher` function with the target being passed as the + * first argument, and asserts that the value returned is truthy. + * + * expect(1).to.satisfy(function(num) { + * return num > 0; + * }); + * + * Add `.not` earlier in the chain to negate `.satisfy`. + * + * expect(1).to.not.satisfy(function(num) { + * return num > 2; + * }); + * + * `.satisfy` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1).to.satisfy(function(num) { + * return num > 2; + * }, 'nooo why fail??'); + * + * expect(1, 'nooo why fail??').to.satisfy(function(num) { + * return num > 2; + * }); + * + * The alias `.satisfies` can be used interchangeably with `.satisfy`. + * + * @name satisfy + * @alias satisfies + * @param {Function} matcher + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function satisfy (matcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var result = matcher(obj); + this.assert( + result + , 'expected #{this} to satisfy ' + _.objDisplay(matcher) + , 'expected #{this} to not satisfy' + _.objDisplay(matcher) + , flag(this, 'negate') ? false : true + , result + ); + } + + Assertion.addMethod('satisfy', satisfy); + Assertion.addMethod('satisfies', satisfy); + + /** + * ### .closeTo(expected, delta[, msg]) + * + * Asserts that the target is a number that's within a given +/- `delta` range + * of the given number `expected`. However, it's often best to assert that the + * target is equal to its expected value. + * + * // Recommended + * expect(1.5).to.equal(1.5); + * + * // Not recommended + * expect(1.5).to.be.closeTo(1, 0.5); + * expect(1.5).to.be.closeTo(2, 0.5); + * expect(1.5).to.be.closeTo(1, 1); + * + * Add `.not` earlier in the chain to negate `.closeTo`. + * + * expect(1.5).to.equal(1.5); // Recommended + * expect(1.5).to.not.be.closeTo(3, 1); // Not recommended + * + * `.closeTo` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??'); + * expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1); + * + * The alias `.approximately` can be used interchangeably with `.closeTo`. + * + * @name closeTo + * @alias approximately + * @param {Number} expected + * @param {Number} delta + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function closeTo(expected, delta, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + + new Assertion(obj, flagMsg, ssfi, true).is.a('number'); + if (typeof expected !== 'number' || typeof delta !== 'number') { + flagMsg = flagMsg ? flagMsg + ': ' : ''; + var deltaMessage = delta === undefined ? ", and a delta is required" : ""; + throw new AssertionError( + flagMsg + 'the arguments to closeTo or approximately must be numbers' + deltaMessage, + undefined, + ssfi + ); + } + + this.assert( + Math.abs(obj - expected) <= delta + , 'expected #{this} to be close to ' + expected + ' +/- ' + delta + , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta + ); + } + + Assertion.addMethod('closeTo', closeTo); + Assertion.addMethod('approximately', closeTo); + + // Note: Duplicates are ignored if testing for inclusion instead of sameness. + function isSubsetOf(subset, superset, cmp, contains, ordered) { + if (!contains) { + if (subset.length !== superset.length) return false; + superset = superset.slice(); + } + + return subset.every(function(elem, idx) { + if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx]; + + if (!cmp) { + var matchIdx = superset.indexOf(elem); + if (matchIdx === -1) return false; + + // Remove match from superset so not counted twice if duplicate in subset. + if (!contains) superset.splice(matchIdx, 1); + return true; + } + + return superset.some(function(elem2, matchIdx) { + if (!cmp(elem, elem2)) return false; + + // Remove match from superset so not counted twice if duplicate in subset. + if (!contains) superset.splice(matchIdx, 1); + return true; + }); + }); + } + + /** + * ### .members(set[, msg]) + * + * Asserts that the target array has the same members as the given array + * `set`. + * + * expect([1, 2, 3]).to.have.members([2, 1, 3]); + * expect([1, 2, 2]).to.have.members([2, 1, 2]); + * + * By default, members are compared using strict (`===`) equality. Add `.deep` + * earlier in the chain to use deep equality instead. See the `deep-eql` + * project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target array deeply (but not strictly) has member `{a: 1}` + * expect([{a: 1}]).to.have.deep.members([{a: 1}]); + * expect([{a: 1}]).to.not.have.members([{a: 1}]); + * + * By default, order doesn't matter. Add `.ordered` earlier in the chain to + * require that members appear in the same order. + * + * expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]); + * expect([1, 2, 3]).to.have.members([2, 1, 3]) + * .but.not.ordered.members([2, 1, 3]); + * + * By default, both arrays must be the same size. Add `.include` earlier in + * the chain to require that the target's members be a superset of the + * expected members. Note that duplicates are ignored in the subset when + * `.include` is added. + * + * // Target array is a superset of [1, 2] but not identical + * expect([1, 2, 3]).to.include.members([1, 2]); + * expect([1, 2, 3]).to.not.have.members([1, 2]); + * + * // Duplicates in the subset are ignored + * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); + * + * `.deep`, `.ordered`, and `.include` can all be combined. However, if + * `.include` and `.ordered` are combined, the ordering begins at the start of + * both arrays. + * + * expect([{a: 1}, {b: 2}, {c: 3}]) + * .to.include.deep.ordered.members([{a: 1}, {b: 2}]) + * .but.not.include.deep.ordered.members([{b: 2}, {c: 3}]); + * + * Add `.not` earlier in the chain to negate `.members`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the target array doesn't have all of the same members as + * the given array `set` but may or may not have some of them. It's often best + * to identify the exact output that's expected, and then write an assertion + * that only accepts that exact output. + * + * expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended + * expect([1, 2]).to.not.have.members([3, 4]); // Not recommended + * + * `.members` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??'); + * expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]); + * + * @name members + * @param {Array} set + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('members', function (subset, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + + new Assertion(obj, flagMsg, ssfi, true).to.be.an('array'); + new Assertion(subset, flagMsg, ssfi, true).to.be.an('array'); + + var contains = flag(this, 'contains'); + var ordered = flag(this, 'ordered'); + + var subject, failMsg, failNegateMsg; + + if (contains) { + subject = ordered ? 'an ordered superset' : 'a superset'; + failMsg = 'expected #{this} to be ' + subject + ' of #{exp}'; + failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}'; + } else { + subject = ordered ? 'ordered members' : 'members'; + failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}'; + failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}'; + } + + var cmp = flag(this, 'deep') ? _.eql : undefined; + + this.assert( + isSubsetOf(subset, obj, cmp, contains, ordered) + , failMsg + , failNegateMsg + , subset + , obj + , true + ); + }); + + /** + * ### .oneOf(list[, msg]) + * + * Asserts that the target is a member of the given array `list`. However, + * it's often best to assert that the target is equal to its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.oneOf([1, 2, 3]); // Not recommended + * + * Comparisons are performed using strict (`===`) equality. + * + * Add `.not` earlier in the chain to negate `.oneOf`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended + * + * It can also be chained with `.contain` or `.include`, which will work with + * both arrays and strings: + * + * expect('Today is sunny').to.contain.oneOf(['sunny', 'cloudy']) + * expect('Today is rainy').to.not.contain.oneOf(['sunny', 'cloudy']) + * expect([1,2,3]).to.contain.oneOf([3,4,5]) + * expect([1,2,3]).to.not.contain.oneOf([4,5,6]) + * + * `.oneOf` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]); + * + * @name oneOf + * @param {Array<*>} list + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function oneOf (list, msg) { + if (msg) flag(this, 'message', msg); + var expected = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi') + , contains = flag(this, 'contains') + , isDeep = flag(this, 'deep'); + new Assertion(list, flagMsg, ssfi, true).to.be.an('array'); + + if (contains) { + this.assert( + list.some(function(possibility) { return expected.indexOf(possibility) > -1 }) + , 'expected #{this} to contain one of #{exp}' + , 'expected #{this} to not contain one of #{exp}' + , list + , expected + ); + } else { + if (isDeep) { + this.assert( + list.some(function(possibility) { return _.eql(expected, possibility) }) + , 'expected #{this} to deeply equal one of #{exp}' + , 'expected #{this} to deeply equal one of #{exp}' + , list + , expected + ); + } else { + this.assert( + list.indexOf(expected) > -1 + , 'expected #{this} to be one of #{exp}' + , 'expected #{this} to not be one of #{exp}' + , list + , expected + ); + } + } + } + + Assertion.addMethod('oneOf', oneOf); + + /** + * ### .change(subject[, prop[, msg]]) + * + * When one argument is provided, `.change` asserts that the given function + * `subject` returns a different value when it's invoked before the target + * function compared to when it's invoked afterward. However, it's often best + * to assert that `subject` is equal to its expected value. + * + * var dots = '' + * , addDot = function () { dots += '.'; } + * , getDots = function () { return dots; }; + * + * // Recommended + * expect(getDots()).to.equal(''); + * addDot(); + * expect(getDots()).to.equal('.'); + * + * // Not recommended + * expect(addDot).to.change(getDots); + * + * When two arguments are provided, `.change` asserts that the value of the + * given object `subject`'s `prop` property is different before invoking the + * target function compared to afterward. + * + * var myObj = {dots: ''} + * , addDot = function () { myObj.dots += '.'; }; + * + * // Recommended + * expect(myObj).to.have.property('dots', ''); + * addDot(); + * expect(myObj).to.have.property('dots', '.'); + * + * // Not recommended + * expect(addDot).to.change(myObj, 'dots'); + * + * Strict (`===`) equality is used to compare before and after values. + * + * Add `.not` earlier in the chain to negate `.change`. + * + * var dots = '' + * , noop = function () {} + * , getDots = function () { return dots; }; + * + * expect(noop).to.not.change(getDots); + * + * var myObj = {dots: ''} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'dots'); + * + * `.change` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {dots: ''} + * , addDot = function () { myObj.dots += '.'; }; + * + * expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??'); + * + * var dots = '' + * , addDot = function () { dots += '.'; } + * , getDots = function () { return dots; }; + * + * expect(addDot, 'nooo why fail??').to.not.change(getDots); + * + * `.change` also causes all `.by` assertions that follow in the chain to + * assert how much a numeric subject was increased or decreased by. However, + * it's dangerous to use `.change.by`. The problem is that it creates + * uncertain expectations by asserting that the subject either increases by + * the given delta, or that it decreases by the given delta. It's often best + * to identify the exact output that's expected, and then write an assertion + * that only accepts that exact output. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; } + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * The alias `.changes` can be used interchangeably with `.change`. + * + * @name change + * @alias changes + * @param {String} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertChanges (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + // This gets flagged because of the .by(delta) assertion + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'change'); + flag(this, 'realDelta', final !== initial); + + this.assert( + initial !== final + , 'expected ' + msgObj + ' to change' + , 'expected ' + msgObj + ' to not change' + ); + } + + Assertion.addMethod('change', assertChanges); + Assertion.addMethod('changes', assertChanges); + + /** + * ### .increase(subject[, prop[, msg]]) + * + * When one argument is provided, `.increase` asserts that the given function + * `subject` returns a greater number when it's invoked after invoking the + * target function compared to when it's invoked beforehand. `.increase` also + * causes all `.by` assertions that follow in the chain to assert how much + * greater of a number is returned. It's often best to assert that the return + * value increased by the expected amount, rather than asserting it increased + * by any amount. + * + * var val = 1 + * , addTwo = function () { val += 2; } + * , getVal = function () { return val; }; + * + * expect(addTwo).to.increase(getVal).by(2); // Recommended + * expect(addTwo).to.increase(getVal); // Not recommended + * + * When two arguments are provided, `.increase` asserts that the value of the + * given object `subject`'s `prop` property is greater after invoking the + * target function compared to beforehand. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.increase(myObj, 'val'); // Not recommended + * + * Add `.not` earlier in the chain to negate `.increase`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either decreases, or that it stays the same. + * It's often best to identify the exact output that's expected, and then + * write an assertion that only accepts that exact output. + * + * When the subject is expected to decrease, it's often best to assert that it + * decreased by the expected amount. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended + * + * When the subject is expected to stay the same, it's often best to assert + * exactly that. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'val'); // Recommended + * expect(noop).to.not.increase(myObj, 'val'); // Not recommended + * + * `.increase` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.increase(myObj, 'val', 'nooo why fail??'); + * + * var val = 1 + * , noop = function () {} + * , getVal = function () { return val; }; + * + * expect(noop, 'nooo why fail??').to.increase(getVal); + * + * The alias `.increases` can be used interchangeably with `.increase`. + * + * @name increase + * @alias increases + * @param {String|Function} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertIncreases (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + // Make sure that the target is a number + new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'increase'); + flag(this, 'realDelta', final - initial); + + this.assert( + final - initial > 0 + , 'expected ' + msgObj + ' to increase' + , 'expected ' + msgObj + ' to not increase' + ); + } + + Assertion.addMethod('increase', assertIncreases); + Assertion.addMethod('increases', assertIncreases); + + /** + * ### .decrease(subject[, prop[, msg]]) + * + * When one argument is provided, `.decrease` asserts that the given function + * `subject` returns a lesser number when it's invoked after invoking the + * target function compared to when it's invoked beforehand. `.decrease` also + * causes all `.by` assertions that follow in the chain to assert how much + * lesser of a number is returned. It's often best to assert that the return + * value decreased by the expected amount, rather than asserting it decreased + * by any amount. + * + * var val = 1 + * , subtractTwo = function () { val -= 2; } + * , getVal = function () { return val; }; + * + * expect(subtractTwo).to.decrease(getVal).by(2); // Recommended + * expect(subtractTwo).to.decrease(getVal); // Not recommended + * + * When two arguments are provided, `.decrease` asserts that the value of the + * given object `subject`'s `prop` property is lesser after invoking the + * target function compared to beforehand. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended + * + * Add `.not` earlier in the chain to negate `.decrease`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either increases, or that it stays the same. + * It's often best to identify the exact output that's expected, and then + * write an assertion that only accepts that exact output. + * + * When the subject is expected to increase, it's often best to assert that it + * increased by the expected amount. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended + * + * When the subject is expected to stay the same, it's often best to assert + * exactly that. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'val'); // Recommended + * expect(noop).to.not.decrease(myObj, 'val'); // Not recommended + * + * `.decrease` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.decrease(myObj, 'val', 'nooo why fail??'); + * + * var val = 1 + * , noop = function () {} + * , getVal = function () { return val; }; + * + * expect(noop, 'nooo why fail??').to.decrease(getVal); + * + * The alias `.decreases` can be used interchangeably with `.decrease`. + * + * @name decrease + * @alias decreases + * @param {String|Function} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertDecreases (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + // Make sure that the target is a number + new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'decrease'); + flag(this, 'realDelta', initial - final); + + this.assert( + final - initial < 0 + , 'expected ' + msgObj + ' to decrease' + , 'expected ' + msgObj + ' to not decrease' + ); + } + + Assertion.addMethod('decrease', assertDecreases); + Assertion.addMethod('decreases', assertDecreases); + + /** + * ### .by(delta[, msg]) + * + * When following an `.increase` assertion in the chain, `.by` asserts that + * the subject of the `.increase` assertion increased by the given `delta`. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); + * + * When following a `.decrease` assertion in the chain, `.by` asserts that the + * subject of the `.decrease` assertion decreased by the given `delta`. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); + * + * When following a `.change` assertion in the chain, `.by` asserts that the + * subject of the `.change` assertion either increased or decreased by the + * given `delta`. However, it's dangerous to use `.change.by`. The problem is + * that it creates uncertain expectations. It's often best to identify the + * exact output that's expected, and then write an assertion that only accepts + * that exact output. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; } + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.by`. However, it's often best + * to assert that the subject changed by its expected delta, rather than + * asserting that it didn't change by one of countless unexpected deltas. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * // Recommended + * expect(addTwo).to.increase(myObj, 'val').by(2); + * + * // Not recommended + * expect(addTwo).to.increase(myObj, 'val').but.not.by(3); + * + * `.by` accepts an optional `msg` argument which is a custom error message to + * show when the assertion fails. The message can also be given as the second + * argument to `expect`. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??'); + * expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3); + * + * @name by + * @param {Number} delta + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertDelta(delta, msg) { + if (msg) flag(this, 'message', msg); + + var msgObj = flag(this, 'deltaMsgObj'); + var initial = flag(this, 'initialDeltaValue'); + var final = flag(this, 'finalDeltaValue'); + var behavior = flag(this, 'deltaBehavior'); + var realDelta = flag(this, 'realDelta'); + + var expression; + if (behavior === 'change') { + expression = Math.abs(final - initial) === Math.abs(delta); + } else { + expression = realDelta === Math.abs(delta); + } + + this.assert( + expression + , 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta + , 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta + ); + } + + Assertion.addMethod('by', assertDelta); + + /** + * ### .extensible + * + * Asserts that the target is extensible, which means that new properties can + * be added to it. Primitives are never extensible. + * + * expect({a: 1}).to.be.extensible; + * + * Add `.not` earlier in the chain to negate `.extensible`. + * + * var nonExtensibleObject = Object.preventExtensions({}) + * , sealedObject = Object.seal({}) + * , frozenObject = Object.freeze({}); + * + * expect(nonExtensibleObject).to.not.be.extensible; + * expect(sealedObject).to.not.be.extensible; + * expect(frozenObject).to.not.be.extensible; + * expect(1).to.not.be.extensible; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(1, 'nooo why fail??').to.be.extensible; + * + * @name extensible + * @namespace BDD + * @api public + */ + + Assertion.addProperty('extensible', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible + // The following provides ES6 behavior for ES5 environments. + + var isExtensible = obj === Object(obj) && Object.isExtensible(obj); + + this.assert( + isExtensible + , 'expected #{this} to be extensible' + , 'expected #{this} to not be extensible' + ); + }); + + /** + * ### .sealed + * + * Asserts that the target is sealed, which means that new properties can't be + * added to it, and its existing properties can't be reconfigured or deleted. + * However, it's possible that its existing properties can still be reassigned + * to different values. Primitives are always sealed. + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * expect(sealedObject).to.be.sealed; + * expect(frozenObject).to.be.sealed; + * expect(1).to.be.sealed; + * + * Add `.not` earlier in the chain to negate `.sealed`. + * + * expect({a: 1}).to.not.be.sealed; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.be.sealed; + * + * @name sealed + * @namespace BDD + * @api public + */ + + Assertion.addProperty('sealed', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed + // The following provides ES6 behavior for ES5 environments. + + var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true; + + this.assert( + isSealed + , 'expected #{this} to be sealed' + , 'expected #{this} to not be sealed' + ); + }); + + /** + * ### .frozen + * + * Asserts that the target is frozen, which means that new properties can't be + * added to it, and its existing properties can't be reassigned to different + * values, reconfigured, or deleted. Primitives are always frozen. + * + * var frozenObject = Object.freeze({}); + * + * expect(frozenObject).to.be.frozen; + * expect(1).to.be.frozen; + * + * Add `.not` earlier in the chain to negate `.frozen`. + * + * expect({a: 1}).to.not.be.frozen; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.be.frozen; + * + * @name frozen + * @namespace BDD + * @api public + */ + + Assertion.addProperty('frozen', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen + // The following provides ES6 behavior for ES5 environments. + + var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true; + + this.assert( + isFrozen + , 'expected #{this} to be frozen' + , 'expected #{this} to not be frozen' + ); + }); + + /** + * ### .finite + * + * Asserts that the target is a number, and isn't `NaN` or positive/negative + * `Infinity`. + * + * expect(1).to.be.finite; + * + * Add `.not` earlier in the chain to negate `.finite`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either isn't a number, or that it's `NaN`, or + * that it's positive `Infinity`, or that it's negative `Infinity`. It's often + * best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to be a number, it's often best to assert + * that it's the expected type, rather than asserting that it isn't one of + * many unexpected types. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.finite; // Not recommended + * + * When the target is expected to be `NaN`, it's often best to assert exactly + * that. + * + * expect(NaN).to.be.NaN; // Recommended + * expect(NaN).to.not.be.finite; // Not recommended + * + * When the target is expected to be positive infinity, it's often best to + * assert exactly that. + * + * expect(Infinity).to.equal(Infinity); // Recommended + * expect(Infinity).to.not.be.finite; // Not recommended + * + * When the target is expected to be negative infinity, it's often best to + * assert exactly that. + * + * expect(-Infinity).to.equal(-Infinity); // Recommended + * expect(-Infinity).to.not.be.finite; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect('foo', 'nooo why fail??').to.be.finite; + * + * @name finite + * @namespace BDD + * @api public + */ + + Assertion.addProperty('finite', function(msg) { + var obj = flag(this, 'object'); + + this.assert( + typeof obj === 'number' && isFinite(obj) + , 'expected #{this} to be a finite number' + , 'expected #{this} to not be a finite number' + ); + }); +}; + +},{}],6:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + /*! + * Chai dependencies. + */ + + var Assertion = chai.Assertion + , flag = util.flag; + + /*! + * Module export. + */ + + /** + * ### assert(expression, message) + * + * Write your own test expressions. + * + * assert('foo' !== 'bar', 'foo is not bar'); + * assert(Array.isArray([]), 'empty arrays are arrays'); + * + * @param {Mixed} expression to test for truthiness + * @param {String} message to display on error + * @name assert + * @namespace Assert + * @api public + */ + + var assert = chai.assert = function (express, errmsg) { + var test = new Assertion(null, null, chai.assert, true); + test.assert( + express + , errmsg + , '[ negation message unavailable ]' + ); + }; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. Node.js `assert` module-compatible. + * + * assert.fail(); + * assert.fail("custom error message"); + * assert.fail(1, 2); + * assert.fail(1, 2, "custom error message"); + * assert.fail(1, 2, "custom error message", ">"); + * assert.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace Assert + * @api public + */ + + assert.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + // Comply with Node's fail([message]) interface + + message = actual; + actual = undefined; + } + + message = message || 'assert.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, assert.fail); + }; + + /** + * ### .isOk(object, [message]) + * + * Asserts that `object` is truthy. + * + * assert.isOk('everything', 'everything is ok'); + * assert.isOk(false, 'this will fail'); + * + * @name isOk + * @alias ok + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isOk = function (val, msg) { + new Assertion(val, msg, assert.isOk, true).is.ok; + }; + + /** + * ### .isNotOk(object, [message]) + * + * Asserts that `object` is falsy. + * + * assert.isNotOk('everything', 'this will fail'); + * assert.isNotOk(false, 'this will pass'); + * + * @name isNotOk + * @alias notOk + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotOk = function (val, msg) { + new Assertion(val, msg, assert.isNotOk, true).is.not.ok; + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * assert.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.equal = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.equal, true); + + test.assert( + exp == flag(test, 'object') + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{act}' + , exp + , act + , true + ); + }; + + /** + * ### .notEqual(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * assert.notEqual(3, 4, 'these numbers are not equal'); + * + * @name notEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notEqual = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.notEqual, true); + + test.assert( + exp != flag(test, 'object') + , 'expected #{this} to not equal #{exp}' + , 'expected #{this} to equal #{act}' + , exp + , act + , true + ); + }; + + /** + * ### .strictEqual(actual, expected, [message]) + * + * Asserts strict equality (`===`) of `actual` and `expected`. + * + * assert.strictEqual(true, true, 'these booleans are strictly equal'); + * + * @name strictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.strictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.strictEqual, true).to.equal(exp); + }; + + /** + * ### .notStrictEqual(actual, expected, [message]) + * + * Asserts strict inequality (`!==`) of `actual` and `expected`. + * + * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); + * + * @name notStrictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notStrictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp); + }; + + /** + * ### .deepEqual(actual, expected, [message]) + * + * Asserts that `actual` is deeply equal to `expected`. + * + * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); + * + * @name deepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @alias deepStrictEqual + * @namespace Assert + * @api public + */ + + assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.deepEqual, true).to.eql(exp); + }; + + /** + * ### .notDeepEqual(actual, expected, [message]) + * + * Assert that `actual` is not deeply equal to `expected`. + * + * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); + * + * @name notDeepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp); + }; + + /** + * ### .isAbove(valueToCheck, valueToBeAbove, [message]) + * + * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`. + * + * assert.isAbove(5, 2, '5 is strictly greater than 2'); + * + * @name isAbove + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAbove + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAbove = function (val, abv, msg) { + new Assertion(val, msg, assert.isAbove, true).to.be.above(abv); + }; + + /** + * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message]) + * + * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`. + * + * assert.isAtLeast(5, 2, '5 is greater or equal to 2'); + * assert.isAtLeast(3, 3, '3 is greater or equal to 3'); + * + * @name isAtLeast + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtLeast + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtLeast = function (val, atlst, msg) { + new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst); + }; + + /** + * ### .isBelow(valueToCheck, valueToBeBelow, [message]) + * + * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`. + * + * assert.isBelow(3, 6, '3 is strictly less than 6'); + * + * @name isBelow + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeBelow + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBelow = function (val, blw, msg) { + new Assertion(val, msg, assert.isBelow, true).to.be.below(blw); + }; + + /** + * ### .isAtMost(valueToCheck, valueToBeAtMost, [message]) + * + * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`. + * + * assert.isAtMost(3, 6, '3 is less than or equal to 6'); + * assert.isAtMost(4, 4, '4 is less than or equal to 4'); + * + * @name isAtMost + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtMost + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtMost = function (val, atmst, msg) { + new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst); + }; + + /** + * ### .isTrue(value, [message]) + * + * Asserts that `value` is true. + * + * var teaServed = true; + * assert.isTrue(teaServed, 'the tea has been served'); + * + * @name isTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isTrue = function (val, msg) { + new Assertion(val, msg, assert.isTrue, true).is['true']; + }; + + /** + * ### .isNotTrue(value, [message]) + * + * Asserts that `value` is not true. + * + * var tea = 'tasty chai'; + * assert.isNotTrue(tea, 'great, time for tea!'); + * + * @name isNotTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotTrue = function (val, msg) { + new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true); + }; + + /** + * ### .isFalse(value, [message]) + * + * Asserts that `value` is false. + * + * var teaServed = false; + * assert.isFalse(teaServed, 'no tea yet? hmm...'); + * + * @name isFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFalse = function (val, msg) { + new Assertion(val, msg, assert.isFalse, true).is['false']; + }; + + /** + * ### .isNotFalse(value, [message]) + * + * Asserts that `value` is not false. + * + * var tea = 'tasty chai'; + * assert.isNotFalse(tea, 'great, time for tea!'); + * + * @name isNotFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFalse = function (val, msg) { + new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false); + }; + + /** + * ### .isNull(value, [message]) + * + * Asserts that `value` is null. + * + * assert.isNull(err, 'there was no error'); + * + * @name isNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNull = function (val, msg) { + new Assertion(val, msg, assert.isNull, true).to.equal(null); + }; + + /** + * ### .isNotNull(value, [message]) + * + * Asserts that `value` is not null. + * + * var tea = 'tasty chai'; + * assert.isNotNull(tea, 'great, time for tea!'); + * + * @name isNotNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNull = function (val, msg) { + new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null); + }; + + /** + * ### .isNaN + * + * Asserts that value is NaN. + * + * assert.isNaN(NaN, 'NaN is NaN'); + * + * @name isNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNaN = function (val, msg) { + new Assertion(val, msg, assert.isNaN, true).to.be.NaN; + }; + + /** + * ### .isNotNaN + * + * Asserts that value is not NaN. + * + * assert.isNotNaN(4, '4 is not NaN'); + * + * @name isNotNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + assert.isNotNaN = function (val, msg) { + new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN; + }; + + /** + * ### .exists + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * assert.exists(foo, 'foo is neither `null` nor `undefined`'); + * + * @name exists + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.exists = function (val, msg) { + new Assertion(val, msg, assert.exists, true).to.exist; + }; + + /** + * ### .notExists + * + * Asserts that the target is either `null` or `undefined`. + * + * var bar = null + * , baz; + * + * assert.notExists(bar); + * assert.notExists(baz, 'baz is either null or undefined'); + * + * @name notExists + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notExists = function (val, msg) { + new Assertion(val, msg, assert.notExists, true).to.not.exist; + }; + + /** + * ### .isUndefined(value, [message]) + * + * Asserts that `value` is `undefined`. + * + * var tea; + * assert.isUndefined(tea, 'no tea defined'); + * + * @name isUndefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isUndefined = function (val, msg) { + new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined); + }; + + /** + * ### .isDefined(value, [message]) + * + * Asserts that `value` is not `undefined`. + * + * var tea = 'cup of chai'; + * assert.isDefined(tea, 'tea has been defined'); + * + * @name isDefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isDefined = function (val, msg) { + new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined); + }; + + /** + * ### .isFunction(value, [message]) + * + * Asserts that `value` is a function. + * + * function serveTea() { return 'cup of tea'; }; + * assert.isFunction(serveTea, 'great, we can have tea now'); + * + * @name isFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFunction = function (val, msg) { + new Assertion(val, msg, assert.isFunction, true).to.be.a('function'); + }; + + /** + * ### .isNotFunction(value, [message]) + * + * Asserts that `value` is _not_ a function. + * + * var serveTea = [ 'heat', 'pour', 'sip' ]; + * assert.isNotFunction(serveTea, 'great, we have listed the steps'); + * + * @name isNotFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFunction = function (val, msg) { + new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function'); + }; + + /** + * ### .isObject(value, [message]) + * + * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`). + * _The assertion does not match subclassed objects._ + * + * var selection = { name: 'Chai', serve: 'with spices' }; + * assert.isObject(selection, 'tea selection is an object'); + * + * @name isObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isObject = function (val, msg) { + new Assertion(val, msg, assert.isObject, true).to.be.a('object'); + }; + + /** + * ### .isNotObject(value, [message]) + * + * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`). + * + * var selection = 'chai' + * assert.isNotObject(selection, 'tea selection is not an object'); + * assert.isNotObject(null, 'null is not an object'); + * + * @name isNotObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotObject = function (val, msg) { + new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object'); + }; + + /** + * ### .isArray(value, [message]) + * + * Asserts that `value` is an array. + * + * var menu = [ 'green', 'chai', 'oolong' ]; + * assert.isArray(menu, 'what kind of tea do we want?'); + * + * @name isArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isArray = function (val, msg) { + new Assertion(val, msg, assert.isArray, true).to.be.an('array'); + }; + + /** + * ### .isNotArray(value, [message]) + * + * Asserts that `value` is _not_ an array. + * + * var menu = 'green|chai|oolong'; + * assert.isNotArray(menu, 'what kind of tea do we want?'); + * + * @name isNotArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotArray = function (val, msg) { + new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array'); + }; + + /** + * ### .isString(value, [message]) + * + * Asserts that `value` is a string. + * + * var teaOrder = 'chai'; + * assert.isString(teaOrder, 'order placed'); + * + * @name isString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isString = function (val, msg) { + new Assertion(val, msg, assert.isString, true).to.be.a('string'); + }; + + /** + * ### .isNotString(value, [message]) + * + * Asserts that `value` is _not_ a string. + * + * var teaOrder = 4; + * assert.isNotString(teaOrder, 'order placed'); + * + * @name isNotString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotString = function (val, msg) { + new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string'); + }; + + /** + * ### .isNumber(value, [message]) + * + * Asserts that `value` is a number. + * + * var cups = 2; + * assert.isNumber(cups, 'how many cups'); + * + * @name isNumber + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNumber = function (val, msg) { + new Assertion(val, msg, assert.isNumber, true).to.be.a('number'); + }; + + /** + * ### .isNotNumber(value, [message]) + * + * Asserts that `value` is _not_ a number. + * + * var cups = '2 cups please'; + * assert.isNotNumber(cups, 'how many cups'); + * + * @name isNotNumber + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNumber = function (val, msg) { + new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number'); + }; + + /** + * ### .isFinite(value, [message]) + * + * Asserts that `value` is a finite number. Unlike `.isNumber`, this will fail for `NaN` and `Infinity`. + * + * var cups = 2; + * assert.isFinite(cups, 'how many cups'); + * + * assert.isFinite(NaN); // throws + * + * @name isFinite + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFinite = function (val, msg) { + new Assertion(val, msg, assert.isFinite, true).to.be.finite; + }; + + /** + * ### .isBoolean(value, [message]) + * + * Asserts that `value` is a boolean. + * + * var teaReady = true + * , teaServed = false; + * + * assert.isBoolean(teaReady, 'is the tea ready'); + * assert.isBoolean(teaServed, 'has tea been served'); + * + * @name isBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBoolean = function (val, msg) { + new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean'); + }; + + /** + * ### .isNotBoolean(value, [message]) + * + * Asserts that `value` is _not_ a boolean. + * + * var teaReady = 'yep' + * , teaServed = 'nope'; + * + * assert.isNotBoolean(teaReady, 'is the tea ready'); + * assert.isNotBoolean(teaServed, 'has tea been served'); + * + * @name isNotBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotBoolean = function (val, msg) { + new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean'); + }; + + /** + * ### .typeOf(value, name, [message]) + * + * Asserts that `value`'s type is `name`, as determined by + * `Object.prototype.toString`. + * + * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); + * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); + * assert.typeOf('tea', 'string', 'we have a string'); + * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); + * assert.typeOf(null, 'null', 'we have a null'); + * assert.typeOf(undefined, 'undefined', 'we have an undefined'); + * + * @name typeOf + * @param {Mixed} value + * @param {String} name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.typeOf = function (val, type, msg) { + new Assertion(val, msg, assert.typeOf, true).to.be.a(type); + }; + + /** + * ### .notTypeOf(value, name, [message]) + * + * Asserts that `value`'s type is _not_ `name`, as determined by + * `Object.prototype.toString`. + * + * assert.notTypeOf('tea', 'number', 'strings are not numbers'); + * + * @name notTypeOf + * @param {Mixed} value + * @param {String} typeof name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notTypeOf = function (val, type, msg) { + new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type); + }; + + /** + * ### .instanceOf(object, constructor, [message]) + * + * Asserts that `value` is an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new Tea('chai'); + * + * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); + * + * @name instanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.instanceOf = function (val, type, msg) { + new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type); + }; + + /** + * ### .notInstanceOf(object, constructor, [message]) + * + * Asserts `value` is not an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new String('chai'); + * + * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); + * + * @name notInstanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInstanceOf = function (val, type, msg) { + new Assertion(val, msg, assert.notInstanceOf, true) + .to.not.be.instanceOf(type); + }; + + /** + * ### .include(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Can be used to assert the + * inclusion of a value in an array, a substring in a string, or a subset of + * properties in an object. + * + * assert.include([1,2,3], 2, 'array contains value'); + * assert.include('foobar', 'foo', 'string contains substring'); + * assert.include({ foo: 'bar', hello: 'universe' }, { foo: 'bar' }, 'object contains property'); + * + * Strict equality (===) is used. When asserting the inclusion of a value in + * an array, the array is searched for an element that's strictly equal to the + * given value. When asserting a subset of properties in an object, the object + * is searched for the given property keys, checking that each one is present + * and strictly equal to the given property value. For instance: + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.include([obj1, obj2], obj1); + * assert.include({foo: obj1, bar: obj2}, {foo: obj1}); + * assert.include({foo: obj1, bar: obj2}, {foo: obj1, bar: obj2}); + * + * @name include + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.include = function (exp, inc, msg) { + new Assertion(exp, msg, assert.include, true).include(inc); + }; + + /** + * ### .notInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Can be used to assert + * the absence of a value in an array, a substring in a string, or a subset of + * properties in an object. + * + * assert.notInclude([1,2,3], 4, "array doesn't contain value"); + * assert.notInclude('foobar', 'baz', "string doesn't contain substring"); + * assert.notInclude({ foo: 'bar', hello: 'universe' }, { foo: 'baz' }, 'object doesn't contain property'); + * + * Strict equality (===) is used. When asserting the absence of a value in an + * array, the array is searched to confirm the absence of an element that's + * strictly equal to the given value. When asserting a subset of properties in + * an object, the object is searched to confirm that at least one of the given + * property keys is either not present or not strictly equal to the given + * property value. For instance: + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.notInclude([obj1, obj2], {a: 1}); + * assert.notInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); + * assert.notInclude({foo: obj1, bar: obj2}, {foo: obj1, bar: {b: 2}}); + * + * @name notInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notInclude, true).not.include(inc); + }; + + /** + * ### .deepInclude(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Can be used to assert the + * inclusion of a value in an array or a subset of properties in an object. + * Deep equality is used. + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.deepInclude([obj1, obj2], {a: 1}); + * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); + * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 2}}); + * + * @name deepInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc); + }; + + /** + * ### .notDeepInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Can be used to assert + * the absence of a value in an array or a subset of properties in an object. + * Deep equality is used. + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.notDeepInclude([obj1, obj2], {a: 9}); + * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 9}}); + * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 9}}); + * + * @name notDeepInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); + }; + + /** + * ### .nestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.nestedInclude({'.a': {'b': 'x'}}, {'\\.a.[b]': 'x'}); + * assert.nestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'x'}); + * + * @name nestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc); + }; + + /** + * ### .notNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' does not include 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.notNestedInclude({'.a': {'b': 'x'}}, {'\\.a.b': 'y'}); + * assert.notNestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'y'}); + * + * @name notNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notNestedInclude, true) + .not.nested.include(inc); + }; + + /** + * ### .deepNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while checking for deep equality. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.deepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {x: 1}}); + * assert.deepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {x: 1}}); + * + * @name deepNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepNestedInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.deepNestedInclude, true) + .deep.nested.include(inc); + }; + + /** + * ### .notDeepNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' does not include 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while checking for deep equality. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.notDeepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {y: 1}}) + * assert.notDeepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {y: 2}}); + * + * @name notDeepNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepNestedInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepNestedInclude, true) + .not.deep.nested.include(inc); + }; + + /** + * ### .ownInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while ignoring inherited properties. + * + * assert.ownInclude({ a: 1 }, { a: 1 }); + * + * @name ownInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.ownInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.ownInclude, true).own.include(inc); + }; + + /** + * ### .notOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while ignoring inherited properties. + * + * Object.prototype.b = 2; + * + * assert.notOwnInclude({ a: 1 }, { b: 2 }); + * + * @name notOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc); + }; + + /** + * ### .deepOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while ignoring inherited properties and checking for deep equality. + * + * assert.deepOwnInclude({a: {b: 2}}, {a: {b: 2}}); + * + * @name deepOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.deepOwnInclude, true) + .deep.own.include(inc); + }; + + /** + * ### .notDeepOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while ignoring inherited properties and checking for deep equality. + * + * assert.notDeepOwnInclude({a: {b: 2}}, {a: {c: 3}}); + * + * @name notDeepOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepOwnInclude, true) + .not.deep.own.include(inc); + }; + + /** + * ### .match(value, regexp, [message]) + * + * Asserts that `value` matches the regular expression `regexp`. + * + * assert.match('foobar', /^foo/, 'regexp matches'); + * + * @name match + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.match = function (exp, re, msg) { + new Assertion(exp, msg, assert.match, true).to.match(re); + }; + + /** + * ### .notMatch(value, regexp, [message]) + * + * Asserts that `value` does not match the regular expression `regexp`. + * + * assert.notMatch('foobar', /^foo/, 'regexp does not match'); + * + * @name notMatch + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notMatch = function (exp, re, msg) { + new Assertion(exp, msg, assert.notMatch, true).to.not.match(re); + }; + + /** + * ### .property(object, property, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property`. + * + * assert.property({ tea: { green: 'matcha' }}, 'tea'); + * assert.property({ tea: { green: 'matcha' }}, 'toString'); + * + * @name property + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.property = function (obj, prop, msg) { + new Assertion(obj, msg, assert.property, true).to.have.property(prop); + }; + + /** + * ### .notProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property`. + * + * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); + * + * @name notProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notProperty, true) + .to.not.have.property(prop); + }; + + /** + * ### .propertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property` with a value given by `value`. Uses a strict equality check + * (===). + * + * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); + * + * @name propertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.propertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.propertyVal, true) + .to.have.property(prop, val); + }; + + /** + * ### .notPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property` with value given by `value`. Uses a strict equality check + * (===). + * + * assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad'); + * assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good'); + * + * @name notPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notPropertyVal, true) + .to.not.have.property(prop, val); + }; + + /** + * ### .deepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property` with a value given by `value`. Uses a deep equality check. + * + * assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); + * + * @name deepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.deepPropertyVal, true) + .to.have.deep.property(prop, val); + }; + + /** + * ### .notDeepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property` with value given by `value`. Uses a deep equality check. + * + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); + * + * @name notDeepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notDeepPropertyVal, true) + .to.not.have.deep.property(prop, val); + }; + + /** + * ### .ownProperty(object, property, [message]) + * + * Asserts that `object` has a direct property named by `property`. Inherited + * properties aren't checked. + * + * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea'); + * + * @name ownProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @api public + */ + + assert.ownProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.ownProperty, true) + .to.have.own.property(prop); + }; + + /** + * ### .notOwnProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a direct property named by + * `property`. Inherited properties aren't checked. + * + * assert.notOwnProperty({ tea: { green: 'matcha' }}, 'coffee'); + * assert.notOwnProperty({}, 'toString'); + * + * @name notOwnProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @api public + */ + + assert.notOwnProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notOwnProperty, true) + .to.not.have.own.property(prop); + }; + + /** + * ### .ownPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct property named by `property` and a value + * equal to the provided `value`. Uses a strict equality check (===). + * Inherited properties aren't checked. + * + * assert.ownPropertyVal({ coffee: 'is good'}, 'coffee', 'is good'); + * + * @name ownPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.ownPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.ownPropertyVal, true) + .to.have.own.property(prop, value); + }; + + /** + * ### .notOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct property named by `property` + * with a value equal to the provided `value`. Uses a strict equality check + * (===). Inherited properties aren't checked. + * + * assert.notOwnPropertyVal({ tea: 'is better'}, 'tea', 'is worse'); + * assert.notOwnPropertyVal({}, 'toString', Object.prototype.toString); + * + * @name notOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.notOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.notOwnPropertyVal, true) + .to.not.have.own.property(prop, value); + }; + + /** + * ### .deepOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct property named by `property` and a value + * equal to the provided `value`. Uses a deep equality check. Inherited + * properties aren't checked. + * + * assert.deepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); + * + * @name deepOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.deepOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.deepOwnPropertyVal, true) + .to.have.deep.own.property(prop, value); + }; + + /** + * ### .notDeepOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct property named by `property` + * with a value equal to the provided `value`. Uses a deep equality check. + * Inherited properties aren't checked. + * + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); + * assert.notDeepOwnPropertyVal({}, 'toString', Object.prototype.toString); + * + * @name notDeepOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true) + .to.not.have.deep.own.property(prop, value); + }; + + /** + * ### .nestedProperty(object, property, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property`, which can be a string using dot- and bracket-notation for + * nested reference. + * + * assert.nestedProperty({ tea: { green: 'matcha' }}, 'tea.green'); + * + * @name nestedProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.nestedProperty, true) + .to.have.nested.property(prop); + }; + + /** + * ### .notNestedProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a property named by `property`, which + * can be a string using dot- and bracket-notation for nested reference. The + * property cannot exist on the object nor anywhere in its prototype chain. + * + * assert.notNestedProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); + * + * @name notNestedProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notNestedProperty, true) + .to.not.have.nested.property(prop); + }; + + /** + * ### .nestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with value given + * by `value`. `property` can use dot- and bracket-notation for nested + * reference. Uses a strict equality check (===). + * + * assert.nestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); + * + * @name nestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.nestedPropertyVal, true) + .to.have.nested.property(prop, val); + }; + + /** + * ### .notNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a property named by `property` with + * value given by `value`. `property` can use dot- and bracket-notation for + * nested reference. Uses a strict equality check (===). + * + * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); + * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'coffee.green', 'matcha'); + * + * @name notNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notNestedPropertyVal, true) + .to.not.have.nested.property(prop, val); + }; + + /** + * ### .deepNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with a value given + * by `value`. `property` can use dot- and bracket-notation for nested + * reference. Uses a deep equality check. + * + * assert.deepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yum' }); + * + * @name deepNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.deepNestedPropertyVal, true) + .to.have.deep.nested.property(prop, val); + }; + + /** + * ### .notDeepNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a property named by `property` with + * value given by `value`. `property` can use dot- and bracket-notation for + * nested reference. Uses a deep equality check. + * + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { oolong: 'yum' }); + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yuck' }); + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.black', { matcha: 'yum' }); + * + * @name notDeepNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true) + .to.not.have.deep.nested.property(prop, val); + } + + /** + * ### .lengthOf(object, length, [message]) + * + * Asserts that `object` has a `length` or `size` with the expected value. + * + * assert.lengthOf([1,2,3], 3, 'array has length of 3'); + * assert.lengthOf('foobar', 6, 'string has length of 6'); + * assert.lengthOf(new Set([1,2,3]), 3, 'set has size of 3'); + * assert.lengthOf(new Map([['a',1],['b',2],['c',3]]), 3, 'map has size of 3'); + * + * @name lengthOf + * @param {Mixed} object + * @param {Number} length + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.lengthOf = function (exp, len, msg) { + new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); + }; + + /** + * ### .hasAnyKeys(object, [keys], [message]) + * + * Asserts that `object` has at least one of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'iDontExist', 'baz']); + * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, iDontExist: 99, baz: 1337}); + * assert.hasAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.hasAnyKeys(new Set([{foo: 'bar'}, 'anotherKey']), [{foo: 'bar'}, 'anotherKey']); + * + * @name hasAnyKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAnyKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); + } + + /** + * ### .hasAllKeys(object, [keys], [message]) + * + * Asserts that `object` has all and only all of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); + * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337]); + * assert.hasAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.hasAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); + * + * @name hasAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); + } + + /** + * ### .containsAllKeys(object, [keys], [message]) + * + * Asserts that `object` has all of the `keys` provided but may have more keys not listed. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'baz']); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, baz: 1337}); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337}); + * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}]); + * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}]); + * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); + * + * @name containsAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.containsAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.containsAllKeys, true) + .to.contain.all.keys(keys); + } + + /** + * ### .doesNotHaveAnyKeys(object, [keys], [message]) + * + * Asserts that `object` has none of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); + * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); + * assert.doesNotHaveAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); + * assert.doesNotHaveAnyKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); + * + * @name doesNotHaveAnyKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAnyKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true) + .to.not.have.any.keys(keys); + } + + /** + * ### .doesNotHaveAllKeys(object, [keys], [message]) + * + * Asserts that `object` does not have at least one of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); + * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); + * assert.doesNotHaveAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); + * assert.doesNotHaveAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); + * + * @name doesNotHaveAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAllKeys, true) + .to.not.have.all.keys(keys); + } + + /** + * ### .hasAnyDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has at least one of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {three: 'three'}]); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name hasAnyDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAnyDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAnyDeepKeys, true) + .to.have.any.deep.keys(keys); + } + + /** + * ### .hasAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has all and only all of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne']]), {one: 'one'}); + * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAllDeepKeys(new Set([{one: 'one'}]), {one: 'one'}); + * assert.hasAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name hasAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAllDeepKeys, true) + .to.have.all.deep.keys(keys); + } + + /** + * ### .containsAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` contains all of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); + * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); + * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name containsAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.containsAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.containsAllDeepKeys, true) + .to.contain.all.deep.keys(keys); + } + + /** + * ### .doesNotHaveAnyDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has none of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); + * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); + * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); + * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); + * + * @name doesNotHaveAnyDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true) + .to.not.have.any.deep.keys(keys); + } + + /** + * ### .doesNotHaveAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` does not have at least one of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); + * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {one: 'one'}]); + * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); + * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {fifty: 'fifty'}]); + * + * @name doesNotHaveAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true) + .to.not.have.all.deep.keys(keys); + } + + /** + * ### .throws(fn, [errorLike/string/regexp], [string/regexp], [message]) + * + * If `errorLike` is an `Error` constructor, asserts that `fn` will throw an error that is an + * instance of `errorLike`. + * If `errorLike` is an `Error` instance, asserts that the error thrown is the same + * instance as `errorLike`. + * If `errMsgMatcher` is provided, it also asserts that the error thrown will have a + * message matching `errMsgMatcher`. + * + * assert.throws(fn, 'Error thrown must have this msg'); + * assert.throws(fn, /Error thrown must have a msg that matches this/); + * assert.throws(fn, ReferenceError); + * assert.throws(fn, errorInstance); + * assert.throws(fn, ReferenceError, 'Error thrown must be a ReferenceError and have this msg'); + * assert.throws(fn, errorInstance, 'Error thrown must be the same errorInstance and have this msg'); + * assert.throws(fn, ReferenceError, /Error thrown must be a ReferenceError and match this/); + * assert.throws(fn, errorInstance, /Error thrown must be the same errorInstance and match this/); + * + * @name throws + * @alias throw + * @alias Throw + * @param {Function} fn + * @param {ErrorConstructor|Error} errorLike + * @param {RegExp|String} errMsgMatcher + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.throws = function (fn, errorLike, errMsgMatcher, msg) { + if ('string' === typeof errorLike || errorLike instanceof RegExp) { + errMsgMatcher = errorLike; + errorLike = null; + } + + var assertErr = new Assertion(fn, msg, assert.throws, true) + .to.throw(errorLike, errMsgMatcher); + return flag(assertErr, 'object'); + }; + + /** + * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message]) + * + * If `errorLike` is an `Error` constructor, asserts that `fn` will _not_ throw an error that is an + * instance of `errorLike`. + * If `errorLike` is an `Error` instance, asserts that the error thrown is _not_ the same + * instance as `errorLike`. + * If `errMsgMatcher` is provided, it also asserts that the error thrown will _not_ have a + * message matching `errMsgMatcher`. + * + * assert.doesNotThrow(fn, 'Any Error thrown must not have this message'); + * assert.doesNotThrow(fn, /Any Error thrown must not match this/); + * assert.doesNotThrow(fn, Error); + * assert.doesNotThrow(fn, errorInstance); + * assert.doesNotThrow(fn, Error, 'Error must not have this message'); + * assert.doesNotThrow(fn, errorInstance, 'Error must not have this message'); + * assert.doesNotThrow(fn, Error, /Error must not match this/); + * assert.doesNotThrow(fn, errorInstance, /Error must not match this/); + * + * @name doesNotThrow + * @param {Function} fn + * @param {ErrorConstructor} errorLike + * @param {RegExp|String} errMsgMatcher + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) { + if ('string' === typeof errorLike || errorLike instanceof RegExp) { + errMsgMatcher = errorLike; + errorLike = null; + } + + new Assertion(fn, msg, assert.doesNotThrow, true) + .to.not.throw(errorLike, errMsgMatcher); + }; + + /** + * ### .operator(val1, operator, val2, [message]) + * + * Compares two values using `operator`. + * + * assert.operator(1, '<', 2, 'everything is ok'); + * assert.operator(1, '>', 2, 'this will fail'); + * + * @name operator + * @param {Mixed} val1 + * @param {String} operator + * @param {Mixed} val2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.operator = function (val, operator, val2, msg) { + var ok; + switch(operator) { + case '==': + ok = val == val2; + break; + case '===': + ok = val === val2; + break; + case '>': + ok = val > val2; + break; + case '>=': + ok = val >= val2; + break; + case '<': + ok = val < val2; + break; + case '<=': + ok = val <= val2; + break; + case '!=': + ok = val != val2; + break; + case '!==': + ok = val !== val2; + break; + default: + msg = msg ? msg + ': ' : msg; + throw new chai.AssertionError( + msg + 'Invalid operator "' + operator + '"', + undefined, + assert.operator + ); + } + var test = new Assertion(ok, msg, assert.operator, true); + test.assert( + true === flag(test, 'object') + , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) + , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); + }; + + /** + * ### .closeTo(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); + * + * @name closeTo + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.closeTo = function (act, exp, delta, msg) { + new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); + }; + + /** + * ### .approximately(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.approximately(1.5, 1, 0.5, 'numbers are close'); + * + * @name approximately + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.approximately = function (act, exp, delta, msg) { + new Assertion(act, msg, assert.approximately, true) + .to.be.approximately(exp, delta); + }; + + /** + * ### .sameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in any order. Uses a + * strict equality check (===). + * + * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); + * + * @name sameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameMembers, true) + .to.have.same.members(set2); + } + + /** + * ### .notSameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in any order. + * Uses a strict equality check (===). + * + * assert.notSameMembers([ 1, 2, 3 ], [ 5, 1, 3 ], 'not same members'); + * + * @name notSameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameMembers, true) + .to.not.have.same.members(set2); + } + + /** + * ### .sameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in any order. Uses a + * deep equality check. + * + * assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members'); + * + * @name sameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameDeepMembers, true) + .to.have.same.deep.members(set2); + } + + /** + * ### .notSameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in any order. + * Uses a deep equality check. + * + * assert.notSameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { f: 5 }], 'not same deep members'); + * + * @name notSameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameDeepMembers, true) + .to.not.have.same.deep.members(set2); + } + + /** + * ### .sameOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in the same order. + * Uses a strict equality check (===). + * + * assert.sameOrderedMembers([ 1, 2, 3 ], [ 1, 2, 3 ], 'same ordered members'); + * + * @name sameOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameOrderedMembers, true) + .to.have.same.ordered.members(set2); + } + + /** + * ### .notSameOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in the same + * order. Uses a strict equality check (===). + * + * assert.notSameOrderedMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'not same ordered members'); + * + * @name notSameOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameOrderedMembers, true) + .to.not.have.same.ordered.members(set2); + } + + /** + * ### .sameDeepOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in the same order. + * Uses a deep equality check. + * + * assert.sameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { c: 3 } ], 'same deep ordered members'); + * + * @name sameDeepOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameDeepOrderedMembers, true) + .to.have.same.deep.ordered.members(set2); + } + + /** + * ### .notSameDeepOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in the same + * order. Uses a deep equality check. + * + * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { z: 5 } ], 'not same deep ordered members'); + * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { c: 3 } ], 'not same deep ordered members'); + * + * @name notSameDeepOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameDeepOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true) + .to.not.have.same.deep.ordered.members(set2); + } + + /** + * ### .includeMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in any order. Uses a + * strict equality check (===). Duplicates are ignored. + * + * assert.includeMembers([ 1, 2, 3 ], [ 2, 1, 2 ], 'include members'); + * + * @name includeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeMembers, true) + .to.include.members(subset); + } + + /** + * ### .notIncludeMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in any order. Uses a + * strict equality check (===). Duplicates are ignored. + * + * assert.notIncludeMembers([ 1, 2, 3 ], [ 5, 1 ], 'not include members'); + * + * @name notIncludeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeMembers, true) + .to.not.include.members(subset); + } + + /** + * ### .includeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in any order. Uses a deep + * equality check. Duplicates are ignored. + * + * assert.includeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { b: 2 } ], 'include deep members'); + * + * @name includeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeDeepMembers, true) + .to.include.deep.members(subset); + } + + /** + * ### .notIncludeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in any order. Uses a + * deep equality check. Duplicates are ignored. + * + * assert.notIncludeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { f: 5 } ], 'not include deep members'); + * + * @name notIncludeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeDeepMembers, true) + .to.not.include.deep.members(subset); + } + + /** + * ### .includeOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in the same order + * beginning with the first element in `superset`. Uses a strict equality + * check (===). + * + * assert.includeOrderedMembers([ 1, 2, 3 ], [ 1, 2 ], 'include ordered members'); + * + * @name includeOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeOrderedMembers, true) + .to.include.ordered.members(subset); + } + + /** + * ### .notIncludeOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in the same order + * beginning with the first element in `superset`. Uses a strict equality + * check (===). + * + * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 1 ], 'not include ordered members'); + * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 3 ], 'not include ordered members'); + * + * @name notIncludeOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeOrderedMembers, true) + .to.not.include.ordered.members(subset); + } + + /** + * ### .includeDeepOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in the same order + * beginning with the first element in `superset`. Uses a deep equality + * check. + * + * assert.includeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 } ], 'include deep ordered members'); + * + * @name includeDeepOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeDeepOrderedMembers, true) + .to.include.deep.ordered.members(subset); + } + + /** + * ### .notIncludeDeepOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in the same order + * beginning with the first element in `superset`. Uses a deep equality + * check. + * + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { f: 5 } ], 'not include deep ordered members'); + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 } ], 'not include deep ordered members'); + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { c: 3 } ], 'not include deep ordered members'); + * + * @name notIncludeDeepOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true) + .to.not.include.deep.ordered.members(subset); + } + + /** + * ### .oneOf(inList, list, [message]) + * + * Asserts that non-object, non-array value `inList` appears in the flat array `list`. + * + * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); + * + * @name oneOf + * @param {*} inList + * @param {Array<*>} list + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.oneOf = function (inList, list, msg) { + new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list); + } + + /** + * ### .changes(function, object, property, [message]) + * + * Asserts that a function changes the value of a property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 22 }; + * assert.changes(fn, obj, 'val'); + * + * @name changes + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changes = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changes, true).to.change(obj, prop); + } + + /** + * ### .changesBy(function, object, property, delta, [message]) + * + * Asserts that a function changes the value of a property by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 2 }; + * assert.changesBy(fn, obj, 'val', 2); + * + * @name changesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changesBy, true) + .to.change(obj, prop).by(delta); + } + + /** + * ### .doesNotChange(function, object, property, [message]) + * + * Asserts that a function does not change the value of a property. + * + * var obj = { val: 10 }; + * var fn = function() { console.log('foo'); }; + * assert.doesNotChange(fn, obj, 'val'); + * + * @name doesNotChange + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotChange = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotChange, true) + .to.not.change(obj, prop); + } + + /** + * ### .changesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not change the value of a property or of a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 10 }; + * assert.changesButNotBy(fn, obj, 'val', 5); + * + * @name changesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changesButNotBy, true) + .to.change(obj, prop).but.not.by(delta); + } + + /** + * ### .increases(function, object, property, [message]) + * + * Asserts that a function increases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 13 }; + * assert.increases(fn, obj, 'val'); + * + * @name increases + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.increases, true) + .to.increase(obj, prop); + } + + /** + * ### .increasesBy(function, object, property, delta, [message]) + * + * Asserts that a function increases a numeric object property or a function's return value by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 10 }; + * assert.increasesBy(fn, obj, 'val', 10); + * + * @name increasesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increasesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.increasesBy, true) + .to.increase(obj, prop).by(delta); + } + + /** + * ### .doesNotIncrease(function, object, property, [message]) + * + * Asserts that a function does not increase a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 8 }; + * assert.doesNotIncrease(fn, obj, 'val'); + * + * @name doesNotIncrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotIncrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotIncrease, true) + .to.not.increase(obj, prop); + } + + /** + * ### .increasesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not increase a numeric object property or function's return value by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.increasesButNotBy(fn, obj, 'val', 10); + * + * @name increasesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increasesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.increasesButNotBy, true) + .to.increase(obj, prop).but.not.by(delta); + } + + /** + * ### .decreases(function, object, property, [message]) + * + * Asserts that a function decreases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreases(fn, obj, 'val'); + * + * @name decreases + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.decreases, true) + .to.decrease(obj, prop); + } + + /** + * ### .decreasesBy(function, object, property, delta, [message]) + * + * Asserts that a function decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val -= 5 }; + * assert.decreasesBy(fn, obj, 'val', 5); + * + * @name decreasesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreasesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.decreasesBy, true) + .to.decrease(obj, prop).by(delta); + } + + /** + * ### .doesNotDecrease(function, object, property, [message]) + * + * Asserts that a function does not decreases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.doesNotDecrease(fn, obj, 'val'); + * + * @name doesNotDecrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotDecrease, true) + .to.not.decrease(obj, prop); + } + + /** + * ### .doesNotDecreaseBy(function, object, property, delta, [message]) + * + * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.doesNotDecreaseBy(fn, obj, 'val', 1); + * + * @name doesNotDecreaseBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotDecreaseBy, true) + .to.not.decrease(obj, prop).by(delta); + } + + /** + * ### .decreasesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreasesButNotBy(fn, obj, 'val', 1); + * + * @name decreasesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.decreasesButNotBy, true) + .to.decrease(obj, prop).but.not.by(delta); + } + + /*! + * ### .ifError(object) + * + * Asserts if value is not a false value, and throws if it is a true value. + * This is added to allow for chai to be a drop-in replacement for Node's + * assert class. + * + * var err = new Error('I am a custom error'); + * assert.ifError(err); // Rethrows err! + * + * @name ifError + * @param {Object} object + * @namespace Assert + * @api public + */ + + assert.ifError = function (val) { + if (val) { + throw(val); + } + }; + + /** + * ### .isExtensible(object) + * + * Asserts that `object` is extensible (can have new properties added to it). + * + * assert.isExtensible({}); + * + * @name isExtensible + * @alias extensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isExtensible = function (obj, msg) { + new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible; + }; + + /** + * ### .isNotExtensible(object) + * + * Asserts that `object` is _not_ extensible. + * + * var nonExtensibleObject = Object.preventExtensions({}); + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * assert.isNotExtensible(nonExtensibleObject); + * assert.isNotExtensible(sealedObject); + * assert.isNotExtensible(frozenObject); + * + * @name isNotExtensible + * @alias notExtensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotExtensible = function (obj, msg) { + new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; + }; + + /** + * ### .isSealed(object) + * + * Asserts that `object` is sealed (cannot have new properties added to it + * and its existing properties cannot be removed). + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.seal({}); + * + * assert.isSealed(sealedObject); + * assert.isSealed(frozenObject); + * + * @name isSealed + * @alias sealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isSealed = function (obj, msg) { + new Assertion(obj, msg, assert.isSealed, true).to.be.sealed; + }; + + /** + * ### .isNotSealed(object) + * + * Asserts that `object` is _not_ sealed. + * + * assert.isNotSealed({}); + * + * @name isNotSealed + * @alias notSealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotSealed = function (obj, msg) { + new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed; + }; + + /** + * ### .isFrozen(object) + * + * Asserts that `object` is frozen (cannot have new properties added to it + * and its existing properties cannot be modified). + * + * var frozenObject = Object.freeze({}); + * assert.frozen(frozenObject); + * + * @name isFrozen + * @alias frozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isFrozen = function (obj, msg) { + new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen; + }; + + /** + * ### .isNotFrozen(object) + * + * Asserts that `object` is _not_ frozen. + * + * assert.isNotFrozen({}); + * + * @name isNotFrozen + * @alias notFrozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotFrozen = function (obj, msg) { + new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; + }; + + /** + * ### .isEmpty(target) + * + * Asserts that the target does not contain any values. + * For arrays and strings, it checks the `length` property. + * For `Map` and `Set` instances, it checks the `size` property. + * For non-function objects, it gets the count of own + * enumerable string keys. + * + * assert.isEmpty([]); + * assert.isEmpty(''); + * assert.isEmpty(new Map); + * assert.isEmpty({}); + * + * @name isEmpty + * @alias empty + * @param {Object|Array|String|Map|Set} target + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isEmpty = function(val, msg) { + new Assertion(val, msg, assert.isEmpty, true).to.be.empty; + }; + + /** + * ### .isNotEmpty(target) + * + * Asserts that the target contains values. + * For arrays and strings, it checks the `length` property. + * For `Map` and `Set` instances, it checks the `size` property. + * For non-function objects, it gets the count of own + * enumerable string keys. + * + * assert.isNotEmpty([1, 2]); + * assert.isNotEmpty('34'); + * assert.isNotEmpty(new Set([5, 6])); + * assert.isNotEmpty({ key: 7 }); + * + * @name isNotEmpty + * @alias notEmpty + * @param {Object|Array|String|Map|Set} target + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotEmpty = function(val, msg) { + new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty; + }; + + /*! + * Aliases. + */ + + (function alias(name, as){ + assert[as] = assert[name]; + return alias; + }) + ('isOk', 'ok') + ('isNotOk', 'notOk') + ('throws', 'throw') + ('throws', 'Throw') + ('isExtensible', 'extensible') + ('isNotExtensible', 'notExtensible') + ('isSealed', 'sealed') + ('isNotSealed', 'notSealed') + ('isFrozen', 'frozen') + ('isNotFrozen', 'notFrozen') + ('isEmpty', 'empty') + ('isNotEmpty', 'notEmpty'); +}; + +},{}],7:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + chai.expect = function (val, message) { + return new chai.Assertion(val, message); + }; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * expect.fail(); + * expect.fail("custom error message"); + * expect.fail(1, 2); + * expect.fail(1, 2, "custom error message"); + * expect.fail(1, 2, "custom error message", ">"); + * expect.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + + chai.expect.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + message = actual; + actual = undefined; + } + + message = message || 'expect.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, chai.expect.fail); + }; +}; + +},{}],8:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +module.exports = function (chai, util) { + var Assertion = chai.Assertion; + + function loadShould () { + // explicitly define this method as function as to have it's name to include as `ssfi` + function shouldGetter() { + if (this instanceof String + || this instanceof Number + || this instanceof Boolean + || typeof Symbol === 'function' && this instanceof Symbol + || typeof BigInt === 'function' && this instanceof BigInt) { + return new Assertion(this.valueOf(), null, shouldGetter); + } + return new Assertion(this, null, shouldGetter); + } + function shouldSetter(value) { + // See https://github.com/chaijs/chai/issues/86: this makes + // `whatever.should = someValue` actually set `someValue`, which is + // especially useful for `global.should = require('chai').should()`. + // + // Note that we have to use [[DefineProperty]] instead of [[Put]] + // since otherwise we would trigger this very setter! + Object.defineProperty(this, 'should', { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } + // modify Object.prototype to have `should` + Object.defineProperty(Object.prototype, 'should', { + set: shouldSetter + , get: shouldGetter + , configurable: true + }); + + var should = {}; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * should.fail(); + * should.fail("custom error message"); + * should.fail(1, 2); + * should.fail(1, 2, "custom error message"); + * should.fail(1, 2, "custom error message", ">"); + * should.fail(1, 2, undefined, ">"); + * + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + + should.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + message = actual; + actual = undefined; + } + + message = message || 'should.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, should.fail); + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * should.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.equal(val2); + }; + + /** + * ### .throw(function, [constructor/string/regexp], [string/regexp], [message]) + * + * Asserts that `function` will throw an error that is an instance of + * `constructor`, or alternately that it will throw an error with message + * matching `regexp`. + * + * should.throw(fn, 'function throws a reference error'); + * should.throw(fn, /function throws a reference error/); + * should.throw(fn, ReferenceError); + * should.throw(fn, ReferenceError, 'function throws a reference error'); + * should.throw(fn, ReferenceError, /function throws a reference error/); + * + * @name throw + * @alias Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.Throw(errt, errs); + }; + + /** + * ### .exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * should.exist(foo, 'foo exists'); + * + * @name exist + * @namespace Should + * @api public + */ + + should.exist = function (val, msg) { + new Assertion(val, msg).to.exist; + } + + // negation + should.not = {} + + /** + * ### .not.equal(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * should.not.equal(3, 4, 'these numbers are not equal'); + * + * @name not.equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.not.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.not.equal(val2); + }; + + /** + * ### .throw(function, [constructor/regexp], [message]) + * + * Asserts that `function` will _not_ throw an error that is an instance of + * `constructor`, or alternately that it will not throw an error with message + * matching `regexp`. + * + * should.not.throw(fn, Error, 'function does not throw'); + * + * @name not.throw + * @alias not.Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.not.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.not.Throw(errt, errs); + }; + + /** + * ### .not.exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var bar = null; + * + * should.not.exist(bar, 'bar does not exist'); + * + * @name not.exist + * @namespace Should + * @api public + */ + + should.not.exist = function (val, msg) { + new Assertion(val, msg).to.not.exist; + } + + should['throw'] = should['Throw']; + should.not['throw'] = should.not['Throw']; + + return should; + }; + + chai.should = loadShould; + chai.Should = loadShould; +}; + +},{}],9:[function(require,module,exports){ +/*! + * Chai - addChainingMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var addLengthGuard = require('./addLengthGuard'); +var chai = require('../../chai'); +var flag = require('./flag'); +var proxify = require('./proxify'); +var transferFlags = require('./transferFlags'); + +/*! + * Module variables + */ + +// Check whether `Object.setPrototypeOf` is supported +var canSetPrototype = typeof Object.setPrototypeOf === 'function'; + +// Without `Object.setPrototypeOf` support, this module will need to add properties to a function. +// However, some of functions' own props are not configurable and should be skipped. +var testFn = function() {}; +var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) { + var propDesc = Object.getOwnPropertyDescriptor(testFn, name); + + // Note: PhantomJS 1.x includes `callee` as one of `testFn`'s own properties, + // but then returns `undefined` as the property descriptor for `callee`. As a + // workaround, we perform an otherwise unnecessary type-check for `propDesc`, + // and then filter it out if it's not an object as it should be. + if (typeof propDesc !== 'object') + return true; + + return !propDesc.configurable; +}); + +// Cache `Function` properties +var call = Function.prototype.call, + apply = Function.prototype.apply; + +/** + * ### .addChainableMethod(ctx, name, method, chainingBehavior) + * + * Adds a method to an object, such that the method can also be chained. + * + * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); + * + * The result can then be used as both a method assertion, executing both `method` and + * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. + * + * expect(fooStr).to.be.foo('bar'); + * expect(fooStr).to.be.foo.equal('foo'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for `name`, when called + * @param {Function} chainingBehavior function to be called every time the property is accessed + * @namespace Utils + * @name addChainableMethod + * @api public + */ + +module.exports = function addChainableMethod(ctx, name, method, chainingBehavior) { + if (typeof chainingBehavior !== 'function') { + chainingBehavior = function () { }; + } + + var chainableBehavior = { + method: method + , chainingBehavior: chainingBehavior + }; + + // save the methods so we can overwrite them later, if we need to. + if (!ctx.__methods) { + ctx.__methods = {}; + } + ctx.__methods[name] = chainableBehavior; + + Object.defineProperty(ctx, name, + { get: function chainableMethodGetter() { + chainableBehavior.chainingBehavior.call(this); + + var chainableMethodWrapper = function () { + // Setting the `ssfi` flag to `chainableMethodWrapper` causes this + // function to be the starting point for removing implementation + // frames from the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then this assertion is being + // invoked from inside of another assertion. In this case, the `ssfi` + // flag has already been set by the outer assertion. + // + // Note that overwriting a chainable method merely replaces the saved + // methods in `ctx.__methods` instead of completely replacing the + // overwritten assertion. Therefore, an overwriting assertion won't + // set the `ssfi` or `lockSsfi` flags. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', chainableMethodWrapper); + } + + var result = chainableBehavior.method.apply(this, arguments); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(chainableMethodWrapper, name, true); + + // Use `Object.setPrototypeOf` if available + if (canSetPrototype) { + // Inherit all properties from the object by replacing the `Function` prototype + var prototype = Object.create(this); + // Restore the `call` and `apply` methods from `Function` + prototype.call = call; + prototype.apply = apply; + Object.setPrototypeOf(chainableMethodWrapper, prototype); + } + // Otherwise, redefine all properties (slow!) + else { + var asserterNames = Object.getOwnPropertyNames(ctx); + asserterNames.forEach(function (asserterName) { + if (excludeNames.indexOf(asserterName) !== -1) { + return; + } + + var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); + Object.defineProperty(chainableMethodWrapper, asserterName, pd); + }); + } + + transferFlags(this, chainableMethodWrapper); + return proxify(chainableMethodWrapper); + } + , configurable: true + }); +}; + +},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":30,"./transferFlags":32}],10:[function(require,module,exports){ +var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length'); + +/*! + * Chai - addLengthGuard utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .addLengthGuard(fn, assertionName, isChainable) + * + * Define `length` as a getter on the given uninvoked method assertion. The + * getter acts as a guard against chaining `length` directly off of an uninvoked + * method assertion, which is a problem because it references `function`'s + * built-in `length` property instead of Chai's `length` assertion. When the + * getter catches the user making this mistake, it throws an error with a + * helpful message. + * + * There are two ways in which this mistake can be made. The first way is by + * chaining the `length` assertion directly off of an uninvoked chainable + * method. In this case, Chai suggests that the user use `lengthOf` instead. The + * second way is by chaining the `length` assertion directly off of an uninvoked + * non-chainable method. Non-chainable methods must be invoked prior to + * chaining. In this case, Chai suggests that the user consult the docs for the + * given assertion. + * + * If the `length` property of functions is unconfigurable, then return `fn` + * without modification. + * + * Note that in ES6, the function's `length` property is configurable, so once + * support for legacy environments is dropped, Chai's `length` property can + * replace the built-in function's `length` property, and this length guard will + * no longer be necessary. In the mean time, maintaining consistency across all + * environments is the priority. + * + * @param {Function} fn + * @param {String} assertionName + * @param {Boolean} isChainable + * @namespace Utils + * @name addLengthGuard + */ + +module.exports = function addLengthGuard (fn, assertionName, isChainable) { + if (!fnLengthDesc.configurable) return fn; + + Object.defineProperty(fn, 'length', { + get: function () { + if (isChainable) { + throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + + ' to a compatibility issue, "length" cannot directly follow "' + + assertionName + '". Use "' + assertionName + '.lengthOf" instead.'); + } + + throw Error('Invalid Chai property: ' + assertionName + '.length. See' + + ' docs for proper usage of "' + assertionName + '".'); + } + }); + + return fn; +}; + +},{}],11:[function(require,module,exports){ +/*! + * Chai - addMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var addLengthGuard = require('./addLengthGuard'); +var chai = require('../../chai'); +var flag = require('./flag'); +var proxify = require('./proxify'); +var transferFlags = require('./transferFlags'); + +/** + * ### .addMethod(ctx, name, method) + * + * Adds a method to the prototype of an object. + * + * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(fooStr).to.be.foo('bar'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for name + * @namespace Utils + * @name addMethod + * @api public + */ + +module.exports = function addMethod(ctx, name, method) { + var methodWrapper = function () { + // Setting the `ssfi` flag to `methodWrapper` causes this function to be the + // starting point for removing implementation frames from the stack trace of + // a failed assertion. + // + // However, we only want to use this function as the starting point if the + // `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked from + // inside of another assertion. In the first case, the `ssfi` flag has + // already been set by the overwriting assertion. In the second case, the + // `ssfi` flag has already been set by the outer assertion. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', methodWrapper); + } + + var result = method.apply(this, arguments); + if (result !== undefined) + return result; + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(methodWrapper, name, false); + ctx[name] = proxify(methodWrapper, name); +}; + +},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":30,"./transferFlags":32}],12:[function(require,module,exports){ +/*! + * Chai - addProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var chai = require('../../chai'); +var flag = require('./flag'); +var isProxyEnabled = require('./isProxyEnabled'); +var transferFlags = require('./transferFlags'); + +/** + * ### .addProperty(ctx, name, getter) + * + * Adds a property to the prototype of an object. + * + * utils.addProperty(chai.Assertion.prototype, 'foo', function () { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.instanceof(Foo); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.foo; + * + * @param {Object} ctx object to which the property is added + * @param {String} name of property to add + * @param {Function} getter function to be used for name + * @namespace Utils + * @name addProperty + * @api public + */ + +module.exports = function addProperty(ctx, name, getter) { + getter = getter === undefined ? function () {} : getter; + + Object.defineProperty(ctx, name, + { get: function propertyGetter() { + // Setting the `ssfi` flag to `propertyGetter` causes this function to + // be the starting point for removing implementation frames from the + // stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set and proxy protection is disabled. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked + // from inside of another assertion. In the first case, the `ssfi` flag + // has already been set by the overwriting assertion. In the second + // case, the `ssfi` flag has already been set by the outer assertion. + // + // If proxy protection is enabled, then the `ssfi` flag has already been + // set by the proxy getter. + if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { + flag(this, 'ssfi', propertyGetter); + } + + var result = getter.call(this); + if (result !== undefined) + return result; + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + , configurable: true + }); +}; + +},{"../../chai":2,"./flag":15,"./isProxyEnabled":25,"./transferFlags":32}],13:[function(require,module,exports){ +/*! + * Chai - compareByInspect utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var inspect = require('./inspect'); + +/** + * ### .compareByInspect(mixed, mixed) + * + * To be used as a compareFunction with Array.prototype.sort. Compares elements + * using inspect instead of default behavior of using toString so that Symbols + * and objects with irregular/missing toString can still be sorted without a + * TypeError. + * + * @param {Mixed} first element to compare + * @param {Mixed} second element to compare + * @returns {Number} -1 if 'a' should come before 'b'; otherwise 1 + * @name compareByInspect + * @namespace Utils + * @api public + */ + +module.exports = function compareByInspect(a, b) { + return inspect(a) < inspect(b) ? -1 : 1; +}; + +},{"./inspect":23}],14:[function(require,module,exports){ +/*! + * Chai - expectTypes utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .expectTypes(obj, types) + * + * Ensures that the object being tested against is of a valid type. + * + * utils.expectTypes(this, ['array', 'object', 'string']); + * + * @param {Mixed} obj constructed Assertion + * @param {Array} type A list of allowed types for this assertion + * @namespace Utils + * @name expectTypes + * @api public + */ + +var AssertionError = require('assertion-error'); +var flag = require('./flag'); +var type = require('type-detect'); + +module.exports = function expectTypes(obj, types) { + var flagMsg = flag(obj, 'message'); + var ssfi = flag(obj, 'ssfi'); + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + obj = flag(obj, 'object'); + types = types.map(function (t) { return t.toLowerCase(); }); + types.sort(); + + // Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum' + var str = types.map(function (t, index) { + var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; + var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; + return or + art + ' ' + t; + }).join(', '); + + var objType = type(obj).toLowerCase(); + + if (!types.some(function (expected) { return objType === expected; })) { + throw new AssertionError( + flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given', + undefined, + ssfi + ); + } +}; + +},{"./flag":15,"assertion-error":33,"type-detect":39}],15:[function(require,module,exports){ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .flag(object, key, [value]) + * + * Get or set a flag value on an object. If a + * value is provided it will be set, else it will + * return the currently set value or `undefined` if + * the value is not set. + * + * utils.flag(this, 'foo', 'bar'); // setter + * utils.flag(this, 'foo'); // getter, returns `bar` + * + * @param {Object} object constructed Assertion + * @param {String} key + * @param {Mixed} value (optional) + * @namespace Utils + * @name flag + * @api private + */ + +module.exports = function flag(obj, key, value) { + var flags = obj.__flags || (obj.__flags = Object.create(null)); + if (arguments.length === 3) { + flags[key] = value; + } else { + return flags[key]; + } +}; + +},{}],16:[function(require,module,exports){ +/*! + * Chai - getActual utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .getActual(object, [actual]) + * + * Returns the `actual` value for an Assertion. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getActual + */ + +module.exports = function getActual(obj, args) { + return args.length > 4 ? args[4] : obj._obj; +}; + +},{}],17:[function(require,module,exports){ +/*! + * Chai - message composition utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var flag = require('./flag') + , getActual = require('./getActual') + , objDisplay = require('./objDisplay'); + +/** + * ### .getMessage(object, message, negateMessage) + * + * Construct the error message based on flags + * and template tags. Template tags will return + * a stringified inspection of the object referenced. + * + * Message template tags: + * - `#{this}` current asserted object + * - `#{act}` actual value + * - `#{exp}` expected value + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getMessage + * @api public + */ + +module.exports = function getMessage(obj, args) { + var negate = flag(obj, 'negate') + , val = flag(obj, 'object') + , expected = args[3] + , actual = getActual(obj, args) + , msg = negate ? args[2] : args[1] + , flagMsg = flag(obj, 'message'); + + if(typeof msg === "function") msg = msg(); + msg = msg || ''; + msg = msg + .replace(/#\{this\}/g, function () { return objDisplay(val); }) + .replace(/#\{act\}/g, function () { return objDisplay(actual); }) + .replace(/#\{exp\}/g, function () { return objDisplay(expected); }); + + return flagMsg ? flagMsg + ': ' + msg : msg; +}; + +},{"./flag":15,"./getActual":16,"./objDisplay":26}],18:[function(require,module,exports){ +var type = require('type-detect'); + +var flag = require('./flag'); + +function isObjectType(obj) { + var objectType = type(obj); + var objectTypes = ['Array', 'Object', 'function']; + + return objectTypes.indexOf(objectType) !== -1; +} + +/** + * ### .getOperator(message) + * + * Extract the operator from error message. + * Operator defined is based on below link + * https://nodejs.org/api/assert.html#assert_assert. + * + * Returns the `operator` or `undefined` value for an Assertion. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getOperator + * @api public + */ + +module.exports = function getOperator(obj, args) { + var operator = flag(obj, 'operator'); + var negate = flag(obj, 'negate'); + var expected = args[3]; + var msg = negate ? args[2] : args[1]; + + if (operator) { + return operator; + } + + if (typeof msg === 'function') msg = msg(); + + msg = msg || ''; + if (!msg) { + return undefined; + } + + if (/\shave\s/.test(msg)) { + return undefined; + } + + var isObject = isObjectType(expected); + if (/\snot\s/.test(msg)) { + return isObject ? 'notDeepStrictEqual' : 'notStrictEqual'; + } + + return isObject ? 'deepStrictEqual' : 'strictEqual'; +}; + +},{"./flag":15,"type-detect":39}],19:[function(require,module,exports){ +/*! + * Chai - getOwnEnumerableProperties utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols'); + +/** + * ### .getOwnEnumerableProperties(object) + * + * This allows the retrieval of directly-owned enumerable property names and + * symbols of an object. This function is necessary because Object.keys only + * returns enumerable property names, not enumerable property symbols. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getOwnEnumerableProperties + * @api public + */ + +module.exports = function getOwnEnumerableProperties(obj) { + return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); +}; + +},{"./getOwnEnumerablePropertySymbols":20}],20:[function(require,module,exports){ +/*! + * Chai - getOwnEnumerablePropertySymbols utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + +/** + * ### .getOwnEnumerablePropertySymbols(object) + * + * This allows the retrieval of directly-owned enumerable property symbols of an + * object. This function is necessary because Object.getOwnPropertySymbols + * returns both enumerable and non-enumerable property symbols. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getOwnEnumerablePropertySymbols + * @api public + */ + +module.exports = function getOwnEnumerablePropertySymbols(obj) { + if (typeof Object.getOwnPropertySymbols !== 'function') return []; + + return Object.getOwnPropertySymbols(obj).filter(function (sym) { + return Object.getOwnPropertyDescriptor(obj, sym).enumerable; + }); +}; + +},{}],21:[function(require,module,exports){ +/*! + * Chai - getProperties utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .getProperties(object) + * + * This allows the retrieval of property names of an object, enumerable or not, + * inherited or not. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getProperties + * @api public + */ + +module.exports = function getProperties(object) { + var result = Object.getOwnPropertyNames(object); + + function addProperty(property) { + if (result.indexOf(property) === -1) { + result.push(property); + } + } + + var proto = Object.getPrototypeOf(object); + while (proto !== null) { + Object.getOwnPropertyNames(proto).forEach(addProperty); + proto = Object.getPrototypeOf(proto); + } + + return result; +}; + +},{}],22:[function(require,module,exports){ +/*! + * chai + * Copyright(c) 2011 Jake Luer + * MIT Licensed + */ + +/*! + * Dependencies that are used for multiple exports are required here only once + */ + +var pathval = require('pathval'); + +/*! + * test utility + */ + +exports.test = require('./test'); + +/*! + * type utility + */ + +exports.type = require('type-detect'); + +/*! + * expectTypes utility + */ +exports.expectTypes = require('./expectTypes'); + +/*! + * message utility + */ + +exports.getMessage = require('./getMessage'); + +/*! + * actual utility + */ + +exports.getActual = require('./getActual'); + +/*! + * Inspect util + */ + +exports.inspect = require('./inspect'); + +/*! + * Object Display util + */ + +exports.objDisplay = require('./objDisplay'); + +/*! + * Flag utility + */ + +exports.flag = require('./flag'); + +/*! + * Flag transferring utility + */ + +exports.transferFlags = require('./transferFlags'); + +/*! + * Deep equal utility + */ + +exports.eql = require('deep-eql'); + +/*! + * Deep path info + */ + +exports.getPathInfo = pathval.getPathInfo; + +/*! + * Check if a property exists + */ + +exports.hasProperty = pathval.hasProperty; + +/*! + * Function name + */ + +exports.getName = require('get-func-name'); + +/*! + * add Property + */ + +exports.addProperty = require('./addProperty'); + +/*! + * add Method + */ + +exports.addMethod = require('./addMethod'); + +/*! + * overwrite Property + */ + +exports.overwriteProperty = require('./overwriteProperty'); + +/*! + * overwrite Method + */ + +exports.overwriteMethod = require('./overwriteMethod'); + +/*! + * Add a chainable method + */ + +exports.addChainableMethod = require('./addChainableMethod'); + +/*! + * Overwrite chainable method + */ + +exports.overwriteChainableMethod = require('./overwriteChainableMethod'); + +/*! + * Compare by inspect method + */ + +exports.compareByInspect = require('./compareByInspect'); + +/*! + * Get own enumerable property symbols method + */ + +exports.getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols'); + +/*! + * Get own enumerable properties method + */ + +exports.getOwnEnumerableProperties = require('./getOwnEnumerableProperties'); + +/*! + * Checks error against a given set of criteria + */ + +exports.checkError = require('check-error'); + +/*! + * Proxify util + */ + +exports.proxify = require('./proxify'); + +/*! + * addLengthGuard util + */ + +exports.addLengthGuard = require('./addLengthGuard'); + +/*! + * isProxyEnabled helper + */ + +exports.isProxyEnabled = require('./isProxyEnabled'); + +/*! + * isNaN method + */ + +exports.isNaN = require('./isNaN'); + +/*! + * getOperator method + */ + +exports.getOperator = require('./getOperator'); +},{"./addChainableMethod":9,"./addLengthGuard":10,"./addMethod":11,"./addProperty":12,"./compareByInspect":13,"./expectTypes":14,"./flag":15,"./getActual":16,"./getMessage":17,"./getOperator":18,"./getOwnEnumerableProperties":19,"./getOwnEnumerablePropertySymbols":20,"./inspect":23,"./isNaN":24,"./isProxyEnabled":25,"./objDisplay":26,"./overwriteChainableMethod":27,"./overwriteMethod":28,"./overwriteProperty":29,"./proxify":30,"./test":31,"./transferFlags":32,"check-error":34,"deep-eql":35,"get-func-name":36,"pathval":38,"type-detect":39}],23:[function(require,module,exports){ +// This is (almost) directly from Node.js utils +// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js + +var getName = require('get-func-name'); +var loupe = require('loupe'); +var config = require('../config'); + +module.exports = inspect; + +/** + * ### .inspect(obj, [showHidden], [depth], [colors]) + * + * Echoes the value of a value. Tries to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Boolean} showHidden Flag that shows hidden (not enumerable) + * properties of objects. Default is false. + * @param {Number} depth Depth in which to descend in object. Default is 2. + * @param {Boolean} colors Flag to turn on ANSI escape codes to color the + * output. Default is false (no coloring). + * @namespace Utils + * @name inspect + */ +function inspect(obj, showHidden, depth, colors) { + var options = { + colors: colors, + depth: (typeof depth === 'undefined' ? 2 : depth), + showHidden: showHidden, + truncate: config.truncateThreshold ? config.truncateThreshold : Infinity, + }; + return loupe.inspect(obj, options); +} + +},{"../config":4,"get-func-name":36,"loupe":37}],24:[function(require,module,exports){ +/*! + * Chai - isNaN utility + * Copyright(c) 2012-2015 Sakthipriyan Vairamani + * MIT Licensed + */ + +/** + * ### .isNaN(value) + * + * Checks if the given value is NaN or not. + * + * utils.isNaN(NaN); // true + * + * @param {Value} The value which has to be checked if it is NaN + * @name isNaN + * @api private + */ + +function isNaN(value) { + // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number + // section's NOTE. + return value !== value; +} + +// If ECMAScript 6's Number.isNaN is present, prefer that. +module.exports = Number.isNaN || isNaN; + +},{}],25:[function(require,module,exports){ +var config = require('../config'); + +/*! + * Chai - isProxyEnabled helper + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .isProxyEnabled() + * + * Helper function to check if Chai's proxy protection feature is enabled. If + * proxies are unsupported or disabled via the user's Chai config, then return + * false. Otherwise, return true. + * + * @namespace Utils + * @name isProxyEnabled + */ + +module.exports = function isProxyEnabled() { + return config.useProxy && + typeof Proxy !== 'undefined' && + typeof Reflect !== 'undefined'; +}; + +},{"../config":4}],26:[function(require,module,exports){ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var inspect = require('./inspect'); +var config = require('../config'); + +/** + * ### .objDisplay(object) + * + * Determines if an object or an array matches + * criteria to be inspected in-line for error + * messages or should be truncated. + * + * @param {Mixed} javascript object to inspect + * @name objDisplay + * @namespace Utils + * @api public + */ + +module.exports = function objDisplay(obj) { + var str = inspect(obj) + , type = Object.prototype.toString.call(obj); + + if (config.truncateThreshold && str.length >= config.truncateThreshold) { + if (type === '[object Function]') { + return !obj.name || obj.name === '' + ? '[Function]' + : '[Function: ' + obj.name + ']'; + } else if (type === '[object Array]') { + return '[ Array(' + obj.length + ') ]'; + } else if (type === '[object Object]') { + var keys = Object.keys(obj) + , kstr = keys.length > 2 + ? keys.splice(0, 2).join(', ') + ', ...' + : keys.join(', '); + return '{ Object (' + kstr + ') }'; + } else { + return str; + } + } else { + return str; + } +}; + +},{"../config":4,"./inspect":23}],27:[function(require,module,exports){ +/*! + * Chai - overwriteChainableMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var chai = require('../../chai'); +var transferFlags = require('./transferFlags'); + +/** + * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior) + * + * Overwrites an already existing chainable method + * and provides access to the previous function or + * property. Must return functions to be used for + * name. + * + * utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf', + * function (_super) { + * } + * , function (_super) { + * } + * ); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteChainableMethod('foo', fn, fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.have.lengthOf(3); + * expect(myFoo).to.have.lengthOf.above(3); + * + * @param {Object} ctx object whose method / property is to be overwritten + * @param {String} name of method / property to overwrite + * @param {Function} method function that returns a function to be used for name + * @param {Function} chainingBehavior function that returns a function to be used for property + * @namespace Utils + * @name overwriteChainableMethod + * @api public + */ + +module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) { + var chainableBehavior = ctx.__methods[name]; + + var _chainingBehavior = chainableBehavior.chainingBehavior; + chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() { + var result = chainingBehavior(_chainingBehavior).call(this); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + var _method = chainableBehavior.method; + chainableBehavior.method = function overwritingChainableMethodWrapper() { + var result = method(_method).apply(this, arguments); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; +}; + +},{"../../chai":2,"./transferFlags":32}],28:[function(require,module,exports){ +/*! + * Chai - overwriteMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var addLengthGuard = require('./addLengthGuard'); +var chai = require('../../chai'); +var flag = require('./flag'); +var proxify = require('./proxify'); +var transferFlags = require('./transferFlags'); + +/** + * ### .overwriteMethod(ctx, name, fn) + * + * Overwrites an already existing method and provides + * access to previous function. Must return function + * to be used for name. + * + * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { + * return function (str) { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.value).to.equal(str); + * } else { + * _super.apply(this, arguments); + * } + * } + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.equal('bar'); + * + * @param {Object} ctx object whose method is to be overwritten + * @param {String} name of method to overwrite + * @param {Function} method function that returns a function to be used for name + * @namespace Utils + * @name overwriteMethod + * @api public + */ + +module.exports = function overwriteMethod(ctx, name, method) { + var _method = ctx[name] + , _super = function () { + throw new Error(name + ' is not a function'); + }; + + if (_method && 'function' === typeof _method) + _super = _method; + + var overwritingMethodWrapper = function () { + // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this + // function to be the starting point for removing implementation frames from + // the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if the + // `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked from + // inside of another assertion. In the first case, the `ssfi` flag has + // already been set by the overwriting assertion. In the second case, the + // `ssfi` flag has already been set by the outer assertion. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', overwritingMethodWrapper); + } + + // Setting the `lockSsfi` flag to `true` prevents the overwritten assertion + // from changing the `ssfi` flag. By this point, the `ssfi` flag is already + // set to the correct starting point for this assertion. + var origLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + var result = method(_super).apply(this, arguments); + flag(this, 'lockSsfi', origLockSsfi); + + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + + addLengthGuard(overwritingMethodWrapper, name, false); + ctx[name] = proxify(overwritingMethodWrapper, name); +}; + +},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":30,"./transferFlags":32}],29:[function(require,module,exports){ +/*! + * Chai - overwriteProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +var chai = require('../../chai'); +var flag = require('./flag'); +var isProxyEnabled = require('./isProxyEnabled'); +var transferFlags = require('./transferFlags'); + +/** + * ### .overwriteProperty(ctx, name, fn) + * + * Overwrites an already existing property getter and provides + * access to previous value. Must return function to use as getter. + * + * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { + * return function () { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.name).to.equal('bar'); + * } else { + * _super.call(this); + * } + * } + * }); + * + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.ok; + * + * @param {Object} ctx object whose property is to be overwritten + * @param {String} name of property to overwrite + * @param {Function} getter function that returns a getter function to be used for name + * @namespace Utils + * @name overwriteProperty + * @api public + */ + +module.exports = function overwriteProperty(ctx, name, getter) { + var _get = Object.getOwnPropertyDescriptor(ctx, name) + , _super = function () {}; + + if (_get && 'function' === typeof _get.get) + _super = _get.get + + Object.defineProperty(ctx, name, + { get: function overwritingPropertyGetter() { + // Setting the `ssfi` flag to `overwritingPropertyGetter` causes this + // function to be the starting point for removing implementation frames + // from the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set and proxy protection is disabled. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked + // from inside of another assertion. In the first case, the `ssfi` flag + // has already been set by the overwriting assertion. In the second + // case, the `ssfi` flag has already been set by the outer assertion. + // + // If proxy protection is enabled, then the `ssfi` flag has already been + // set by the proxy getter. + if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { + flag(this, 'ssfi', overwritingPropertyGetter); + } + + // Setting the `lockSsfi` flag to `true` prevents the overwritten + // assertion from changing the `ssfi` flag. By this point, the `ssfi` + // flag is already set to the correct starting point for this assertion. + var origLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + var result = getter(_super).call(this); + flag(this, 'lockSsfi', origLockSsfi); + + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + , configurable: true + }); +}; + +},{"../../chai":2,"./flag":15,"./isProxyEnabled":25,"./transferFlags":32}],30:[function(require,module,exports){ +var config = require('../config'); +var flag = require('./flag'); +var getProperties = require('./getProperties'); +var isProxyEnabled = require('./isProxyEnabled'); + +/*! + * Chai - proxify utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .proxify(object) + * + * Return a proxy of given object that throws an error when a non-existent + * property is read. By default, the root cause is assumed to be a misspelled + * property, and thus an attempt is made to offer a reasonable suggestion from + * the list of existing properties. However, if a nonChainableMethodName is + * provided, then the root cause is instead a failure to invoke a non-chainable + * method prior to reading the non-existent property. + * + * If proxies are unsupported or disabled via the user's Chai config, then + * return object without modification. + * + * @param {Object} obj + * @param {String} nonChainableMethodName + * @namespace Utils + * @name proxify + */ + +var builtins = ['__flags', '__methods', '_obj', 'assert']; + +module.exports = function proxify(obj, nonChainableMethodName) { + if (!isProxyEnabled()) return obj; + + return new Proxy(obj, { + get: function proxyGetter(target, property) { + // This check is here because we should not throw errors on Symbol properties + // such as `Symbol.toStringTag`. + // The values for which an error should be thrown can be configured using + // the `config.proxyExcludedKeys` setting. + if (typeof property === 'string' && + config.proxyExcludedKeys.indexOf(property) === -1 && + !Reflect.has(target, property)) { + // Special message for invalid property access of non-chainable methods. + if (nonChainableMethodName) { + throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + + property + '. See docs for proper usage of "' + + nonChainableMethodName + '".'); + } + + // If the property is reasonably close to an existing Chai property, + // suggest that property to the user. Only suggest properties with a + // distance less than 4. + var suggestion = null; + var suggestionDistance = 4; + getProperties(target).forEach(function(prop) { + if ( + !Object.prototype.hasOwnProperty(prop) && + builtins.indexOf(prop) === -1 + ) { + var dist = stringDistanceCapped( + property, + prop, + suggestionDistance + ); + if (dist < suggestionDistance) { + suggestion = prop; + suggestionDistance = dist; + } + } + }); + + if (suggestion !== null) { + throw Error('Invalid Chai property: ' + property + + '. Did you mean "' + suggestion + '"?'); + } else { + throw Error('Invalid Chai property: ' + property); + } + } + + // Use this proxy getter as the starting point for removing implementation + // frames from the stack trace of a failed assertion. For property + // assertions, this prevents the proxy getter from showing up in the stack + // trace since it's invoked before the property getter. For method and + // chainable method assertions, this flag will end up getting changed to + // the method wrapper, which is good since this frame will no longer be in + // the stack once the method is invoked. Note that Chai builtin assertion + // properties such as `__flags` are skipped since this is only meant to + // capture the starting point of an assertion. This step is also skipped + // if the `lockSsfi` flag is set, thus indicating that this assertion is + // being called from within another assertion. In that case, the `ssfi` + // flag is already set to the outer assertion's starting point. + if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) { + flag(target, 'ssfi', proxyGetter); + } + + return Reflect.get(target, property); + } + }); +}; + +/** + * # stringDistanceCapped(strA, strB, cap) + * Return the Levenshtein distance between two strings, but no more than cap. + * @param {string} strA + * @param {string} strB + * @param {number} number + * @return {number} min(string distance between strA and strB, cap) + * @api private + */ + +function stringDistanceCapped(strA, strB, cap) { + if (Math.abs(strA.length - strB.length) >= cap) { + return cap; + } + + var memo = []; + // `memo` is a two-dimensional array containing distances. + // memo[i][j] is the distance between strA.slice(0, i) and + // strB.slice(0, j). + for (var i = 0; i <= strA.length; i++) { + memo[i] = Array(strB.length + 1).fill(0); + memo[i][0] = i; + } + for (var j = 0; j < strB.length; j++) { + memo[0][j] = j; + } + + for (var i = 1; i <= strA.length; i++) { + var ch = strA.charCodeAt(i - 1); + for (var j = 1; j <= strB.length; j++) { + if (Math.abs(i - j) >= cap) { + memo[i][j] = cap; + continue; + } + memo[i][j] = Math.min( + memo[i - 1][j] + 1, + memo[i][j - 1] + 1, + memo[i - 1][j - 1] + + (ch === strB.charCodeAt(j - 1) ? 0 : 1) + ); + } + } + + return memo[strA.length][strB.length]; +} + +},{"../config":4,"./flag":15,"./getProperties":21,"./isProxyEnabled":25}],31:[function(require,module,exports){ +/*! + * Chai - test utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/*! + * Module dependencies + */ + +var flag = require('./flag'); + +/** + * ### .test(object, expression) + * + * Test and object for expression. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name test + */ + +module.exports = function test(obj, args) { + var negate = flag(obj, 'negate') + , expr = args[0]; + return negate ? !expr : expr; +}; + +},{"./flag":15}],32:[function(require,module,exports){ +/*! + * Chai - transferFlags utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .transferFlags(assertion, object, includeAll = true) + * + * Transfer all the flags for `assertion` to `object`. If + * `includeAll` is set to `false`, then the base Chai + * assertion flags (namely `object`, `ssfi`, `lockSsfi`, + * and `message`) will not be transferred. + * + * + * var newAssertion = new Assertion(); + * utils.transferFlags(assertion, newAssertion); + * + * var anotherAssertion = new Assertion(myObj); + * utils.transferFlags(assertion, anotherAssertion, false); + * + * @param {Assertion} assertion the assertion to transfer the flags from + * @param {Object} object the object to transfer the flags to; usually a new assertion + * @param {Boolean} includeAll + * @namespace Utils + * @name transferFlags + * @api private + */ + +module.exports = function transferFlags(assertion, object, includeAll) { + var flags = assertion.__flags || (assertion.__flags = Object.create(null)); + + if (!object.__flags) { + object.__flags = Object.create(null); + } + + includeAll = arguments.length === 3 ? includeAll : true; + + for (var flag in flags) { + if (includeAll || + (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) { + object.__flags[flag] = flags[flag]; + } + } +}; + +},{}],33:[function(require,module,exports){ +/*! + * assertion-error + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +/*! + * Return a function that will copy properties from + * one object to another excluding any originally + * listed. Returned function will create a new `{}`. + * + * @param {String} excluded properties ... + * @return {Function} + */ + +function exclude () { + var excludes = [].slice.call(arguments); + + function excludeProps (res, obj) { + Object.keys(obj).forEach(function (key) { + if (!~excludes.indexOf(key)) res[key] = obj[key]; + }); + } + + return function extendExclude () { + var args = [].slice.call(arguments) + , i = 0 + , res = {}; + + for (; i < args.length; i++) { + excludeProps(res, args[i]); + } + + return res; + }; +}; + +/*! + * Primary Exports + */ + +module.exports = AssertionError; + +/** + * ### AssertionError + * + * An extension of the JavaScript `Error` constructor for + * assertion and validation scenarios. + * + * @param {String} message + * @param {Object} properties to include (optional) + * @param {callee} start stack function (optional) + */ + +function AssertionError (message, _props, ssf) { + var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') + , props = extend(_props || {}); + + // default values + this.message = message || 'Unspecified AssertionError'; + this.showDiff = false; + + // copy from properties + for (var key in props) { + this[key] = props[key]; + } + + // capture stack trace + ssf = ssf || AssertionError; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ssf); + } else { + try { + throw new Error(); + } catch(e) { + this.stack = e.stack; + } + } +} + +/*! + * Inherit from Error.prototype + */ + +AssertionError.prototype = Object.create(Error.prototype); + +/*! + * Statically set name + */ + +AssertionError.prototype.name = 'AssertionError'; + +/*! + * Ensure correct constructor + */ + +AssertionError.prototype.constructor = AssertionError; + +/** + * Allow errors to be converted to JSON for static transfer. + * + * @param {Boolean} include stack (default: `true`) + * @return {Object} object that can be `JSON.stringify` + */ + +AssertionError.prototype.toJSON = function (stack) { + var extend = exclude('constructor', 'toJSON', 'stack') + , props = extend({ name: this.name }, this); + + // include stack if exists and not turned off + if (false !== stack && this.stack) { + props.stack = this.stack; + } + + return props; +}; + +},{}],34:[function(require,module,exports){ +'use strict'; + +/* ! + * Chai - checkError utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + +/** + * ### .checkError + * + * Checks that an error conforms to a given set of criteria and/or retrieves information about it. + * + * @api public + */ + +/** + * ### .compatibleInstance(thrown, errorLike) + * + * Checks if two instances are compatible (strict equal). + * Returns false if errorLike is not an instance of Error, because instances + * can only be compatible if they're both error instances. + * + * @name compatibleInstance + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + +function compatibleInstance(thrown, errorLike) { + return errorLike instanceof Error && thrown === errorLike; +} + +/** + * ### .compatibleConstructor(thrown, errorLike) + * + * Checks if two constructors are compatible. + * This function can receive either an error constructor or + * an error instance as the `errorLike` argument. + * Constructors are compatible if they're the same or if one is + * an instance of another. + * + * @name compatibleConstructor + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + +function compatibleConstructor(thrown, errorLike) { + if (errorLike instanceof Error) { + // If `errorLike` is an instance of any error we compare their constructors + return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor; + } else if (errorLike.prototype instanceof Error || errorLike === Error) { + // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly + return thrown.constructor === errorLike || thrown instanceof errorLike; + } + + return false; +} + +/** + * ### .compatibleMessage(thrown, errMatcher) + * + * Checks if an error's message is compatible with a matcher (String or RegExp). + * If the message contains the String or passes the RegExp test, + * it is considered compatible. + * + * @name compatibleMessage + * @param {Error} thrown error + * @param {String|RegExp} errMatcher to look for into the message + * @namespace Utils + * @api public + */ + +function compatibleMessage(thrown, errMatcher) { + var comparisonString = typeof thrown === 'string' ? thrown : thrown.message; + if (errMatcher instanceof RegExp) { + return errMatcher.test(comparisonString); + } else if (typeof errMatcher === 'string') { + return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers + } + + return false; +} + +/** + * ### .getFunctionName(constructorFn) + * + * Returns the name of a function. + * This also includes a polyfill function if `constructorFn.name` is not defined. + * + * @name getFunctionName + * @param {Function} constructorFn + * @namespace Utils + * @api private + */ + +var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\(\/]+)/; +function getFunctionName(constructorFn) { + var name = ''; + if (typeof constructorFn.name === 'undefined') { + // Here we run a polyfill if constructorFn.name is not defined + var match = String(constructorFn).match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + name = constructorFn.name; + } + + return name; +} + +/** + * ### .getConstructorName(errorLike) + * + * Gets the constructor name for an Error instance or constructor itself. + * + * @name getConstructorName + * @param {Error|ErrorConstructor} errorLike + * @namespace Utils + * @api public + */ + +function getConstructorName(errorLike) { + var constructorName = errorLike; + if (errorLike instanceof Error) { + constructorName = getFunctionName(errorLike.constructor); + } else if (typeof errorLike === 'function') { + // If `err` is not an instance of Error it is an error constructor itself or another function. + // If we've got a common function we get its name, otherwise we may need to create a new instance + // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more. + constructorName = getFunctionName(errorLike).trim() || + getFunctionName(new errorLike()); // eslint-disable-line new-cap + } + + return constructorName; +} + +/** + * ### .getMessage(errorLike) + * + * Gets the error message from an error. + * If `err` is a String itself, we return it. + * If the error has no message, we return an empty string. + * + * @name getMessage + * @param {Error|String} errorLike + * @namespace Utils + * @api public + */ + +function getMessage(errorLike) { + var msg = ''; + if (errorLike && errorLike.message) { + msg = errorLike.message; + } else if (typeof errorLike === 'string') { + msg = errorLike; + } + + return msg; +} + +module.exports = { + compatibleInstance: compatibleInstance, + compatibleConstructor: compatibleConstructor, + compatibleMessage: compatibleMessage, + getMessage: getMessage, + getConstructorName: getConstructorName, +}; + +},{}],35:[function(require,module,exports){ +'use strict'; +/* globals Symbol: false, Uint8Array: false, WeakMap: false */ +/*! + * deep-eql + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + +var type = require('type-detect'); +function FakeMap() { + this._key = 'chai/deep-eql__' + Math.random() + Date.now(); +} + +FakeMap.prototype = { + get: function get(key) { + return key[this._key]; + }, + set: function set(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this._key, { + value: value, + configurable: true, + }); + } + }, +}; + +var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap; +/*! + * Check to see if the MemoizeMap has recorded a result of the two operands + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @returns {Boolean|null} result +*/ +function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return null; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + var result = leftHandMap.get(rightHandOperand); + if (typeof result === 'boolean') { + return result; + } + } + return null; +} + +/*! + * Set the result of the equality into the MemoizeMap + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @param {Boolean} result +*/ +function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + leftHandMap.set(rightHandOperand, result); + } else { + leftHandMap = new MemoizeMap(); + leftHandMap.set(rightHandOperand, result); + memoizeMap.set(leftHandOperand, leftHandMap); + } +} + +/*! + * Primary Export + */ + +module.exports = deepEqual; +module.exports.MemoizeMap = MemoizeMap; + +/** + * Assert deeply nested sameValue equality between two objects of any type. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match + */ +function deepEqual(leftHandOperand, rightHandOperand, options) { + // If we have a comparator, we can't assume anything; so bail to its check first. + if (options && options.comparator) { + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); + } + + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + return simpleResult; + } + + // Deeper comparisons are pushed through to a larger function + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); +} + +/** + * Many comparisons can be canceled out early via simple equality or primitive checks. + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @return {Boolean|null} equal match + */ +function simpleEqual(leftHandOperand, rightHandOperand) { + // Equal references (except for Numbers) can be returned early + if (leftHandOperand === rightHandOperand) { + // Handle +-0 cases + return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand; + } + + // handle NaN cases + if ( + leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare + rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare + ) { + return true; + } + + // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers, + // strings, and undefined, can be compared by reference. + if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + // Easy out b/c it would have passed the first equality check + return false; + } + return null; +} + +/*! + * The main logic of the `deepEqual` function. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match +*/ +function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) { + options = options || {}; + options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap(); + var comparator = options && options.comparator; + + // Check if a memoized result exists. + var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize); + if (memoizeResultLeft !== null) { + return memoizeResultLeft; + } + var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize); + if (memoizeResultRight !== null) { + return memoizeResultRight; + } + + // If a comparator is present, use it. + if (comparator) { + var comparatorResult = comparator(leftHandOperand, rightHandOperand); + // Comparators may return null, in which case we want to go back to default behavior. + if (comparatorResult === false || comparatorResult === true) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult); + return comparatorResult; + } + // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide + // what to do, we need to make sure to return the basic tests first before we move on. + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + // Don't memoize this, it takes longer to set/retrieve than to just compare. + return simpleResult; + } + } + + var leftHandType = type(leftHandOperand); + if (leftHandType !== type(rightHandOperand)) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false); + return false; + } + + // Temporarily set the operands in the memoize object to prevent blowing the stack + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true); + + var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options); + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result); + return result; +} + +function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) { + switch (leftHandType) { + case 'String': + case 'Number': + case 'Boolean': + case 'Date': + // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values + return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf()); + case 'Promise': + case 'Symbol': + case 'function': + case 'WeakMap': + case 'WeakSet': + return leftHandOperand === rightHandOperand; + case 'Error': + return keysEqual(leftHandOperand, rightHandOperand, [ 'name', 'message', 'code' ], options); + case 'Arguments': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'Array': + return iterableEqual(leftHandOperand, rightHandOperand, options); + case 'RegExp': + return regexpEqual(leftHandOperand, rightHandOperand); + case 'Generator': + return generatorEqual(leftHandOperand, rightHandOperand, options); + case 'DataView': + return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options); + case 'ArrayBuffer': + return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options); + case 'Set': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Map': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Temporal.PlainDate': + case 'Temporal.PlainTime': + case 'Temporal.PlainDateTime': + case 'Temporal.Instant': + case 'Temporal.ZonedDateTime': + case 'Temporal.PlainYearMonth': + case 'Temporal.PlainMonthDay': + return leftHandOperand.equals(rightHandOperand); + case 'Temporal.Duration': + return leftHandOperand.total('nanoseconds') === rightHandOperand.total('nanoseconds'); + case 'Temporal.TimeZone': + case 'Temporal.Calendar': + return leftHandOperand.toString() === rightHandOperand.toString(); + default: + return objectEqual(leftHandOperand, rightHandOperand, options); + } +} + +/*! + * Compare two Regular Expressions for equality. + * + * @param {RegExp} leftHandOperand + * @param {RegExp} rightHandOperand + * @return {Boolean} result + */ + +function regexpEqual(leftHandOperand, rightHandOperand) { + return leftHandOperand.toString() === rightHandOperand.toString(); +} + +/*! + * Compare two Sets/Maps for equality. Faster than other equality functions. + * + * @param {Set} leftHandOperand + * @param {Set} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function entriesEqual(leftHandOperand, rightHandOperand, options) { + // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach + if (leftHandOperand.size !== rightHandOperand.size) { + return false; + } + if (leftHandOperand.size === 0) { + return true; + } + var leftHandItems = []; + var rightHandItems = []; + leftHandOperand.forEach(function gatherEntries(key, value) { + leftHandItems.push([ key, value ]); + }); + rightHandOperand.forEach(function gatherEntries(key, value) { + rightHandItems.push([ key, value ]); + }); + return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options); +} + +/*! + * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function iterableEqual(leftHandOperand, rightHandOperand, options) { + var length = leftHandOperand.length; + if (length !== rightHandOperand.length) { + return false; + } + if (length === 0) { + return true; + } + var index = -1; + while (++index < length) { + if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) { + return false; + } + } + return true; +} + +/*! + * Simple equality for generator objects such as those returned by generator functions. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + +function generatorEqual(leftHandOperand, rightHandOperand, options) { + return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options); +} + +/*! + * Determine if the given object has an @@iterator function. + * + * @param {Object} target + * @return {Boolean} `true` if the object has an @@iterator function. + */ +function hasIteratorFunction(target) { + return typeof Symbol !== 'undefined' && + typeof target === 'object' && + typeof Symbol.iterator !== 'undefined' && + typeof target[Symbol.iterator] === 'function'; +} + +/*! + * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. + * This will consume the iterator - which could have side effects depending on the @@iterator implementation. + * + * @param {Object} target + * @returns {Array} an array of entries from the @@iterator function + */ +function getIteratorEntries(target) { + if (hasIteratorFunction(target)) { + try { + return getGeneratorEntries(target[Symbol.iterator]()); + } catch (iteratorError) { + return []; + } + } + return []; +} + +/*! + * Gets all entries from a Generator. This will consume the generator - which could have side effects. + * + * @param {Generator} target + * @returns {Array} an array of entries from the Generator. + */ +function getGeneratorEntries(generator) { + var generatorResult = generator.next(); + var accumulator = [ generatorResult.value ]; + while (generatorResult.done === false) { + generatorResult = generator.next(); + accumulator.push(generatorResult.value); + } + return accumulator; +} + +/*! + * Gets all own and inherited enumerable keys from a target. + * + * @param {Object} target + * @returns {Array} an array of own and inherited enumerable keys from the target. + */ +function getEnumerableKeys(target) { + var keys = []; + for (var key in target) { + keys.push(key); + } + return keys; +} + +function getNonEnumerableSymbols(target) { + var keys = Object.getOwnPropertySymbols(target); + return keys; +} + +/*! + * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of + * each key. If any value of the given key is not equal, the function will return false (early). + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function keysEqual(leftHandOperand, rightHandOperand, keys, options) { + var length = keys.length; + if (length === 0) { + return true; + } + for (var i = 0; i < length; i += 1) { + if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) { + return false; + } + } + return true; +} + +/*! + * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` + * for each enumerable key in the object. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function objectEqual(leftHandOperand, rightHandOperand, options) { + var leftHandKeys = getEnumerableKeys(leftHandOperand); + var rightHandKeys = getEnumerableKeys(rightHandOperand); + var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand); + var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand); + leftHandKeys = leftHandKeys.concat(leftHandSymbols); + rightHandKeys = rightHandKeys.concat(rightHandSymbols); + + if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { + if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) { + return false; + } + return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options); + } + + var leftHandEntries = getIteratorEntries(leftHandOperand); + var rightHandEntries = getIteratorEntries(rightHandOperand); + if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) { + leftHandEntries.sort(); + rightHandEntries.sort(); + return iterableEqual(leftHandEntries, rightHandEntries, options); + } + + if (leftHandKeys.length === 0 && + leftHandEntries.length === 0 && + rightHandKeys.length === 0 && + rightHandEntries.length === 0) { + return true; + } + + return false; +} + +/*! + * Returns true if the argument is a primitive. + * + * This intentionally returns true for all objects that can be compared by reference, + * including functions and symbols. + * + * @param {Mixed} value + * @return {Boolean} result + */ +function isPrimitive(value) { + return value === null || typeof value !== 'object'; +} + +function mapSymbols(arr) { + return arr.map(function mapSymbol(entry) { + if (typeof entry === 'symbol') { + return entry.toString(); + } + + return entry; + }); +} + +},{"type-detect":39}],36:[function(require,module,exports){ +'use strict'; + +/* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + +/** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + +var toString = Function.prototype.toString; +var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; +function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = toString.call(aFunc).match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; +} + +module.exports = getFuncName; + +},{}],37:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.loupe = {})); +}(this, (function (exports) { 'use strict'; + + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var ansiColors = { + bold: ['1', '22'], + dim: ['2', '22'], + italic: ['3', '23'], + underline: ['4', '24'], + // 5 & 6 are blinking + inverse: ['7', '27'], + hidden: ['8', '28'], + strike: ['9', '29'], + // 10-20 are fonts + // 21-29 are resets for 1-9 + black: ['30', '39'], + red: ['31', '39'], + green: ['32', '39'], + yellow: ['33', '39'], + blue: ['34', '39'], + magenta: ['35', '39'], + cyan: ['36', '39'], + white: ['37', '39'], + brightblack: ['30;1', '39'], + brightred: ['31;1', '39'], + brightgreen: ['32;1', '39'], + brightyellow: ['33;1', '39'], + brightblue: ['34;1', '39'], + brightmagenta: ['35;1', '39'], + brightcyan: ['36;1', '39'], + brightwhite: ['37;1', '39'], + grey: ['90', '39'] + }; + var styles = { + special: 'cyan', + number: 'yellow', + bigint: 'yellow', + boolean: 'yellow', + undefined: 'grey', + null: 'bold', + string: 'green', + symbol: 'green', + date: 'magenta', + regexp: 'red' + }; + var truncator = '…'; + + function colorise(value, styleType) { + var color = ansiColors[styles[styleType]] || ansiColors[styleType]; + + if (!color) { + return String(value); + } + + return "\x1B[".concat(color[0], "m").concat(String(value), "\x1B[").concat(color[1], "m"); + } + + function normaliseOptions() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$showHidden = _ref.showHidden, + showHidden = _ref$showHidden === void 0 ? false : _ref$showHidden, + _ref$depth = _ref.depth, + depth = _ref$depth === void 0 ? 2 : _ref$depth, + _ref$colors = _ref.colors, + colors = _ref$colors === void 0 ? false : _ref$colors, + _ref$customInspect = _ref.customInspect, + customInspect = _ref$customInspect === void 0 ? true : _ref$customInspect, + _ref$showProxy = _ref.showProxy, + showProxy = _ref$showProxy === void 0 ? false : _ref$showProxy, + _ref$maxArrayLength = _ref.maxArrayLength, + maxArrayLength = _ref$maxArrayLength === void 0 ? Infinity : _ref$maxArrayLength, + _ref$breakLength = _ref.breakLength, + breakLength = _ref$breakLength === void 0 ? Infinity : _ref$breakLength, + _ref$seen = _ref.seen, + seen = _ref$seen === void 0 ? [] : _ref$seen, + _ref$truncate = _ref.truncate, + truncate = _ref$truncate === void 0 ? Infinity : _ref$truncate, + _ref$stylize = _ref.stylize, + stylize = _ref$stylize === void 0 ? String : _ref$stylize; + + var options = { + showHidden: Boolean(showHidden), + depth: Number(depth), + colors: Boolean(colors), + customInspect: Boolean(customInspect), + showProxy: Boolean(showProxy), + maxArrayLength: Number(maxArrayLength), + breakLength: Number(breakLength), + truncate: Number(truncate), + seen: seen, + stylize: stylize + }; + + if (options.colors) { + options.stylize = colorise; + } + + return options; + } + function truncate(string, length) { + var tail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : truncator; + string = String(string); + var tailLength = tail.length; + var stringLength = string.length; + + if (tailLength > length && stringLength > tailLength) { + return tail; + } + + if (stringLength > length && stringLength > tailLength) { + return "".concat(string.slice(0, length - tailLength)).concat(tail); + } + + return string; + } // eslint-disable-next-line complexity + + function inspectList(list, options, inspectItem) { + var separator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ', '; + inspectItem = inspectItem || options.inspect; + var size = list.length; + if (size === 0) return ''; + var originalLength = options.truncate; + var output = ''; + var peek = ''; + var truncated = ''; + + for (var i = 0; i < size; i += 1) { + var last = i + 1 === list.length; + var secondToLast = i + 2 === list.length; + truncated = "".concat(truncator, "(").concat(list.length - i, ")"); + var value = list[i]; // If there is more than one remaining we need to account for a separator of `, ` + + options.truncate = originalLength - output.length - (last ? 0 : separator.length); + var string = peek || inspectItem(value, options) + (last ? '' : separator); + var nextLength = output.length + string.length; + var truncatedLength = nextLength + truncated.length; // If this is the last element, and adding it would + // take us over length, but adding the truncator wouldn't - then break now + + if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) { + break; + } // If this isn't the last or second to last element to scan, + // but the string is already over length then break here + + + if (!last && !secondToLast && truncatedLength > originalLength) { + break; + } // Peek at the next string to determine if we should + // break early before adding this item to the output + + + peek = last ? '' : inspectItem(list[i + 1], options) + (secondToLast ? '' : separator); // If we have one element left, but this element and + // the next takes over length, the break early + + if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) { + break; + } + + output += string; // If the next element takes us to length - + // but there are more after that, then we should truncate now + + if (!last && !secondToLast && nextLength + peek.length >= originalLength) { + truncated = "".concat(truncator, "(").concat(list.length - i - 1, ")"); + break; + } + + truncated = ''; + } + + return "".concat(output).concat(truncated); + } + + function quoteComplexKey(key) { + if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) { + return key; + } + + return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); + } + + function inspectProperty(_ref2, options) { + var _ref3 = _slicedToArray(_ref2, 2), + key = _ref3[0], + value = _ref3[1]; + + options.truncate -= 2; + + if (typeof key === 'string') { + key = quoteComplexKey(key); + } else if (typeof key !== 'number') { + key = "[".concat(options.inspect(key, options), "]"); + } + + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, ": ").concat(value); + } + + function inspectArray(array, options) { + // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return '[]'; + options.truncate -= 4; + var listContents = inspectList(array, options); + options.truncate -= listContents.length; + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "[ ".concat(listContents).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + /* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + + var toString = Function.prototype.toString; + var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; + function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = toString.call(aFunc).match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; + } + + var getFuncName_1 = getFuncName; + + var getArrayName = function getArrayName(array) { + // We need to special case Node.js' Buffers, which report to be Uint8Array + if (typeof Buffer === 'function' && array instanceof Buffer) { + return 'Buffer'; + } + + if (array[Symbol.toStringTag]) { + return array[Symbol.toStringTag]; + } + + return getFuncName_1(array.constructor); + }; + + function inspectTypedArray(array, options) { + var name = getArrayName(array); + options.truncate -= name.length + 4; // Object.keys will always output the Array indices first, so we can slice by + // `array.length` to get non-index properties + + var nonIndexProperties = Object.keys(array).slice(array.length); + if (!array.length && !nonIndexProperties.length) return "".concat(name, "[]"); // As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply + // stylise the toString() value of them + + var output = ''; + + for (var i = 0; i < array.length; i++) { + var string = "".concat(options.stylize(truncate(array[i], options.truncate), 'number')).concat(i === array.length - 1 ? '' : ', '); + options.truncate -= string.length; + + if (array[i] !== array.length && options.truncate <= 3) { + output += "".concat(truncator, "(").concat(array.length - array[i] + 1, ")"); + break; + } + + output += string; + } + + var propertyContents = ''; + + if (nonIndexProperties.length) { + propertyContents = inspectList(nonIndexProperties.map(function (key) { + return [key, array[key]]; + }), options, inspectProperty); + } + + return "".concat(name, "[ ").concat(output).concat(propertyContents ? ", ".concat(propertyContents) : '', " ]"); + } + + function inspectDate(dateObject, options) { + // If we need to - truncate the time portion, but never the date + var split = dateObject.toJSON().split('T'); + var date = split[0]; + return options.stylize("".concat(date, "T").concat(truncate(split[1], options.truncate - date.length - 1)), 'date'); + } + + function inspectFunction(func, options) { + var name = getFuncName_1(func); + + if (!name) { + return options.stylize('[Function]', 'special'); + } + + return options.stylize("[Function ".concat(truncate(name, options.truncate - 11), "]"), 'special'); + } + + function inspectMapEntry(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 4; + key = options.inspect(key, options); + options.truncate -= key.length; + value = options.inspect(value, options); + return "".concat(key, " => ").concat(value); + } // IE11 doesn't support `map.entries()` + + + function mapToEntries(map) { + var entries = []; + map.forEach(function (value, key) { + entries.push([key, value]); + }); + return entries; + } + + function inspectMap(map, options) { + var size = map.size - 1; + + if (size <= 0) { + return 'Map{}'; + } + + options.truncate -= 7; + return "Map{ ".concat(inspectList(mapToEntries(map), options, inspectMapEntry), " }"); + } + + var isNaN = Number.isNaN || function (i) { + return i !== i; + }; // eslint-disable-line no-self-compare + + + function inspectNumber(number, options) { + if (isNaN(number)) { + return options.stylize('NaN', 'number'); + } + + if (number === Infinity) { + return options.stylize('Infinity', 'number'); + } + + if (number === -Infinity) { + return options.stylize('-Infinity', 'number'); + } + + if (number === 0) { + return options.stylize(1 / number === Infinity ? '+0' : '-0', 'number'); + } + + return options.stylize(truncate(number, options.truncate), 'number'); + } + + function inspectBigInt(number, options) { + var nums = truncate(number.toString(), options.truncate - 1); + if (nums !== truncator) nums += 'n'; + return options.stylize(nums, 'bigint'); + } + + function inspectRegExp(value, options) { + var flags = value.toString().split('/')[2]; + var sourceLength = options.truncate - (2 + flags.length); + var source = value.source; + return options.stylize("/".concat(truncate(source, sourceLength), "/").concat(flags), 'regexp'); + } + + function arrayFromSet(set) { + var values = []; + set.forEach(function (value) { + values.push(value); + }); + return values; + } + + function inspectSet(set, options) { + if (set.size === 0) return 'Set{}'; + options.truncate -= 7; + return "Set{ ".concat(inspectList(arrayFromSet(set), options), " }"); + } + + var stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5" + "\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", 'g'); + var escapeCharacters = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + "'": "\\'", + '\\': '\\\\' + }; + var hex = 16; + var unicodeLength = 4; + + function escape(char) { + return escapeCharacters[char] || "\\u".concat("0000".concat(char.charCodeAt(0).toString(hex)).slice(-unicodeLength)); + } + + function inspectString(string, options) { + if (stringEscapeChars.test(string)) { + string = string.replace(stringEscapeChars, escape); + } + + return options.stylize("'".concat(truncate(string, options.truncate - 2), "'"), 'string'); + } + + function inspectSymbol(value) { + if ('description' in Symbol.prototype) { + return value.description ? "Symbol(".concat(value.description, ")") : 'Symbol()'; + } + + return value.toString(); + } + + var getPromiseValue = function getPromiseValue() { + return 'Promise{…}'; + }; + + try { + var _process$binding = process.binding('util'), + getPromiseDetails = _process$binding.getPromiseDetails, + kPending = _process$binding.kPending, + kRejected = _process$binding.kRejected; + + if (Array.isArray(getPromiseDetails(Promise.resolve()))) { + getPromiseValue = function getPromiseValue(value, options) { + var _getPromiseDetails = getPromiseDetails(value), + _getPromiseDetails2 = _slicedToArray(_getPromiseDetails, 2), + state = _getPromiseDetails2[0], + innerValue = _getPromiseDetails2[1]; + + if (state === kPending) { + return 'Promise{}'; + } + + return "Promise".concat(state === kRejected ? '!' : '', "{").concat(options.inspect(innerValue, options), "}"); + }; + } + } catch (notNode) { + /* ignore */ + } + + var inspectPromise = getPromiseValue; + + function inspectObject(object, options) { + var properties = Object.getOwnPropertyNames(object); + var symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : []; + + if (properties.length === 0 && symbols.length === 0) { + return '{}'; + } + + options.truncate -= 4; + options.seen = options.seen || []; + + if (options.seen.indexOf(object) >= 0) { + return '[Circular]'; + } + + options.seen.push(object); + var propertyContents = inspectList(properties.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + var symbolContents = inspectList(symbols.map(function (key) { + return [key, object[key]]; + }), options, inspectProperty); + options.seen.pop(); + var sep = ''; + + if (propertyContents && symbolContents) { + sep = ', '; + } + + return "{ ".concat(propertyContents).concat(sep).concat(symbolContents, " }"); + } + + var toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag ? Symbol.toStringTag : false; + function inspectClass(value, options) { + var name = ''; + + if (toStringTag && toStringTag in value) { + name = value[toStringTag]; + } + + name = name || getFuncName_1(value.constructor); // Babel transforms anonymous classes to the name `_class` + + if (!name || name === '_class') { + name = ''; + } + + options.truncate -= name.length; + return "".concat(name).concat(inspectObject(value, options)); + } + + function inspectArguments(args, options) { + if (args.length === 0) return 'Arguments[]'; + options.truncate -= 13; + return "Arguments[ ".concat(inspectList(args, options), " ]"); + } + + var errorKeys = ['stack', 'line', 'column', 'name', 'message', 'fileName', 'lineNumber', 'columnNumber', 'number', 'description']; + function inspectObject$1(error, options) { + var properties = Object.getOwnPropertyNames(error).filter(function (key) { + return errorKeys.indexOf(key) === -1; + }); + var name = error.name; + options.truncate -= name.length; + var message = ''; + + if (typeof error.message === 'string') { + message = truncate(error.message, options.truncate); + } else { + properties.unshift('message'); + } + + message = message ? ": ".concat(message) : ''; + options.truncate -= message.length + 5; + var propertyContents = inspectList(properties.map(function (key) { + return [key, error[key]]; + }), options, inspectProperty); + return "".concat(name).concat(message).concat(propertyContents ? " { ".concat(propertyContents, " }") : ''); + } + + function inspectAttribute(_ref, options) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + options.truncate -= 3; + + if (!value) { + return "".concat(options.stylize(key, 'yellow')); + } + + return "".concat(options.stylize(key, 'yellow'), "=").concat(options.stylize("\"".concat(value, "\""), 'string')); + } + function inspectHTMLCollection(collection, options) { + // eslint-disable-next-line no-use-before-define + return inspectList(collection, options, inspectHTML, '\n'); + } + function inspectHTML(element, options) { + var properties = element.getAttributeNames(); + var name = element.tagName.toLowerCase(); + var head = options.stylize("<".concat(name), 'special'); + var headClose = options.stylize(">", 'special'); + var tail = options.stylize(""), 'special'); + options.truncate -= name.length * 2 + 5; + var propertyContents = ''; + + if (properties.length > 0) { + propertyContents += ' '; + propertyContents += inspectList(properties.map(function (key) { + return [key, element.getAttribute(key)]; + }), options, inspectAttribute, ' '); + } + + options.truncate -= propertyContents.length; + var truncate = options.truncate; + var children = inspectHTMLCollection(element.children, options); + + if (children && children.length > truncate) { + children = "".concat(truncator, "(").concat(element.children.length, ")"); + } + + return "".concat(head).concat(propertyContents).concat(headClose).concat(children).concat(tail); + } + + var symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function'; + var chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect'; + var nodeInspect = false; + + try { + // eslint-disable-next-line global-require + var nodeUtil = require('util'); + + nodeInspect = nodeUtil.inspect ? nodeUtil.inspect.custom : false; + } catch (noNodeInspect) { + nodeInspect = false; + } + + var constructorMap = new WeakMap(); + var stringTagMap = {}; + var baseTypesMap = { + undefined: function undefined$1(value, options) { + return options.stylize('undefined', 'undefined'); + }, + null: function _null(value, options) { + return options.stylize(null, 'null'); + }, + boolean: function boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + Boolean: function Boolean(value, options) { + return options.stylize(value, 'boolean'); + }, + number: inspectNumber, + Number: inspectNumber, + bigint: inspectBigInt, + BigInt: inspectBigInt, + string: inspectString, + String: inspectString, + function: inspectFunction, + Function: inspectFunction, + symbol: inspectSymbol, + // A Symbol polyfill will return `Symbol` not `symbol` from typedetect + Symbol: inspectSymbol, + Array: inspectArray, + Date: inspectDate, + Map: inspectMap, + Set: inspectSet, + RegExp: inspectRegExp, + Promise: inspectPromise, + // WeakSet, WeakMap are totally opaque to us + WeakSet: function WeakSet(value, options) { + return options.stylize('WeakSet{…}', 'special'); + }, + WeakMap: function WeakMap(value, options) { + return options.stylize('WeakMap{…}', 'special'); + }, + Arguments: inspectArguments, + Int8Array: inspectTypedArray, + Uint8Array: inspectTypedArray, + Uint8ClampedArray: inspectTypedArray, + Int16Array: inspectTypedArray, + Uint16Array: inspectTypedArray, + Int32Array: inspectTypedArray, + Uint32Array: inspectTypedArray, + Float32Array: inspectTypedArray, + Float64Array: inspectTypedArray, + Generator: function Generator() { + return ''; + }, + DataView: function DataView() { + return ''; + }, + ArrayBuffer: function ArrayBuffer() { + return ''; + }, + Error: inspectObject$1, + HTMLCollection: inspectHTMLCollection, + NodeList: inspectHTMLCollection + }; // eslint-disable-next-line complexity + + var inspectCustom = function inspectCustom(value, options, type) { + if (chaiInspect in value && typeof value[chaiInspect] === 'function') { + return value[chaiInspect](options); + } + + if (nodeInspect && nodeInspect in value && typeof value[nodeInspect] === 'function') { + return value[nodeInspect](options.depth, options); + } + + if ('inspect' in value && typeof value.inspect === 'function') { + return value.inspect(options.depth, options); + } + + if ('constructor' in value && constructorMap.has(value.constructor)) { + return constructorMap.get(value.constructor)(value, options); + } + + if (stringTagMap[type]) { + return stringTagMap[type](value, options); + } + + return ''; + }; + + var toString$1 = Object.prototype.toString; // eslint-disable-next-line complexity + + function inspect(value, options) { + options = normaliseOptions(options); + options.inspect = inspect; + var _options = options, + customInspect = _options.customInspect; + var type = value === null ? 'null' : _typeof(value); + + if (type === 'object') { + type = toString$1.call(value).slice(8, -1); + } // If it is a base value that we already support, then use Loupe's inspector + + + if (baseTypesMap[type]) { + return baseTypesMap[type](value, options); + } // If `options.customInspect` is set to true then try to use the custom inspector + + + if (customInspect && value) { + var output = inspectCustom(value, options, type); + + if (output) { + if (typeof output === 'string') return output; + return inspect(output, options); + } + } + + var proto = value ? Object.getPrototypeOf(value) : false; // If it's a plain Object then use Loupe's inspector + + if (proto === Object.prototype || proto === null) { + return inspectObject(value, options); + } // Specifically account for HTMLElements + // eslint-disable-next-line no-undef + + + if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { + return inspectHTML(value, options); + } + + if ('constructor' in value) { + // If it is a class, inspect it like an object but add the constructor name + if (value.constructor !== Object) { + return inspectClass(value, options); + } // If it is an object with an anonymous prototype, display it as an object. + + + return inspectObject(value, options); + } // We have run out of options! Just stringify the value + + + return options.stylize(String(value), type); + } + function registerConstructor(constructor, inspector) { + if (constructorMap.has(constructor)) { + return false; + } + + constructorMap.add(constructor, inspector); + return true; + } + function registerStringTag(stringTag, inspector) { + if (stringTag in stringTagMap) { + return false; + } + + stringTagMap[stringTag] = inspector; + return true; + } + var custom = chaiInspect; + + exports.custom = custom; + exports.default = inspect; + exports.inspect = inspect; + exports.registerConstructor = registerConstructor; + exports.registerStringTag = registerStringTag; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{"util":undefined}],38:[function(require,module,exports){ +'use strict'; + +/* ! + * Chai - pathval utility + * Copyright(c) 2012-2014 Jake Luer + * @see https://github.com/logicalparadox/filtr + * MIT Licensed + */ + +/** + * ### .hasProperty(object, name) + * + * This allows checking whether an object has own + * or inherited from prototype chain named property. + * + * Basically does the same thing as the `in` + * operator but works properly with null/undefined values + * and other primitives. + * + * var obj = { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * + * The following would be the results. + * + * hasProperty(obj, 'str'); // true + * hasProperty(obj, 'constructor'); // true + * hasProperty(obj, 'bar'); // false + * + * hasProperty(obj.str, 'length'); // true + * hasProperty(obj.str, 1); // true + * hasProperty(obj.str, 5); // false + * + * hasProperty(obj.arr, 'length'); // true + * hasProperty(obj.arr, 2); // true + * hasProperty(obj.arr, 3); // false + * + * @param {Object} object + * @param {String|Symbol} name + * @returns {Boolean} whether it exists + * @namespace Utils + * @name hasProperty + * @api public + */ + +function hasProperty(obj, name) { + if (typeof obj === 'undefined' || obj === null) { + return false; + } + + // The `in` operator does not work with primitives. + return name in Object(obj); +} + +/* ! + * ## parsePath(path) + * + * Helper function used to parse string object + * paths. Use in conjunction with `internalGetPathValue`. + * + * var parsed = parsePath('myobject.property.subprop'); + * + * ### Paths: + * + * * Can be infinitely deep and nested. + * * Arrays are also valid using the formal `myobject.document[3].property`. + * * Literal dots and brackets (not delimiter) must be backslash-escaped. + * + * @param {String} path + * @returns {Object} parsed + * @api private + */ + +function parsePath(path) { + var str = path.replace(/([^\\])\[/g, '$1.['); + var parts = str.match(/(\\\.|[^.]+?)+/g); + return parts.map(function mapMatches(value) { + if ( + value === 'constructor' || + value === '__proto__' || + value === 'prototype' + ) { + return {}; + } + var regexp = /^\[(\d+)\]$/; + var mArr = regexp.exec(value); + var parsed = null; + if (mArr) { + parsed = { i: parseFloat(mArr[1]) }; + } else { + parsed = { p: value.replace(/\\([.[\]])/g, '$1') }; + } + + return parsed; + }); +} + +/* ! + * ## internalGetPathValue(obj, parsed[, pathDepth]) + * + * Helper companion function for `.parsePath` that returns + * the value located at the parsed address. + * + * var value = getPathValue(obj, parsed); + * + * @param {Object} object to search against + * @param {Object} parsed definition from `parsePath`. + * @param {Number} depth (nesting level) of the property we want to retrieve + * @returns {Object|Undefined} value + * @api private + */ + +function internalGetPathValue(obj, parsed, pathDepth) { + var temporaryValue = obj; + var res = null; + pathDepth = typeof pathDepth === 'undefined' ? parsed.length : pathDepth; + + for (var i = 0; i < pathDepth; i++) { + var part = parsed[i]; + if (temporaryValue) { + if (typeof part.p === 'undefined') { + temporaryValue = temporaryValue[part.i]; + } else { + temporaryValue = temporaryValue[part.p]; + } + + if (i === pathDepth - 1) { + res = temporaryValue; + } + } + } + + return res; +} + +/* ! + * ## internalSetPathValue(obj, value, parsed) + * + * Companion function for `parsePath` that sets + * the value located at a parsed address. + * + * internalSetPathValue(obj, 'value', parsed); + * + * @param {Object} object to search and define on + * @param {*} value to use upon set + * @param {Object} parsed definition from `parsePath` + * @api private + */ + +function internalSetPathValue(obj, val, parsed) { + var tempObj = obj; + var pathDepth = parsed.length; + var part = null; + // Here we iterate through every part of the path + for (var i = 0; i < pathDepth; i++) { + var propName = null; + var propVal = null; + part = parsed[i]; + + // If it's the last part of the path, we set the 'propName' value with the property name + if (i === pathDepth - 1) { + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Now we set the property with the name held by 'propName' on object with the desired val + tempObj[propName] = val; + } else if (typeof part.p !== 'undefined' && tempObj[part.p]) { + tempObj = tempObj[part.p]; + } else if (typeof part.i !== 'undefined' && tempObj[part.i]) { + tempObj = tempObj[part.i]; + } else { + // If the obj doesn't have the property we create one with that name to define it + var next = parsed[i + 1]; + // Here we set the name of the property which will be defined + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Here we decide if this property will be an array or a new object + propVal = typeof next.p === 'undefined' ? [] : {}; + tempObj[propName] = propVal; + tempObj = tempObj[propName]; + } + } +} + +/** + * ### .getPathInfo(object, path) + * + * This allows the retrieval of property info in an + * object given a string path. + * + * The path info consists of an object with the + * following properties: + * + * * parent - The parent object of the property referenced by `path` + * * name - The name of the final property, a number if it was an array indexer + * * value - The value of the property, if it exists, otherwise `undefined` + * * exists - Whether the property exists or not + * + * @param {Object} object + * @param {String} path + * @returns {Object} info + * @namespace Utils + * @name getPathInfo + * @api public + */ + +function getPathInfo(obj, path) { + var parsed = parsePath(path); + var last = parsed[parsed.length - 1]; + var info = { + parent: + parsed.length > 1 ? + internalGetPathValue(obj, parsed, parsed.length - 1) : + obj, + name: last.p || last.i, + value: internalGetPathValue(obj, parsed), + }; + info.exists = hasProperty(info.parent, info.name); + + return info; +} + +/** + * ### .getPathValue(object, path) + * + * This allows the retrieval of values in an + * object given a string path. + * + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * } + * + * The following would be the results. + * + * getPathValue(obj, 'prop1.str'); // Hello + * getPathValue(obj, 'prop1.att[2]'); // b + * getPathValue(obj, 'prop2.arr[0].nested'); // Universe + * + * @param {Object} object + * @param {String} path + * @returns {Object} value or `undefined` + * @namespace Utils + * @name getPathValue + * @api public + */ + +function getPathValue(obj, path) { + var info = getPathInfo(obj, path); + return info.value; +} + +/** + * ### .setPathValue(object, path, value) + * + * Define the value in an object at a given string path. + * + * ```js + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * }; + * ``` + * + * The following would be acceptable. + * + * ```js + * var properties = require('tea-properties'); + * properties.set(obj, 'prop1.str', 'Hello Universe!'); + * properties.set(obj, 'prop1.arr[2]', 'B'); + * properties.set(obj, 'prop2.arr[0].nested.value', { hello: 'universe' }); + * ``` + * + * @param {Object} object + * @param {String} path + * @param {Mixed} value + * @api private + */ + +function setPathValue(obj, path, val) { + var parsed = parsePath(path); + internalSetPathValue(obj, val, parsed); + return obj; +} + +module.exports = { + hasProperty: hasProperty, + getPathInfo: getPathInfo, + getPathValue: getPathValue, + setPathValue: setPathValue, +}; + +},{}],39:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.typeDetect = factory()); +}(this, (function () { 'use strict'; + +/* ! + * type-detect + * Copyright(c) 2013 jake luer + * MIT Licensed + */ +var promiseExists = typeof Promise === 'function'; + +/* eslint-disable no-undef */ +var globalObject = typeof self === 'object' ? self : global; // eslint-disable-line id-blacklist + +var symbolExists = typeof Symbol !== 'undefined'; +var mapExists = typeof Map !== 'undefined'; +var setExists = typeof Set !== 'undefined'; +var weakMapExists = typeof WeakMap !== 'undefined'; +var weakSetExists = typeof WeakSet !== 'undefined'; +var dataViewExists = typeof DataView !== 'undefined'; +var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; +var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; +var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; +var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; +var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); +var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); +var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; +var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); +var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; +var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); +var toStringLeftSliceLength = 8; +var toStringRightSliceLength = -1; +/** + * ### typeOf (obj) + * + * Uses `Object.prototype.toString` to determine the type of an object, + * normalising behaviour across engine versions & well optimised. + * + * @param {Mixed} object + * @return {String} object type + * @api public + */ +function typeDetect(obj) { + /* ! Speed optimisation + * Pre: + * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled) + * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled) + * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled) + * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled) + * function x 2,556,769 ops/sec ±1.73% (77 runs sampled) + * Post: + * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled) + * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled) + * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled) + * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled) + * function x 31,296,870 ops/sec ±0.96% (83 runs sampled) + */ + var typeofObj = typeof obj; + if (typeofObj !== 'object') { + return typeofObj; + } + + /* ! Speed optimisation + * Pre: + * null x 28,645,765 ops/sec ±1.17% (82 runs sampled) + * Post: + * null x 36,428,962 ops/sec ±1.37% (84 runs sampled) + */ + if (obj === null) { + return 'null'; + } + + /* ! Spec Conformance + * Test: `Object.prototype.toString.call(window)`` + * - Node === "[object global]" + * - Chrome === "[object global]" + * - Firefox === "[object Window]" + * - PhantomJS === "[object Window]" + * - Safari === "[object Window]" + * - IE 11 === "[object Window]" + * - IE Edge === "[object Window]" + * Test: `Object.prototype.toString.call(this)`` + * - Chrome Worker === "[object global]" + * - Firefox Worker === "[object DedicatedWorkerGlobalScope]" + * - Safari Worker === "[object DedicatedWorkerGlobalScope]" + * - IE 11 Worker === "[object WorkerGlobalScope]" + * - IE Edge Worker === "[object WorkerGlobalScope]" + */ + if (obj === globalObject) { + return 'global'; + } + + /* ! Speed optimisation + * Pre: + * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled) + * Post: + * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled) + */ + if ( + Array.isArray(obj) && + (symbolToStringTagExists === false || !(Symbol.toStringTag in obj)) + ) { + return 'Array'; + } + + // Not caching existence of `window` and related properties due to potential + // for `window` to be unset before tests in quasi-browser environments. + if (typeof window === 'object' && window !== null) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/browsers.html#location) + * WhatWG HTML$7.7.3 - The `Location` interface + * Test: `Object.prototype.toString.call(window.location)`` + * - IE <=11 === "[object Object]" + * - IE Edge <=13 === "[object Object]" + */ + if (typeof window.location === 'object' && obj === window.location) { + return 'Location'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#document) + * WhatWG HTML$3.1.1 - The `Document` object + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * WhatWG HTML states: + * > For historical reasons, Window objects must also have a + * > writable, configurable, non-enumerable property named + * > HTMLDocument whose value is the Document interface object. + * Test: `Object.prototype.toString.call(document)`` + * - Chrome === "[object HTMLDocument]" + * - Firefox === "[object HTMLDocument]" + * - Safari === "[object HTMLDocument]" + * - IE <=10 === "[object Document]" + * - IE 11 === "[object HTMLDocument]" + * - IE Edge <=13 === "[object HTMLDocument]" + */ + if (typeof window.document === 'object' && obj === window.document) { + return 'Document'; + } + + if (typeof window.navigator === 'object') { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray + * Test: `Object.prototype.toString.call(navigator.mimeTypes)`` + * - IE <=10 === "[object MSMimeTypesCollection]" + */ + if (typeof window.navigator.mimeTypes === 'object' && + obj === window.navigator.mimeTypes) { + return 'MimeTypeArray'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray + * Test: `Object.prototype.toString.call(navigator.plugins)`` + * - IE <=10 === "[object MSPluginsCollection]" + */ + if (typeof window.navigator.plugins === 'object' && + obj === window.navigator.plugins) { + return 'PluginArray'; + } + } + + if ((typeof window.HTMLElement === 'function' || + typeof window.HTMLElement === 'object') && + obj instanceof window.HTMLElement) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement` + * Test: `Object.prototype.toString.call(document.createElement('blockquote'))`` + * - IE <=10 === "[object HTMLBlockElement]" + */ + if (obj.tagName === 'BLOCKQUOTE') { + return 'HTMLQuoteElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltabledatacellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('td')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TD') { + return 'HTMLTableDataCellElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltableheadercellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('th')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TH') { + return 'HTMLTableHeaderCellElement'; + } + } + } + + /* ! Speed optimisation + * Pre: + * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled) + * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled) + * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled) + * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled) + * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled) + * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled) + * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled) + * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled) + * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled) + * Post: + * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled) + * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled) + * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled) + * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled) + * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled) + * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled) + * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled) + * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled) + * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled) + */ + var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); + if (typeof stringTag === 'string') { + return stringTag; + } + + var objPrototype = Object.getPrototypeOf(obj); + /* ! Speed optimisation + * Pre: + * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled) + * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled) + * Post: + * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled) + * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled) + */ + if (objPrototype === RegExp.prototype) { + return 'RegExp'; + } + + /* ! Speed optimisation + * Pre: + * date x 2,130,074 ops/sec ±4.42% (68 runs sampled) + * Post: + * date x 3,953,779 ops/sec ±1.35% (77 runs sampled) + */ + if (objPrototype === Date.prototype) { + return 'Date'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag) + * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise": + * Test: `Object.prototype.toString.call(Promise.resolve())`` + * - Chrome <=47 === "[object Object]" + * - Edge <=20 === "[object Object]" + * - Firefox 29-Latest === "[object Promise]" + * - Safari 7.1-Latest === "[object Promise]" + */ + if (promiseExists && objPrototype === Promise.prototype) { + return 'Promise'; + } + + /* ! Speed optimisation + * Pre: + * set x 2,222,186 ops/sec ±1.31% (82 runs sampled) + * Post: + * set x 4,545,879 ops/sec ±1.13% (83 runs sampled) + */ + if (setExists && objPrototype === Set.prototype) { + return 'Set'; + } + + /* ! Speed optimisation + * Pre: + * map x 2,396,842 ops/sec ±1.59% (81 runs sampled) + * Post: + * map x 4,183,945 ops/sec ±6.59% (82 runs sampled) + */ + if (mapExists && objPrototype === Map.prototype) { + return 'Map'; + } + + /* ! Speed optimisation + * Pre: + * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled) + * Post: + * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled) + */ + if (weakSetExists && objPrototype === WeakSet.prototype) { + return 'WeakSet'; + } + + /* ! Speed optimisation + * Pre: + * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled) + * Post: + * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled) + */ + if (weakMapExists && objPrototype === WeakMap.prototype) { + return 'WeakMap'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag) + * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView": + * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))`` + * - Edge <=13 === "[object Object]" + */ + if (dataViewExists && objPrototype === DataView.prototype) { + return 'DataView'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag) + * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator": + * Test: `Object.prototype.toString.call(new Map().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (mapExists && objPrototype === mapIteratorPrototype) { + return 'Map Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag) + * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator": + * Test: `Object.prototype.toString.call(new Set().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (setExists && objPrototype === setIteratorPrototype) { + return 'Set Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag) + * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator": + * Test: `Object.prototype.toString.call([][Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { + return 'Array Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag) + * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator": + * Test: `Object.prototype.toString.call(''[Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (stringIteratorExists && objPrototype === stringIteratorPrototype) { + return 'String Iterator'; + } + + /* ! Speed optimisation + * Pre: + * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled) + * Post: + * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled) + */ + if (objPrototype === null) { + return 'Object'; + } + + return Object + .prototype + .toString + .call(obj) + .slice(toStringLeftSliceLength, toStringRightSliceLength); +} + +return typeDetect; + +}))); + +},{}]},{},[1])(1) +}); diff --git a/www/static/test/1.9.2/node_modules/mocha/mocha.css b/www/static/test/1.9.2/node_modules/mocha/mocha.css new file mode 100644 index 000000000..b4d7e5b20 --- /dev/null +++ b/www/static/test/1.9.2/node_modules/mocha/mocha.css @@ -0,0 +1,392 @@ +@charset "utf-8"; + +:root { + --mocha-color: #000; + --mocha-bg-color: #fff; + --mocha-pass-icon-color: #00d6b2; + --mocha-pass-color: #fff; + --mocha-pass-shadow-color: rgba(0,0,0,.2); + --mocha-pass-mediump-color: #c09853; + --mocha-pass-slow-color: #b94a48; + --mocha-test-pending-color: #0b97c4; + --mocha-test-pending-icon-color: #0b97c4; + --mocha-test-fail-color: #c00; + --mocha-test-fail-icon-color: #c00; + --mocha-test-fail-pre-color: #000; + --mocha-test-fail-pre-error-color: #c00; + --mocha-test-html-error-color: #000; + --mocha-box-shadow-color: #eee; + --mocha-box-bottom-color: #ddd; + --mocha-test-replay-color: #000; + --mocha-test-replay-bg-color: #eee; + --mocha-stats-color: #888; + --mocha-stats-em-color: #000; + --mocha-stats-hover-color: #eee; + --mocha-error-color: #c00; + + --mocha-code-comment: #ddd; + --mocha-code-init: #2f6fad; + --mocha-code-string: #5890ad; + --mocha-code-keyword: #8a6343; + --mocha-code-number: #2f6fad; +} + +@media (prefers-color-scheme: dark) { + :root { + --mocha-color: #fff; + --mocha-bg-color: #222; + --mocha-pass-icon-color: #00d6b2; + --mocha-pass-color: #222; + --mocha-pass-shadow-color: rgba(255,255,255,.2); + --mocha-pass-mediump-color: #f1be67; + --mocha-pass-slow-color: #f49896; + --mocha-test-pending-color: #0b97c4; + --mocha-test-pending-icon-color: #0b97c4; + --mocha-test-fail-color: #f44; + --mocha-test-fail-icon-color: #f44; + --mocha-test-fail-pre-color: #fff; + --mocha-test-fail-pre-error-color: #f44; + --mocha-test-html-error-color: #fff; + --mocha-box-shadow-color: #444; + --mocha-box-bottom-color: #555; + --mocha-test-replay-color: #fff; + --mocha-test-replay-bg-color: #444; + --mocha-stats-color: #aaa; + --mocha-stats-em-color: #fff; + --mocha-stats-hover-color: #444; + --mocha-error-color: #f44; + + --mocha-code-comment: #ddd; + --mocha-code-init: #9cc7f1; + --mocha-code-string: #80d4ff; + --mocha-code-keyword: #e3a470; + --mocha-code-number: #4ca7ff; + } +} + +body { + margin:0; + background-color: var(--mocha-bg-color); + color: var(--mocha-color); +} + +#mocha { + font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 60px 50px; +} + +#mocha ul, +#mocha li { + margin: 0; + padding: 0; +} + +#mocha ul { + list-style: none; +} + +#mocha h1, +#mocha h2 { + margin: 0; +} + +#mocha h1 { + margin-top: 15px; + font-size: 1em; + font-weight: 200; +} + +#mocha h1 a { + text-decoration: none; + color: inherit; +} + +#mocha h1 a:hover { + text-decoration: underline; +} + +#mocha .suite .suite h1 { + margin-top: 0; + font-size: .8em; +} + +#mocha .hidden { + display: none; +} + +#mocha h2 { + font-size: 12px; + font-weight: normal; + cursor: pointer; +} + +#mocha .suite { + margin-left: 15px; +} + +#mocha .test { + margin-left: 15px; + overflow: hidden; +} + +#mocha .test.pending:hover h2::after { + content: '(pending)'; + font-family: arial, sans-serif; +} + +#mocha .test.pass.medium .duration { + background: var(--mocha-pass-mediump-color); +} + +#mocha .test.pass.slow .duration { + background: var(--mocha-pass-slow-color); +} + +#mocha .test.pass::before { + content: '✓'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: var(--mocha-pass-icon-color); +} + +#mocha .test.pass .duration { + font-size: 9px; + margin-left: 5px; + padding: 2px 5px; + color: var(--mocha-pass-color); + -webkit-box-shadow: inset 0 1px 1px var(--mocha-pass-shadow-color); + -moz-box-shadow: inset 0 1px 1px var(--mocha-pass-shadow-color); + box-shadow: inset 0 1px 1px var(--mocha-pass-shadow-color); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +#mocha .test.pass.fast .duration { + display: none; +} + +#mocha .test.pending { + color: var(--mocha-test-pending-color); +} + +#mocha .test.pending::before { + content: '◦'; + color: var(--mocha-test-pending-icon-color); +} + +#mocha .test.fail { + color: var(--mocha-test-fail-color); +} + +#mocha .test.fail pre { + color: var(--mocha-test-fail-pre-color); +} + +#mocha .test.fail::before { + content: '✖'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: var(--mocha-test-fail-icon-color); +} + +#mocha .test pre.error { + color: var(--mocha-test-fail-pre-error-color); + max-height: 300px; + overflow: auto; +} + +#mocha .test .html-error { + overflow: auto; + color: var(--mocha-test-html-error-color); + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid var(--mocha-box-shadow-color); + max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); + max-width: calc(100% - 42px); /*(2)*/ + max-height: 300px; + word-wrap: break-word; + border-bottom-color: var(--mocha-box-bottom-color); + -webkit-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + -moz-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mocha .test .html-error pre.error { + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: 0; + -moz-box-shadow: 0; + box-shadow: 0; + padding: 0; + margin: 0; + margin-top: 18px; + max-height: none; +} + +/** + * (1): approximate for browsers not supporting calc + * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) + * ^^ seriously + */ +#mocha .test pre { + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid var(--mocha-box-shadow-color); + max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); + max-width: calc(100% - 42px); /*(2)*/ + word-wrap: break-word; + border-bottom-color: var(--mocha-box-bottom-color); + -webkit-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + -moz-box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + box-shadow: 0 1px 3px var(--mocha-box-shadow-color); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mocha .test h2 { + position: relative; +} + +#mocha .test a.replay { + position: absolute; + top: 3px; + right: 0; + text-decoration: none; + vertical-align: middle; + display: block; + width: 15px; + height: 15px; + line-height: 15px; + text-align: center; + background: var(--mocha-test-replay-bg-color); + font-size: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + -webkit-transition:opacity 200ms; + -moz-transition:opacity 200ms; + -o-transition:opacity 200ms; + transition: opacity 200ms; + opacity: 0.7; + color: var(--mocha-test-replay-color); +} + +#mocha .test:hover a.replay { + box-shadow: 0 0 1px inset var(--mocha-test-replay-color); + opacity: 1; +} + +#mocha-report.pass .test.fail { + display: none; +} + +#mocha-report.fail .test.pass { + display: none; +} + +#mocha-report.pending .test.pass, +#mocha-report.pending .test.fail { + display: none; +} +#mocha-report.pending .test.pass.pending { + display: block; +} + +#mocha-error { + color: var(--mocha-error-color); + font-size: 1.5em; + font-weight: 100; + letter-spacing: 1px; +} + +#mocha-stats { + position: fixed; + top: 15px; + right: 10px; + font-size: 12px; + margin: 0; + color: var(--mocha-stats-color); + z-index: 1; +} + +#mocha-stats .progress { + float: right; + padding-top: 0; + + /** + * Set safe initial values, so mochas .progress does not inherit these + * properties from Bootstrap .progress (which causes .progress height to + * equal line height set in Bootstrap). + */ + height: auto; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background-color: initial; +} + +#mocha-stats em { + color: var(--mocha-stats-em-color); +} + +#mocha-stats a { + text-decoration: none; + color: inherit; +} + +#mocha-stats a:hover { + border-bottom: 1px solid var(--mocha-stats-hover-color); +} + +#mocha-stats li { + display: inline-block; + margin: 0 5px; + list-style: none; + padding-top: 11px; +} + +#mocha-stats canvas { + width: 40px; + height: 40px; +} + +#mocha code .comment { color: var(--mocha-code-comment); } +#mocha code .init { color: var(--mocha-code-init); } +#mocha code .string { color: var(--mocha-code-string); } +#mocha code .keyword { color: var(--mocha-code-keyword); } +#mocha code .number { color: var(--mocha-code-number); } + +@media screen and (max-device-width: 480px) { + #mocha { + margin: 60px 0px; + } + + #mocha #stats { + position: absolute; + } +} diff --git a/www/static/test/1.9.2/node_modules/mocha/mocha.js b/www/static/test/1.9.2/node_modules/mocha/mocha.js new file mode 100644 index 000000000..aeb8c75f0 --- /dev/null +++ b/www/static/test/1.9.2/node_modules/mocha/mocha.js @@ -0,0 +1,20635 @@ +// mocha@10.2.0 in javascript ES2018 +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.mocha = factory()); +})(this, (function () { 'use strict'; + + var global$2 = (typeof global !== "undefined" ? global : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {}); + + var global$1 = (typeof global$2 !== "undefined" ? global$2 : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {}); + + // shim for using process in browser + // based off https://github.com/defunctzombie/node-process/blob/master/browser.js + + function defaultSetTimout$1() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout$1 () { + throw new Error('clearTimeout has not been defined'); + } + var cachedSetTimeout$1 = defaultSetTimout$1; + var cachedClearTimeout$1 = defaultClearTimeout$1; + if (typeof global$1.setTimeout === 'function') { + cachedSetTimeout$1 = setTimeout; + } + if (typeof global$1.clearTimeout === 'function') { + cachedClearTimeout$1 = clearTimeout; + } + + function runTimeout$1(fun) { + if (cachedSetTimeout$1 === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout$1 === defaultSetTimout$1 || !cachedSetTimeout$1) && setTimeout) { + cachedSetTimeout$1 = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout$1(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout$1.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout$1.call(this, fun, 0); + } + } + + + } + function runClearTimeout$1(marker) { + if (cachedClearTimeout$1 === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout$1 === defaultClearTimeout$1 || !cachedClearTimeout$1) && clearTimeout) { + cachedClearTimeout$1 = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout$1(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout$1.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout$1.call(this, marker); + } + } + + + + } + var queue$1 = []; + var draining$1 = false; + var currentQueue$1; + var queueIndex$1 = -1; + + function cleanUpNextTick$1() { + if (!draining$1 || !currentQueue$1) { + return; + } + draining$1 = false; + if (currentQueue$1.length) { + queue$1 = currentQueue$1.concat(queue$1); + } else { + queueIndex$1 = -1; + } + if (queue$1.length) { + drainQueue$1(); + } + } + + function drainQueue$1() { + if (draining$1) { + return; + } + var timeout = runTimeout$1(cleanUpNextTick$1); + draining$1 = true; + + var len = queue$1.length; + while(len) { + currentQueue$1 = queue$1; + queue$1 = []; + while (++queueIndex$1 < len) { + if (currentQueue$1) { + currentQueue$1[queueIndex$1].run(); + } + } + queueIndex$1 = -1; + len = queue$1.length; + } + currentQueue$1 = null; + draining$1 = false; + runClearTimeout$1(timeout); + } + function nextTick$1(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue$1.push(new Item$1(fun, args)); + if (queue$1.length === 1 && !draining$1) { + runTimeout$1(drainQueue$1); + } + } + // v8 likes predictible objects + function Item$1(fun, array) { + this.fun = fun; + this.array = array; + } + Item$1.prototype.run = function () { + this.fun.apply(null, this.array); + }; + var title$1 = 'browser'; + var platform$1 = 'browser'; + var browser$4 = true; + var env$1 = {}; + var argv$1 = []; + var version$2 = ''; // empty string to avoid regexp issues + var versions$1 = {}; + var release$1 = {}; + var config$1 = {}; + + function noop$1() {} + + var on$1 = noop$1; + var addListener$1 = noop$1; + var once$1 = noop$1; + var off$1 = noop$1; + var removeListener$1 = noop$1; + var removeAllListeners$1 = noop$1; + var emit$1 = noop$1; + + function binding$1(name) { + throw new Error('process.binding is not supported'); + } + + function cwd$1 () { return '/' } + function chdir$1 (dir) { + throw new Error('process.chdir is not supported'); + }function umask$1() { return 0; } + + // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + var performance$1 = global$1.performance || {}; + var performanceNow$1 = + performance$1.now || + performance$1.mozNow || + performance$1.msNow || + performance$1.oNow || + performance$1.webkitNow || + function(){ return (new Date()).getTime() }; + + // generate timestamp or delta + // see http://nodejs.org/api/process.html#process_process_hrtime + function hrtime$1(previousTimestamp){ + var clocktime = performanceNow$1.call(performance$1)*1e-3; + var seconds = Math.floor(clocktime); + var nanoseconds = Math.floor((clocktime%1)*1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds<0) { + seconds--; + nanoseconds += 1e9; + } + } + return [seconds,nanoseconds] + } + + var startTime$1 = new Date(); + function uptime$1() { + var currentTime = new Date(); + var dif = currentTime - startTime$1; + return dif / 1000; + } + + var process = { + nextTick: nextTick$1, + title: title$1, + browser: browser$4, + env: env$1, + argv: argv$1, + version: version$2, + versions: versions$1, + on: on$1, + addListener: addListener$1, + once: once$1, + off: off$1, + removeListener: removeListener$1, + removeAllListeners: removeAllListeners$1, + emit: emit$1, + binding: binding$1, + cwd: cwd$1, + chdir: chdir$1, + umask: umask$1, + hrtime: hrtime$1, + platform: platform$1, + release: release$1, + config: config$1, + uptime: uptime$1 + }; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function getAugmentedNamespace(n) { + if (n.__esModule) return n; + var a = Object.defineProperty({}, '__esModule', {value: true}); + Object.keys(n).forEach(function (k) { + var d = Object.getOwnPropertyDescriptor(n, k); + Object.defineProperty(a, k, d.get ? d : { + enumerable: true, + get: function () { + return n[k]; + } + }); + }); + return a; + } + + function commonjsRequire (path) { + throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); + } + + var domain; + + // This constructor is used to store event handlers. Instantiating this is + // faster than explicitly calling `Object.create(null)` to get a "clean" empty + // object (tested with v8 v4.9). + function EventHandlers() {} + EventHandlers.prototype = Object.create(null); + + function EventEmitter$2() { + EventEmitter$2.init.call(this); + } + + // nodejs oddity + // require('events') === require('events').EventEmitter + EventEmitter$2.EventEmitter = EventEmitter$2; + + EventEmitter$2.usingDomains = false; + + EventEmitter$2.prototype.domain = undefined; + EventEmitter$2.prototype._events = undefined; + EventEmitter$2.prototype._maxListeners = undefined; + + // By default EventEmitters will print a warning if more than 10 listeners are + // added to it. This is a useful default which helps finding memory leaks. + EventEmitter$2.defaultMaxListeners = 10; + + EventEmitter$2.init = function() { + this.domain = null; + if (EventEmitter$2.usingDomains) { + // if there is an active domain, then attach to it. + if (domain.active ) ; + } + + if (!this._events || this._events === Object.getPrototypeOf(this)._events) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; + }; + + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + EventEmitter$2.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; + }; + + function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter$2.defaultMaxListeners; + return that._maxListeners; + } + + EventEmitter$2.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); + }; + + // These standalone emit* functions are used to optimize calling of event + // handlers for fast cases because emit() itself often has a variable number of + // arguments and can be deoptimized because of that. These functions always have + // the same number of arguments and thus do not get deoptimized, so the code + // inside them can execute faster. + function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } + } + function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } + } + function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } + } + function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } + } + + function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } + } + + EventEmitter$2.prototype.emit = function emit(type) { + var er, handler, len, args, i, events, domain; + var doError = (type === 'error'); + + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; + + domain = this.domain; + + // If there is no 'error' event listener then throw. + if (doError) { + er = arguments[1]; + if (domain) { + if (!er) + er = new Error('Uncaught, unspecified "error" event'); + er.domainEmitter = this; + er.domain = domain; + er.domainThrown = false; + domain.emit('error', er); + } else if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) + return false; + + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; + }; + + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = new EventHandlers(); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : + [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + type + ' listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + emitWarning$1(w); + } + } + } + + return target; + } + function emitWarning$1(e) { + typeof console.warn === 'function' ? console.warn(e) : console.log(e); + } + EventEmitter$2.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); + }; + + EventEmitter$2.prototype.on = EventEmitter$2.prototype.addListener; + + EventEmitter$2.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + + function _onceWrap(target, type, listener) { + var fired = false; + function g() { + target.removeListener(type, g); + if (!fired) { + fired = true; + listener.apply(target, arguments); + } + } + g.listener = listener; + return g; + } + + EventEmitter$2.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + + EventEmitter$2.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + + // emits a 'removeListener' event iff the listener was removed + EventEmitter$2.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) + return this; + + list = events[type]; + if (!list) + return this; + + if (list === listener || (list.listener && list.listener === listener)) { + if (--this._eventsCount === 0) + this._events = new EventHandlers(); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list[0] = undefined; + if (--this._eventsCount === 0) { + this._events = new EventHandlers(); + return this; + } else { + delete events[type]; + } + } else { + spliceOne(list, position); + } + + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + + // Alias for removeListener added in NodeJS 10.0 + // https://nodejs.org/api/events.html#events_emitter_off_eventname_listener + EventEmitter$2.prototype.off = function(type, listener){ + return this.removeListener(type, listener); + }; + + EventEmitter$2.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events; + + events = this._events; + if (!events) + return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = new EventHandlers(); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + for (var i = 0, key; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = new EventHandlers(); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + do { + this.removeListener(type, listeners[listeners.length - 1]); + } while (listeners[0]); + } + + return this; + }; + + EventEmitter$2.prototype.listeners = function listeners(type) { + var evlistener; + var ret; + var events = this._events; + + if (!events) + ret = []; + else { + evlistener = events[type]; + if (!evlistener) + ret = []; + else if (typeof evlistener === 'function') + ret = [evlistener.listener || evlistener]; + else + ret = unwrapListeners(evlistener); + } + + return ret; + }; + + EventEmitter$2.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount$1.call(emitter, type); + } + }; + + EventEmitter$2.prototype.listenerCount = listenerCount$1; + function listenerCount$1(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; + } + + EventEmitter$2.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; + }; + + // About 1.5x faster than the two-arg version of Array#splice(). + function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); + } + + function arrayClone(arr, i) { + var copy = new Array(i); + while (i--) + copy[i] = arr[i]; + return copy; + } + + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + + var _polyfillNode_events = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': EventEmitter$2, + EventEmitter: EventEmitter$2 + }); + + var lookup$1 = []; + var revLookup$1 = []; + var Arr$1 = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; + var inited$1 = false; + function init$1 () { + inited$1 = true; + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for (var i = 0, len = code.length; i < len; ++i) { + lookup$1[i] = code[i]; + revLookup$1[code.charCodeAt(i)] = i; + } + + revLookup$1['-'.charCodeAt(0)] = 62; + revLookup$1['_'.charCodeAt(0)] = 63; + } + + function toByteArray$1 (b64) { + if (!inited$1) { + init$1(); + } + var i, j, l, tmp, placeHolders, arr; + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr$1(len * 3 / 4 - placeHolders); + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len; + + var L = 0; + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup$1[b64.charCodeAt(i)] << 18) | (revLookup$1[b64.charCodeAt(i + 1)] << 12) | (revLookup$1[b64.charCodeAt(i + 2)] << 6) | revLookup$1[b64.charCodeAt(i + 3)]; + arr[L++] = (tmp >> 16) & 0xFF; + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + if (placeHolders === 2) { + tmp = (revLookup$1[b64.charCodeAt(i)] << 2) | (revLookup$1[b64.charCodeAt(i + 1)] >> 4); + arr[L++] = tmp & 0xFF; + } else if (placeHolders === 1) { + tmp = (revLookup$1[b64.charCodeAt(i)] << 10) | (revLookup$1[b64.charCodeAt(i + 1)] << 4) | (revLookup$1[b64.charCodeAt(i + 2)] >> 2); + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + return arr + } + + function tripletToBase64$1 (num) { + return lookup$1[num >> 18 & 0x3F] + lookup$1[num >> 12 & 0x3F] + lookup$1[num >> 6 & 0x3F] + lookup$1[num & 0x3F] + } + + function encodeChunk$1 (uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); + output.push(tripletToBase64$1(tmp)); + } + return output.join('') + } + + function fromByteArray$1 (uint8) { + if (!inited$1) { + init$1(); + } + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var output = ''; + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk$1(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + output += lookup$1[tmp >> 2]; + output += lookup$1[(tmp << 4) & 0x3F]; + output += '=='; + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); + output += lookup$1[tmp >> 10]; + output += lookup$1[(tmp >> 4) & 0x3F]; + output += lookup$1[(tmp << 2) & 0x3F]; + output += '='; + } + + parts.push(output); + + return parts.join('') + } + + function read$1 (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) + } + + function write$1 (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; + } + + var toString$2 = {}.toString; + + var isArray$2 = Array.isArray || function (arr) { + return toString$2.call(arr) == '[object Array]'; + }; + + /*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + + var INSPECT_MAX_BYTES$1 = 50; + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ + Buffer$1.TYPED_ARRAY_SUPPORT = global$2.TYPED_ARRAY_SUPPORT !== undefined + ? global$2.TYPED_ARRAY_SUPPORT + : true; + + function kMaxLength$1 () { + return Buffer$1.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff + } + + function createBuffer$1 (that, length) { + if (kMaxLength$1() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length); + that.__proto__ = Buffer$1.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer$1(length); + } + that.length = length; + } + + return that + } + + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + function Buffer$1 (arg, encodingOrOffset, length) { + if (!Buffer$1.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer$1)) { + return new Buffer$1(arg, encodingOrOffset, length) + } + + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe$1(this, arg) + } + return from$1(this, arg, encodingOrOffset, length) + } + + Buffer$1.poolSize = 8192; // not used by this implementation + + // TODO: Legacy, not needed anymore. Remove in next major version. + Buffer$1._augment = function (arr) { + arr.__proto__ = Buffer$1.prototype; + return arr + }; + + function from$1 (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer$1(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString$1(that, value, encodingOrOffset) + } + + return fromObject$1(that, value) + } + + /** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + Buffer$1.from = function (value, encodingOrOffset, length) { + return from$1(null, value, encodingOrOffset, length) + }; + + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + Buffer$1.prototype.__proto__ = Uint8Array.prototype; + Buffer$1.__proto__ = Uint8Array; + } + + function assertSize$1 (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } + } + + function alloc$1 (that, size, fill, encoding) { + assertSize$1(size); + if (size <= 0) { + return createBuffer$1(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer$1(that, size).fill(fill, encoding) + : createBuffer$1(that, size).fill(fill) + } + return createBuffer$1(that, size) + } + + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + Buffer$1.alloc = function (size, fill, encoding) { + return alloc$1(null, size, fill, encoding) + }; + + function allocUnsafe$1 (that, size) { + assertSize$1(size); + that = createBuffer$1(that, size < 0 ? 0 : checked$1(size) | 0); + if (!Buffer$1.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0; + } + } + return that + } + + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + Buffer$1.allocUnsafe = function (size) { + return allocUnsafe$1(null, size) + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + Buffer$1.allocUnsafeSlow = function (size) { + return allocUnsafe$1(null, size) + }; + + function fromString$1 (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; + } + + if (!Buffer$1.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength$1(string, encoding) | 0; + that = createBuffer$1(that, length); + + var actual = that.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual); + } + + return that + } + + function fromArrayLike$1 (that, array) { + var length = array.length < 0 ? 0 : checked$1(array.length) | 0; + that = createBuffer$1(that, length); + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255; + } + return that + } + + function fromArrayBuffer$1 (that, array, byteOffset, length) { + array.byteLength; // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array); + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset); + } else { + array = new Uint8Array(array, byteOffset, length); + } + + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array; + that.__proto__ = Buffer$1.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike$1(that, array); + } + return that + } + + function fromObject$1 (that, obj) { + if (internalIsBuffer$1(obj)) { + var len = checked$1(obj.length) | 0; + that = createBuffer$1(that, len); + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len); + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan$1(obj.length)) { + return createBuffer$1(that, 0) + } + return fromArrayLike$1(that, obj) + } + + if (obj.type === 'Buffer' && isArray$2(obj.data)) { + return fromArrayLike$1(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') + } + + function checked$1 (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength$1()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength$1().toString(16) + ' bytes') + } + return length | 0 + } + Buffer$1.isBuffer = isBuffer$2; + function internalIsBuffer$1 (b) { + return !!(b != null && b._isBuffer) + } + + Buffer$1.compare = function compare (a, b) { + if (!internalIsBuffer$1(a) || !internalIsBuffer$1(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + Buffer$1.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } + }; + + Buffer$1.concat = function concat (list, length) { + if (!isArray$2(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer$1.alloc(0) + } + + var i; + if (length === undefined) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer$1.allocUnsafe(length); + var pos = 0; + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + if (!internalIsBuffer$1(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos); + pos += buf.length; + } + return buffer + }; + + function byteLength$1 (string, encoding) { + if (internalIsBuffer$1(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string; + } + + var len = string.length; + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes$1(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes$1(string).length + default: + if (loweredCase) return utf8ToBytes$1(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer$1.byteLength = byteLength$1; + + function slowToString$1 (encoding, start, end) { + var loweredCase = false; + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0; + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8'; + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice$1(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice$1(this, start, end) + + case 'ascii': + return asciiSlice$1(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice$1(this, start, end) + + case 'base64': + return base64Slice$1(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice$1(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } + } + } + + // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect + // Buffer instances. + Buffer$1.prototype._isBuffer = true; + + function swap$1 (b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; + } + + Buffer$1.prototype.swap16 = function swap16 () { + var len = this.length; + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap$1(this, i, i + 1); + } + return this + }; + + Buffer$1.prototype.swap32 = function swap32 () { + var len = this.length; + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap$1(this, i, i + 3); + swap$1(this, i + 1, i + 2); + } + return this + }; + + Buffer$1.prototype.swap64 = function swap64 () { + var len = this.length; + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap$1(this, i, i + 7); + swap$1(this, i + 1, i + 6); + swap$1(this, i + 2, i + 5); + swap$1(this, i + 3, i + 4); + } + return this + }; + + Buffer$1.prototype.toString = function toString () { + var length = this.length | 0; + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice$1(this, 0, length) + return slowToString$1.apply(this, arguments) + }; + + Buffer$1.prototype.equals = function equals (b) { + if (!internalIsBuffer$1(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer$1.compare(this, b) === 0 + }; + + Buffer$1.prototype.inspect = function inspect () { + var str = ''; + var max = INSPECT_MAX_BYTES$1; + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); + if (this.length > max) str += ' ... '; + } + return '' + }; + + Buffer$1.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!internalIsBuffer$1(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0; + } + if (end === undefined) { + end = target ? target.length : 0; + } + if (thisStart === undefined) { + thisStart = 0; + } + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + + if (this === target) return 0 + + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + function bidirectionalIndexOf$1 (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1); + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer$1.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (internalIsBuffer$1(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf$1(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + if (Buffer$1.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf$1(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') + } + + function arrayIndexOf$1 (arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i; + if (dir) { + var foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + var found = true; + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break + } + } + if (found) return i + } + } + + return -1 + } + + Buffer$1.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 + }; + + Buffer$1.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf$1(this, val, byteOffset, encoding, true) + }; + + Buffer$1.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf$1(this, val, byteOffset, encoding, false) + }; + + function hexWrite$1 (buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + // must be an even number of digits + var strLen = string.length; + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2; + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (isNaN(parsed)) return i + buf[offset + i] = parsed; + } + return i + } + + function utf8Write$1 (buf, string, offset, length) { + return blitBuffer$1(utf8ToBytes$1(string, buf.length - offset), buf, offset, length) + } + + function asciiWrite$1 (buf, string, offset, length) { + return blitBuffer$1(asciiToBytes$1(string), buf, offset, length) + } + + function latin1Write$1 (buf, string, offset, length) { + return asciiWrite$1(buf, string, offset, length) + } + + function base64Write$1 (buf, string, offset, length) { + return blitBuffer$1(base64ToBytes$1(string), buf, offset, length) + } + + function ucs2Write$1 (buf, string, offset, length) { + return blitBuffer$1(utf16leToBytes$1(string, buf.length - offset), buf, offset, length) + } + + Buffer$1.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0; + if (isFinite(length)) { + length = length | 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8'; + + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite$1(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write$1(this, string, offset, length) + + case 'ascii': + return asciiWrite$1(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write$1(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write$1(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write$1(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer$1.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } + }; + + function base64Slice$1 (buf, start, end) { + if (start === 0 && end === buf.length) { + return fromByteArray$1(buf) + } else { + return fromByteArray$1(buf.slice(start, end)) + } + } + + function utf8Slice$1 (buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + + var i = start; + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + break + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } + } + break + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } + } + break + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray$1(res) + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH$1 = 0x1000; + + function decodeCodePointsArray$1 (codePoints) { + var len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH$1) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = ''; + var i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH$1) + ); + } + return res + } + + function asciiSlice$1 (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + return ret + } + + function latin1Slice$1 (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret + } + + function hexSlice$1 (buf, start, end) { + var len = buf.length; + + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + + var out = ''; + for (var i = start; i < end; ++i) { + out += toHex$1(buf[i]); + } + return out + } + + function utf16leSlice$1 (buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res + } + + Buffer$1.prototype.slice = function slice (start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + + var newBuf; + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end); + newBuf.__proto__ = Buffer$1.prototype; + } else { + var sliceLen = end - start; + newBuf = new Buffer$1(sliceLen, undefined); + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start]; + } + } + + return newBuf + }; + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset$1 (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') + } + + Buffer$1.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset$1(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val + }; + + Buffer$1.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + checkOffset$1(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val + }; + + Buffer$1.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 1, this.length); + return this[offset] + }; + + Buffer$1.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8) + }; + + Buffer$1.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1] + }; + + Buffer$1.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) + }; + + Buffer$1.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + }; + + Buffer$1.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset$1(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer$1.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset$1(offset, byteLength, this.length); + + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer$1.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 1, this.length); + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) + }; + + Buffer$1.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + var val = this[offset] | (this[offset + 1] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer$1.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 2, this.length); + var val = this[offset + 1] | (this[offset] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer$1.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + }; + + Buffer$1.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) + }; + + Buffer$1.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + return read$1(this, offset, true, 23, 4) + }; + + Buffer$1.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 4, this.length); + return read$1(this, offset, false, 23, 4) + }; + + Buffer$1.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 8, this.length); + return read$1(this, offset, true, 52, 8) + }; + + Buffer$1.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset$1(offset, 8, this.length); + return read$1(this, offset, false, 52, 8) + }; + + function checkInt$1 (buf, value, offset, ext, max, min) { + if (!internalIsBuffer$1(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') + } + + Buffer$1.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt$1(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt$1(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 1, 0xff, 0); + if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + this[offset] = (value & 0xff); + return offset + 1 + }; + + function objectWriteUInt16$1 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8; + } + } + + Buffer$1.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16$1(this, value, offset, true); + } + return offset + 2 + }; + + Buffer$1.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16$1(this, value, offset, false); + } + return offset + 2 + }; + + function objectWriteUInt32$1 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; + } + } + + Buffer$1.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24); + this[offset + 2] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset] = (value & 0xff); + } else { + objectWriteUInt32$1(this, value, offset, true); + } + return offset + 4 + }; + + Buffer$1.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32$1(this, value, offset, false); + } + return offset + 4 + }; + + Buffer$1.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt$1(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt$1(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer$1.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 1, 0x7f, -0x80); + if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + if (value < 0) value = 0xff + value + 1; + this[offset] = (value & 0xff); + return offset + 1 + }; + + Buffer$1.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16$1(this, value, offset, true); + } + return offset + 2 + }; + + Buffer$1.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16$1(this, value, offset, false); + } + return offset + 2 + }; + + Buffer$1.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + this[offset + 2] = (value >>> 16); + this[offset + 3] = (value >>> 24); + } else { + objectWriteUInt32$1(this, value, offset, true); + } + return offset + 4 + }; + + Buffer$1.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + if (Buffer$1.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32$1(this, value, offset, false); + } + return offset + 4 + }; + + function checkIEEE754$1 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') + } + + function writeFloat$1 (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754$1(buf, value, offset, 4); + } + write$1(buf, value, offset, littleEndian, 23, 4); + return offset + 4 + } + + Buffer$1.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat$1(this, value, offset, true, noAssert) + }; + + Buffer$1.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat$1(this, value, offset, false, noAssert) + }; + + function writeDouble$1 (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754$1(buf, value, offset, 8); + } + write$1(buf, value, offset, littleEndian, 52, 8); + return offset + 8 + } + + Buffer$1.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble$1(this, value, offset, true, noAssert) + }; + + Buffer$1.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble$1(this, value, offset, false, noAssert) + }; + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer$1.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + var i; + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else if (len < 1000 || !Buffer$1.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ); + } + + return len + }; + + // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + Buffer$1.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + if (val.length === 1) { + var code = val.charCodeAt(0); + if (code < 256) { + val = code; + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer$1.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255; + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + + if (!val) val = 0; + + var i; + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = internalIsBuffer$1(val) + ? val + : utf8ToBytes$1(new Buffer$1(val, encoding).toString()); + var len = bytes.length; + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this + }; + + // HELPER FUNCTIONS + // ================ + + var INVALID_BASE64_RE$1 = /[^+\/0-9A-Za-z-_]/g; + + function base64clean$1 (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim$1(str).replace(INVALID_BASE64_RE$1, ''); + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '='; + } + return str + } + + function stringtrim$1 (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') + } + + function toHex$1 (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) + } + + function utf8ToBytes$1 (string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } + + // valid lead + leadSurrogate = codePoint; + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + } + + leadSurrogate = null; + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else { + throw new Error('Invalid code point') + } + } + + return bytes + } + + function asciiToBytes$1 (str) { + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + return byteArray + } + + function utf16leToBytes$1 (str, units) { + var c, hi, lo; + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray + } + + + function base64ToBytes$1 (str) { + return toByteArray$1(base64clean$1(str)) + } + + function blitBuffer$1 (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i]; + } + return i + } + + function isnan$1 (val) { + return val !== val // eslint-disable-line no-self-compare + } + + + // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence + // The _isBuffer check is for Safari 5-7 support, because it's missing + // Object.prototype.constructor. Remove this eventually + function isBuffer$2(obj) { + return obj != null && (!!obj._isBuffer || isFastBuffer$1(obj) || isSlowBuffer$1(obj)) + } + + function isFastBuffer$1 (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) + } + + // For Node v0.10 support. Remove this eventually. + function isSlowBuffer$1 (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer$1(obj.slice(0, 0)) + } + + // shim for using process in browser + // based off https://github.com/defunctzombie/node-process/blob/master/browser.js + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + var cachedSetTimeout = defaultSetTimout; + var cachedClearTimeout = defaultClearTimeout; + if (typeof global$2.setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } + if (typeof global$2.clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } + + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + function nextTick(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + } + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + var title = 'browser'; + var platform = 'browser'; + var browser$3 = true; + var env = {}; + var argv = []; + var version$1 = ''; // empty string to avoid regexp issues + var versions = {}; + var release = {}; + var config = {}; + + function noop() {} + + var on = noop; + var addListener = noop; + var once = noop; + var off = noop; + var removeListener = noop; + var removeAllListeners = noop; + var emit = noop; + + function binding(name) { + throw new Error('process.binding is not supported'); + } + + function cwd () { return '/' } + function chdir (dir) { + throw new Error('process.chdir is not supported'); + }function umask() { return 0; } + + // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + var performance = global$2.performance || {}; + var performanceNow = + performance.now || + performance.mozNow || + performance.msNow || + performance.oNow || + performance.webkitNow || + function(){ return (new Date()).getTime() }; + + // generate timestamp or delta + // see http://nodejs.org/api/process.html#process_process_hrtime + function hrtime(previousTimestamp){ + var clocktime = performanceNow.call(performance)*1e-3; + var seconds = Math.floor(clocktime); + var nanoseconds = Math.floor((clocktime%1)*1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds<0) { + seconds--; + nanoseconds += 1e9; + } + } + return [seconds,nanoseconds] + } + + var startTime = new Date(); + function uptime() { + var currentTime = new Date(); + var dif = currentTime - startTime; + return dif / 1000; + } + + var browser$1$1 = { + nextTick: nextTick, + title: title, + browser: browser$3, + env: env, + argv: argv, + version: version$1, + versions: versions, + on: on, + addListener: addListener, + once: once, + off: off, + removeListener: removeListener, + removeAllListeners: removeAllListeners, + emit: emit, + binding: binding, + cwd: cwd, + chdir: chdir, + umask: umask, + hrtime: hrtime, + platform: platform, + release: release, + config: config, + uptime: uptime + }; + + var inherits$2; + if (typeof Object.create === 'function'){ + inherits$2 = function inherits(ctor, superCtor) { + // implementation from standard node.js 'util' module + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; + } else { + inherits$2 = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; + } + var inherits$3 = inherits$2; + + var formatRegExp = /%[sdj%]/g; + function format$1(f) { + if (!isString$1(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; + } + + // Mark that a method should not be used. + // Returns a modified function which warns once by default. + // If --no-deprecation is set, then it is a no-op. + function deprecate$1(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global$2.process)) { + return function() { + return deprecate$1(fn, msg).apply(this, arguments); + }; + } + + if (browser$1$1.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (browser$1$1.throwDeprecation) { + throw new Error(msg); + } else if (browser$1$1.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; + } + + var debugs = {}; + var debugEnviron; + function debuglog(set) { + if (isUndefined(debugEnviron)) + debugEnviron = browser$1$1.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = 0; + debugs[set] = function() { + var msg = format$1.apply(null, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; + } + + /** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ + /* legacy: obj, showHidden, depth, colors*/ + function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + _extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); + } + + // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics + inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] + }; + + // Don't use 'blue' not visible on cmd.exe + inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' + }; + + + function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } + } + + + function stylizeNoColor(str, styleType) { + return str; + } + + + function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; + } + + + function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString$1(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError$1(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError$1(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray$1(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError$1(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); + } + + + function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString$1(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); + } + + + function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; + } + + + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; + } + + + function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; + } + + + function reduceToSingleString(output, base, braces) { + var length = output.reduce(function(prev, cur) { + if (cur.indexOf('\n') >= 0) ; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + } + + + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray$1(ar) { + return Array.isArray(ar); + } + + function isBoolean(arg) { + return typeof arg === 'boolean'; + } + + function isNull(arg) { + return arg === null; + } + + function isNullOrUndefined(arg) { + return arg == null; + } + + function isNumber(arg) { + return typeof arg === 'number'; + } + + function isString$1(arg) { + return typeof arg === 'string'; + } + + function isSymbol(arg) { + return typeof arg === 'symbol'; + } + + function isUndefined(arg) { + return arg === void 0; + } + + function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; + } + + function isObject(arg) { + return typeof arg === 'object' && arg !== null; + } + + function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; + } + + function isError$1(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); + } + + function isFunction(arg) { + return typeof arg === 'function'; + } + + function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; + } + + function isBuffer$1(maybeBuf) { + return Buffer$1.isBuffer(maybeBuf); + } + + function objectToString(o) { + return Object.prototype.toString.call(o); + } + + + function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); + } + + + var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + + // 26 Feb 16:19:34 + function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); + } + + + // log is just a thin wrapper to console.log that prepends a timestamp + function log() { + console.log('%s - %s', timestamp(), format$1.apply(null, arguments)); + } + + function _extend(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + var _polyfillNode_util = { + inherits: inherits$3, + _extend: _extend, + log: log, + isBuffer: isBuffer$1, + isPrimitive: isPrimitive, + isFunction: isFunction, + isError: isError$1, + isDate: isDate, + isObject: isObject, + isRegExp: isRegExp, + isUndefined: isUndefined, + isSymbol: isSymbol, + isString: isString$1, + isNumber: isNumber, + isNullOrUndefined: isNullOrUndefined, + isNull: isNull, + isBoolean: isBoolean, + isArray: isArray$1, + inspect: inspect, + deprecate: deprecate$1, + format: format$1, + debuglog: debuglog + }; + + var _polyfillNode_util$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + format: format$1, + deprecate: deprecate$1, + debuglog: debuglog, + inspect: inspect, + isArray: isArray$1, + isBoolean: isBoolean, + isNull: isNull, + isNullOrUndefined: isNullOrUndefined, + isNumber: isNumber, + isString: isString$1, + isSymbol: isSymbol, + isUndefined: isUndefined, + isRegExp: isRegExp, + isObject: isObject, + isDate: isDate, + isError: isError$1, + isFunction: isFunction, + isPrimitive: isPrimitive, + isBuffer: isBuffer$1, + log: log, + inherits: inherits$3, + _extend: _extend, + 'default': _polyfillNode_util + }); + + function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function (v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function (v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function (n) { + if (this.length === 0) return Buffer$1.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer$1.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + // Copyright Joyent, Inc. and other Node contributors. + var isBufferEncoding = Buffer$1.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + }; + + + function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } + } + + // StringDecoder provides an interface for efficiently splitting a series of + // buffers into a series of JS strings without breaking apart multi-byte + // characters. CESU-8 is handled as part of the UTF-8 encoding. + // + // @TODO Handling all encodings inside a single object makes it very difficult + // to reason about this code, so it should be split up in the future. + // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code + // points as used by CESU-8. + function StringDecoder(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer$1(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; + } + + // write decodes the given buffer and returns it as JS string that is + // guaranteed to not contain any partial multi-byte characters. Any partial + // character found at the end of the buffer is buffered up, and will be + // returned when calling write again with the remaining bytes. + // + // Note: Converting a Buffer containing an orphan surrogate to a String + // currently works, but converting a String to a Buffer (via `new Buffer`, or + // Buffer#write) will replace incomplete surrogates with the unicode + // replacement character. See https://codereview.chromium.org/121173009/ . + StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; + }; + + // detectIncompleteChar determines if there is an incomplete UTF-8 character at + // the end of the given buffer. If so, it sets this.charLength to the byte + // length that character, and sets this.charReceived to the number of bytes + // that are available for this character. + StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; + }; + + StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; + }; + + function passThroughWrite(buffer) { + return buffer.toString(this.encoding); + } + + function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; + } + + function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; + } + + Readable.ReadableState = ReadableState; + + var debug$2 = debuglog('stream'); + inherits$3(Readable, EventEmitter$2); + + function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) + emitter.on(event, fn); + else if (Array.isArray(emitter._events[event])) + emitter._events[event].unshift(fn); + else + emitter._events[event] = [fn, emitter._events[event]]; + } + } + function listenerCount (emitter, type) { + return emitter.listeners(type).length; + } + function ReadableState(options, stream) { + + options = options || {}; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } + } + function Readable(options) { + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') this._read = options.read; + + EventEmitter$2.call(this); + } + + // Manually shove something into the read() buffer. + // This returns true if the highWaterMark has not been hit yet, + // similar to how Writable.write() returns true if you should + // write() some more. + Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer$1.from(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); + }; + + // Unshift should *always* be something directly out of read() + Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); + }; + + Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; + }; + + function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); + } + + // if it's past the high water mark, we can push in some more. + // Also, if we have no data yet, we can stand some + // more bytes. This is to work around cases where hwm=0, + // such as the repl. Also, if the push() triggered a + // readable event, and the user called read(largeNumber) such that + // needReadable was set, then we ought to push more, so that another + // 'readable' event will be triggered. + function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + } + + // backwards compatibility. + Readable.prototype.setEncoding = function (enc) { + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; + }; + + // Don't raise the hwm > 8MB + var MAX_HWM = 0x800000; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; + } + + // you can override either this method, or the async _read(n) below. + Readable.prototype.read = function (n) { + debug$2('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug$2('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug$2('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug$2('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug$2('reading or ended', doRead); + } else if (doRead) { + debug$2('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; + }; + + function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer$1.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; + } + + function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); + } + + // Don't emit readable right away in sync mode, because this can trigger + // another read() call => stack overflow. This way, it might trigger + // a nextTick recursion warning, but that's not so bad. + function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug$2('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream); + } + } + + function emitReadable_(stream) { + debug$2('emit readable'); + stream.emit('readable'); + flow(stream); + } + + // at this point, the user has presumably seen the 'readable' event, + // and called read() to consume some data. that may have triggered + // in turn another _read(n) call, in which case reading = true if + // it's in progress. + // However, if we're not ended, or reading, and the length < hwm, + // then go ahead and try to read some more preemptively. + function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + nextTick(maybeReadMore_, stream, state); + } + } + + function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug$2('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; + } + + // abstract method. to be overridden in specific implementation classes. + // call cb(er, data) where data is <= n in length. + // for virtual (non-string, non-buffer) streams, "length" is somewhat + // arbitrary, and perhaps not very meaningful. + Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); + }; + + Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug$2('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false); + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug$2('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug$2('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug$2('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug$2('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug$2('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug$2('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (listenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug$2('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug$2('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug$2('pipe resume'); + src.resume(); + } + + return dest; + }; + + function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug$2('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && src.listeners('data').length) { + state.flowing = true; + flow(src); + } + }; + } + + Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; + }; + + // set up data events if they are asked for + // Ensure readable listeners eventually get something + Readable.prototype.on = function (ev, fn) { + var res = EventEmitter$2.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + + function nReadingNextTick(self) { + debug$2('readable nexttick read 0'); + self.read(0); + } + + // pause() and resume() are remnants of the legacy readable stream API + // If the user uses them, then switch into old mode. + Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug$2('resume'); + state.flowing = true; + resume(this, state); + } + return this; + }; + + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + nextTick(resume_, stream, state); + } + } + + function resume_(stream, state) { + if (!state.reading) { + debug$2('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); + } + + Readable.prototype.pause = function () { + debug$2('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug$2('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; + }; + + function flow(stream) { + var state = stream._readableState; + debug$2('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} + } + + // wrap an old-style stream as the async data source. + // This is *not* part of the readable stream interface. + // It is an ugly unfortunate mess of history. + Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function () { + debug$2('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function (chunk) { + debug$2('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug$2('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; + }; + + // exposed for testing purposes only. + Readable._fromList = fromList; + + // Pluck off n bytes from an array of buffers. + // Length is the combined lengths of all the buffers in the list. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; + } + + // Extracts only enough buffered data to satisfy the amount requested. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; + } + + // Copies a specified amount of characters from the list of buffered data + // chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + + // Copies a specified amount of bytes from the list of buffered data chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBuffer(n, list) { + var ret = Buffer$1.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + + function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + nextTick(endReadableNT, state, stream); + } + } + + function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + } + + function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } + } + + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; + } + + // A bit simpler than readable streams. + Writable.WritableState = WritableState; + inherits$3(Writable, EventEmitter$2); + + function nop() {} + + function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; + } + + function WritableState(options, stream) { + Object.defineProperty(this, 'buffer', { + get: deprecate$1(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); + } + + WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; + }; + function Writable(options) { + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + + EventEmitter$2.call(this); + } + + // Otherwise people can pipe Writable streams, which is just wrong. + Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); + }; + + function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + nextTick(cb, er); + } + + // If we get something that is not a buffer, string, null, or undefined, + // and we're not in objectMode, then that's an error. + // Otherwise stream chunks are all considered to be of length=1, and the + // watermarks determine how many objects to keep in the buffer, rather than + // how many bytes or characters. + function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer$1.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + nextTick(cb, er); + valid = false; + } + return valid; + } + + Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer$1.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; + }; + + Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; + }; + + Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } + }; + + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; + }; + + function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer$1.from(chunk, encoding); + } + return chunk; + } + + // if we're already writing something, then just put this + // in the queue, and wait our turn. Otherwise, call _write + // If we return false, then we need a drain event, so set that flag. + function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer$1.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; + } + + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + + function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) nextTick(cb, er);else cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } + + function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + } + + function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + nextTick(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } + } + + function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); + } + + // Must force callback to be called on nextTick, so that we don't + // emit 'drain' before the write() consumer gets the 'false' return + // value, and has a chance to attach a 'drain' listener. + function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } + } + + // if there's something in the buffer waiting, then process it + function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; + } + + Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); + }; + + Writable.prototype._writev = null; + + Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); + }; + + function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; + } + + function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } + } + + function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; + } + + function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; + } + + // It seems a linked list but it is not + // there will be only 2 of these for each stream + function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; + } + + inherits$3(Duplex, Readable); + + var keys = Object.keys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); + } + + // the no-half-open enforcer + function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + nextTick(onEndNT, this); + } + + function onEndNT(self) { + self.end(); + } + + // a transform stream is a readable/writable stream where you do + inherits$3(Transform, Duplex); + + function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; + } + + function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } + } + function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); + } + + Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); + }; + + // This is the part where you do stuff! + // override this function in implementation classes. + // 'chunk' is an input chunk. + // + // Call `push(newChunk)` to pass along transformed output + // to the readable side. You may call 'push' zero or more times. + // + // Call `cb(err)` when you are done with this chunk. If you pass + // an error, then that'll put the hurt on the whole operation. If you + // never call cb(), then you'll never get another chunk. + Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('Not implemented'); + }; + + Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } + }; + + // Doesn't matter what the args are here. + // _transform does all the work. + // That we got here means that the readable side wants more data. + Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } + }; + + function done(stream, er) { + if (er) return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); + } + + inherits$3(PassThrough, Transform); + function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); + } + + PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); + }; + + inherits$3(Stream, EventEmitter$2); + Stream.Readable = Readable; + Stream.Writable = Writable; + Stream.Duplex = Duplex; + Stream.Transform = Transform; + Stream.PassThrough = PassThrough; + + // Backwards-compat with node 0.4.x + Stream.Stream = Stream; + + // old-style streams. Note that the pipe method (the only relevant + // part of this class) is overridden in the Readable class. + + function Stream() { + EventEmitter$2.call(this); + } + + Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EventEmitter$2.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; + }; + + var _polyfillNode_stream = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': Stream, + Readable: Readable, + Writable: Writable, + Duplex: Duplex, + Transform: Transform, + PassThrough: PassThrough, + Stream: Stream + }); + + var require$$0$2 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_stream); + + var require$$0$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_util$1); + + var WritableStream = require$$0$2.Writable; + var inherits$1 = require$$0$1.inherits; + + var browserStdout = BrowserStdout; + + + inherits$1(BrowserStdout, WritableStream); + + function BrowserStdout(opts) { + if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) + + opts = opts || {}; + WritableStream.call(this, opts); + this.label = (opts.label !== undefined) ? opts.label : 'stdout'; + } + + BrowserStdout.prototype._write = function(chunks, encoding, cb) { + var output = chunks.toString ? chunks.toString() : chunks; + if (this.label === false) { + console.log(output); + } else { + console.log(this.label+':', output); + } + nextTick$1(cb); + }; + + /** + * Parse the given `qs`. + * + * @private + * @param {string} qs + * @return {Object} + */ + var parseQuery$1 = function parseQuery(qs) { + return qs + .replace('?', '') + .split('&') + .reduce(function (obj, pair) { + var i = pair.indexOf('='); + var key = pair.slice(0, i); + var val = pair.slice(++i); + + // Due to how the URLSearchParams API treats spaces + obj[key] = decodeURIComponent(val.replace(/\+/g, '%20')); + + return obj; + }, {}); + }; + + /** + * Highlight the given string of `js`. + * + * @private + * @param {string} js + * @return {string} + */ + function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace( + /\bnew[ \t]+(\w+)/gm, + 'new $1' + ) + .replace( + /\b(function|new|throw|return|var|if|else)\b/gm, + '$1' + ); + } + + /** + * Highlight the contents of tag `name`. + * + * @private + * @param {string} name + */ + var highlightTags$1 = function highlightTags(name) { + var code = document.getElementById('mocha').getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } + }; + + var mocha$1 = {exports: {}}; + + var escapeStringRegexp = string => { + if (typeof string !== 'string') { + throw new TypeError('Expected a string'); + } + + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a \unnnn escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return string + .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + .replace(/-/g, '\\x2d'); + }; + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + // resolves . and .. elements in a path array with directory names there + // must be no slashes, empty elements, or device names (c:\) in the array + // (so also no leading and trailing slashes - it does not distinguish + // relative and absolute paths) + function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; + } + + // Split a filename into [root, dir, basename, ext], unix version + // 'root' is just a slash, or nothing. + var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); + }; + + // path.resolve([from ...], to) + // posix version + function resolve() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : '/'; + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + } + // path.normalize(path) + // posix version + function normalize(path) { + var isPathAbsolute = isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isPathAbsolute).join('/'); + + if (!path && !isPathAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isPathAbsolute ? '/' : '') + path; + } + // posix version + function isAbsolute(path) { + return path.charAt(0) === '/'; + } + + // posix version + function join() { + var paths = Array.prototype.slice.call(arguments, 0); + return normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); + } + + + // path.relative(from, to) + // posix version + function relative(from, to) { + from = resolve(from).substr(1); + to = resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); + } + + var sep = '/'; + var delimiter = ':'; + + function dirname(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; + } + + function basename(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; + } + + + function extname(path) { + return splitPath(path)[3]; + } + var _polyfillNode_path = { + extname: extname, + basename: basename, + dirname: dirname, + sep: sep, + delimiter: delimiter, + relative: relative, + join: join, + isAbsolute: isAbsolute, + normalize: normalize, + resolve: resolve + }; + function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; + } + + // String.prototype.substr - negative index don't work in IE8 + var substr = 'ab'.substr(-1) === 'b' ? + function (str, start, len) { return str.substr(start, len) } : + function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } + ; + + var _polyfillNode_path$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + resolve: resolve, + normalize: normalize, + isAbsolute: isAbsolute, + join: join, + relative: relative, + sep: sep, + delimiter: delimiter, + dirname: dirname, + basename: basename, + extname: extname, + 'default': _polyfillNode_path + }); + + var require$$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_path$1); + + var reporters = {}; + + var base$1 = {exports: {}}; + + var lib = {}; + + var base = {}; + + /*istanbul ignore start*/ + + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports["default"] = Diff; + + /*istanbul ignore end*/ + function Diff() {} + + Diff.prototype = { + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + diff: function diff(oldString, newString) { + /*istanbul ignore start*/ + var + /*istanbul ignore end*/ + options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var callback = options.callback; + + if (typeof options === 'function') { + callback = options; + options = {}; + } + + this.options = options; + var self = this; + + function done(value) { + if (callback) { + setTimeout(function () { + callback(undefined, value); + }, 0); + return true; + } else { + return value; + } + } // Allow subclasses to massage the input prior to running + + + oldString = this.castInput(oldString); + newString = this.castInput(newString); + oldString = this.removeEmpty(this.tokenize(oldString)); + newString = this.removeEmpty(this.tokenize(newString)); + var newLen = newString.length, + oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ + newPos: -1, + components: [] + }]; // Seed editLength = 0, i.e. the content starts with the same values + + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{ + value: this.join(newString), + count: newString.length + }]); + } // Main worker method. checks all permutations of a given edit length for acceptance. + + + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath = + /*istanbul ignore start*/ + void 0 + /*istanbul ignore end*/ + ; + + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + + + if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done + + if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { + return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + + + if (callback) { + (function exec() { + setTimeout(function () { + // This should not happen, but we want to be safe. + + /* istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + })(); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + + if (ret) { + return ret; + } + } + } + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + pushComponent: function pushComponent(components, added, removed) { + var last = components[components.length - 1]; + + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = { + count: last.count + 1, + added: added, + removed: removed + }; + } else { + components.push({ + count: 1, + added: added, + removed: removed + }); + } + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + commonCount = 0; + + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({ + count: commonCount + }); + } + + basePath.newPos = newPos; + return oldPos; + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + equals: function equals(left, right) { + if (this.options.comparator) { + return this.options.comparator(left, right); + } else { + return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); + } + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + removeEmpty: function removeEmpty(array) { + var ret = []; + + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + + return ret; + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + castInput: function castInput(value) { + return value; + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + tokenize: function tokenize(value) { + return value.split(''); + }, + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + join: function join(chars) { + return chars.join(''); + } + }; + + function buildValues(diff, components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = value.map(function (value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + component.value = diff.join(value); + } else { + component.value = diff.join(newString.slice(newPos, newPos + component.count)); + } + + newPos += component.count; // Common case + + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); + oldPos += component.count; // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } // Special case handle for when one terminal is ignored (i.e. whitespace). + // For this case we merge the terminal into the prior string and drop the change. + // This is only available for string mode. + + + var lastComponent = components[componentLen - 1]; + + if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { + components[componentLen - 2].value += lastComponent.value; + components.pop(); + } + + return components; + } + + function clonePath(path) { + return { + newPos: path.newPos, + components: path.components.slice(0) + }; + } + + }(base)); + + var character = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(character, "__esModule", { + value: true + }); + character.diffChars = diffChars; + character.characterDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$6 = _interopRequireDefault$7(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$7(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var characterDiff = new + /*istanbul ignore start*/ + _base$6 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + character.characterDiff = characterDiff; + + /*istanbul ignore end*/ + function diffChars(oldStr, newStr, options) { + return characterDiff.diff(oldStr, newStr, options); + } + + var word = {}; + + var params = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(params, "__esModule", { + value: true + }); + params.generateOptions = generateOptions; + + /*istanbul ignore end*/ + function generateOptions(options, defaults) { + if (typeof options === 'function') { + defaults.callback = options; + } else if (options) { + for (var name in options) { + /* istanbul ignore else */ + if (options.hasOwnProperty(name)) { + defaults[name] = options[name]; + } + } + } + + return defaults; + } + + /*istanbul ignore start*/ + + Object.defineProperty(word, "__esModule", { + value: true + }); + word.diffWords = diffWords; + word.diffWordsWithSpace = diffWordsWithSpace; + word.wordDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$5 = _interopRequireDefault$6(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _params$1 = params + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$6(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode + // + // Ranges and exceptions: + // Latin-1 Supplement, 0080–00FF + // - U+00D7 × Multiplication sign + // - U+00F7 ÷ Division sign + // Latin Extended-A, 0100–017F + // Latin Extended-B, 0180–024F + // IPA Extensions, 0250–02AF + // Spacing Modifier Letters, 02B0–02FF + // - U+02C7 ˇ ˇ Caron + // - U+02D8 ˘ ˘ Breve + // - U+02D9 ˙ ˙ Dot Above + // - U+02DA ˚ ˚ Ring Above + // - U+02DB ˛ ˛ Ogonek + // - U+02DC ˜ ˜ Small Tilde + // - U+02DD ˝ ˝ Double Acute Accent + // Latin Extended Additional, 1E00–1EFF + var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; + var reWhitespace = /\S/; + var wordDiff = new + /*istanbul ignore start*/ + _base$5 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + word.wordDiff = wordDiff; + + /*istanbul ignore end*/ + wordDiff.equals = function (left, right) { + if (this.options.ignoreCase) { + left = left.toLowerCase(); + right = right.toLowerCase(); + } + + return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); + }; + + wordDiff.tokenize = function (value) { + // All whitespace symbols except newline group into one token, each newline - in separate token + var tokens = value.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. + + for (var i = 0; i < tokens.length - 1; i++) { + // If we have an empty string in the next field and we have only word chars before and after, merge + if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { + tokens[i] += tokens[i + 2]; + tokens.splice(i + 1, 2); + i--; + } + } + + return tokens; + }; + + function diffWords(oldStr, newStr, options) { + options = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _params$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + generateOptions) + /*istanbul ignore end*/ + (options, { + ignoreWhitespace: true + }); + return wordDiff.diff(oldStr, newStr, options); + } + + function diffWordsWithSpace(oldStr, newStr, options) { + return wordDiff.diff(oldStr, newStr, options); + } + + var line = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(line, "__esModule", { + value: true + }); + line.diffLines = diffLines; + line.diffTrimmedLines = diffTrimmedLines; + line.lineDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$4 = _interopRequireDefault$5(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _params = params + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$5(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var lineDiff = new + /*istanbul ignore start*/ + _base$4 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + line.lineDiff = lineDiff; + + /*istanbul ignore end*/ + lineDiff.tokenize = function (value) { + var retLines = [], + linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line + + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } // Merge the content and line separators into single tokens + + + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2 && !this.options.newlineIsToken) { + retLines[retLines.length - 1] += line; + } else { + if (this.options.ignoreWhitespace) { + line = line.trim(); + } + + retLines.push(line); + } + } + + return retLines; + }; + + function diffLines(oldStr, newStr, callback) { + return lineDiff.diff(oldStr, newStr, callback); + } + + function diffTrimmedLines(oldStr, newStr, callback) { + var options = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _params + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + generateOptions) + /*istanbul ignore end*/ + (callback, { + ignoreWhitespace: true + }); + return lineDiff.diff(oldStr, newStr, options); + } + + var sentence = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(sentence, "__esModule", { + value: true + }); + sentence.diffSentences = diffSentences; + sentence.sentenceDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$3 = _interopRequireDefault$4(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$4(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var sentenceDiff = new + /*istanbul ignore start*/ + _base$3 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + sentence.sentenceDiff = sentenceDiff; + + /*istanbul ignore end*/ + sentenceDiff.tokenize = function (value) { + return value.split(/(\S.+?[.!?])(?=\s+|$)/); + }; + + function diffSentences(oldStr, newStr, callback) { + return sentenceDiff.diff(oldStr, newStr, callback); + } + + var css = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(css, "__esModule", { + value: true + }); + css.diffCss = diffCss; + css.cssDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$2 = _interopRequireDefault$3(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$3(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var cssDiff = new + /*istanbul ignore start*/ + _base$2 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + css.cssDiff = cssDiff; + + /*istanbul ignore end*/ + cssDiff.tokenize = function (value) { + return value.split(/([{}:;,]|\s+)/); + }; + + function diffCss(oldStr, newStr, callback) { + return cssDiff.diff(oldStr, newStr, callback); + } + + var json$1 = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(json$1, "__esModule", { + value: true + }); + json$1.diffJson = diffJson; + json$1.canonicalize = canonicalize; + json$1.jsonDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base$1 = _interopRequireDefault$2(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _line$1 = line + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$2(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + /*istanbul ignore end*/ + var objectPrototypeToString = Object.prototype.toString; + var jsonDiff = new + /*istanbul ignore start*/ + _base$1 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + + /*istanbul ignore start*/ + json$1.jsonDiff = jsonDiff; + + /*istanbul ignore end*/ + jsonDiff.useLongestToken = true; + jsonDiff.tokenize = + /*istanbul ignore start*/ + _line$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + lineDiff + /*istanbul ignore end*/ + .tokenize; + + jsonDiff.castInput = function (value) { + /*istanbul ignore start*/ + var _this$options = + /*istanbul ignore end*/ + this.options, + undefinedReplacement = _this$options.undefinedReplacement, + _this$options$stringi = _this$options.stringifyReplacer, + stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) + /*istanbul ignore start*/ + { + return ( + /*istanbul ignore end*/ + typeof v === 'undefined' ? undefinedReplacement : v + ); + } : _this$options$stringi; + return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); + }; + + jsonDiff.equals = function (left, right) { + return ( + /*istanbul ignore start*/ + _base$1 + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ].prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')) + ); + }; + + function diffJson(oldObj, newObj, options) { + return jsonDiff.diff(oldObj, newObj, options); + } // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. Accepts an optional replacer + + + function canonicalize(obj, stack, replacementStack, replacer, key) { + stack = stack || []; + replacementStack = replacementStack || []; + + if (replacer) { + obj = replacer(key, obj); + } + + var i; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); + } + + stack.pop(); + replacementStack.pop(); + return canonicalizedObj; + } + + if (obj && obj.toJSON) { + obj = obj.toJSON(); + } + + if ( + /*istanbul ignore start*/ + _typeof( + /*istanbul ignore end*/ + obj) === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + + var sortedKeys = [], + _key; + + for (_key in obj) { + /* istanbul ignore else */ + if (obj.hasOwnProperty(_key)) { + sortedKeys.push(_key); + } + } + + sortedKeys.sort(); + + for (i = 0; i < sortedKeys.length; i += 1) { + _key = sortedKeys[i]; + canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); + } + + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + + return canonicalizedObj; + } + + var array$1 = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(array$1, "__esModule", { + value: true + }); + array$1.diffArrays = diffArrays; + array$1.arrayDiff = void 0; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base = _interopRequireDefault$1(base) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault$1(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + var arrayDiff = new + /*istanbul ignore start*/ + _base + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ](); + + /*istanbul ignore start*/ + array$1.arrayDiff = arrayDiff; + + /*istanbul ignore end*/ + arrayDiff.tokenize = function (value) { + return value.slice(); + }; + + arrayDiff.join = arrayDiff.removeEmpty = function (value) { + return value; + }; + + function diffArrays(oldArr, newArr, callback) { + return arrayDiff.diff(oldArr, newArr, callback); + } + + var apply = {}; + + var parse$2 = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(parse$2, "__esModule", { + value: true + }); + parse$2.parsePatch = parsePatch; + + /*istanbul ignore end*/ + function parsePatch(uniDiff) { + /*istanbul ignore start*/ + var + /*istanbul ignore end*/ + options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], + list = [], + i = 0; + + function parseIndex() { + var index = {}; + list.push(index); // Parse diff metadata + + while (i < diffstr.length) { + var line = diffstr[i]; // File header found, end parsing diff metadata + + if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { + break; + } // Diff index + + + var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); + + if (header) { + index.index = header[1]; + } + + i++; + } // Parse file headers if they are defined. Unified diff requires them, but + // there's no technical issues to have an isolated hunk without file header + + + parseFileHeader(index); + parseFileHeader(index); // Parse hunks + + index.hunks = []; + + while (i < diffstr.length) { + var _line = diffstr[i]; + + if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { + break; + } else if (/^@@/.test(_line)) { + index.hunks.push(parseHunk()); + } else if (_line && options.strict) { + // Ignore unexpected content unless in strict mode + throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); + } else { + i++; + } + } + } // Parses the --- and +++ headers, if none are found, no lines + // are consumed. + + + function parseFileHeader(index) { + var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); + + if (fileHeader) { + var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; + var data = fileHeader[2].split('\t', 2); + var fileName = data[0].replace(/\\\\/g, '\\'); + + if (/^".*"$/.test(fileName)) { + fileName = fileName.substr(1, fileName.length - 2); + } + + index[keyPrefix + 'FileName'] = fileName; + index[keyPrefix + 'Header'] = (data[1] || '').trim(); + i++; + } + } // Parses a hunk + // This assumes that we are at the start of a hunk. + + + function parseHunk() { + var chunkHeaderIndex = i, + chunkHeaderLine = diffstr[i++], + chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); + var hunk = { + oldStart: +chunkHeader[1], + oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2], + newStart: +chunkHeader[3], + newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4], + lines: [], + linedelimiters: [] + }; // Unified Diff Format quirk: If the chunk size is 0, + // the first number is one lower than one would expect. + // https://www.artima.com/weblogs/viewpost.jsp?thread=164293 + + if (hunk.oldLines === 0) { + hunk.oldStart += 1; + } + + if (hunk.newLines === 0) { + hunk.newStart += 1; + } + + var addCount = 0, + removeCount = 0; + + for (; i < diffstr.length; i++) { + // Lines starting with '---' could be mistaken for the "remove line" operation + // But they could be the header for the next file. Therefore prune such cases out. + if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { + break; + } + + var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; + + if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { + hunk.lines.push(diffstr[i]); + hunk.linedelimiters.push(delimiters[i] || '\n'); + + if (operation === '+') { + addCount++; + } else if (operation === '-') { + removeCount++; + } else if (operation === ' ') { + addCount++; + removeCount++; + } + } else { + break; + } + } // Handle the empty block count case + + + if (!addCount && hunk.newLines === 1) { + hunk.newLines = 0; + } + + if (!removeCount && hunk.oldLines === 1) { + hunk.oldLines = 0; + } // Perform optional sanity checking + + + if (options.strict) { + if (addCount !== hunk.newLines) { + throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + + if (removeCount !== hunk.oldLines) { + throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + } + + return hunk; + } + + while (i < diffstr.length) { + parseIndex(); + } + + return list; + } + + var distanceIterator = {}; + + /*istanbul ignore start*/ + + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports["default"] = _default; + + /*istanbul ignore end*/ + // Iterator that traverses in the range of [min, max], stepping + // by distance from a given start position. I.e. for [0, 4], with + // start of 2, this will iterate 2, 3, 1, 4, 0. + function + /*istanbul ignore start*/ + _default + /*istanbul ignore end*/ + (start, minLine, maxLine) { + var wantForward = true, + backwardExhausted = false, + forwardExhausted = false, + localOffset = 1; + return function iterator() { + if (wantForward && !forwardExhausted) { + if (backwardExhausted) { + localOffset++; + } else { + wantForward = false; + } // Check if trying to fit beyond text length, and if not, check it fits + // after offset location (or desired location on first iteration) + + + if (start + localOffset <= maxLine) { + return localOffset; + } + + forwardExhausted = true; + } + + if (!backwardExhausted) { + if (!forwardExhausted) { + wantForward = true; + } // Check if trying to fit before text beginning, and if not, check it fits + // before offset location + + + if (minLine <= start - localOffset) { + return -localOffset++; + } + + backwardExhausted = true; + return iterator(); + } // We tried to fit hunk before text beginning and beyond text length, then + // hunk can't fit on the text. Return undefined + + }; + } + + }(distanceIterator)); + + /*istanbul ignore start*/ + + Object.defineProperty(apply, "__esModule", { + value: true + }); + apply.applyPatch = applyPatch; + apply.applyPatches = applyPatches; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _parse$1 = parse$2 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _distanceIterator = _interopRequireDefault(distanceIterator) + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + function applyPatch(source, uniDiff) { + /*istanbul ignore start*/ + var + /*istanbul ignore end*/ + options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (typeof uniDiff === 'string') { + uniDiff = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _parse$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + parsePatch) + /*istanbul ignore end*/ + (uniDiff); + } + + if (Array.isArray(uniDiff)) { + if (uniDiff.length > 1) { + throw new Error('applyPatch only works with a single input.'); + } + + uniDiff = uniDiff[0]; + } // Apply the diff to the input + + + var lines = source.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], + hunks = uniDiff.hunks, + compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) + /*istanbul ignore start*/ + { + return ( + /*istanbul ignore end*/ + line === patchContent + ); + }, + errorCount = 0, + fuzzFactor = options.fuzzFactor || 0, + minLine = 0, + offset = 0, + removeEOFNL, + addEOFNL; + /** + * Checks if the hunk exactly fits on the provided location + */ + + + function hunkFits(hunk, toPos) { + for (var j = 0; j < hunk.lines.length; j++) { + var line = hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line; + + if (operation === ' ' || operation === '-') { + // Context sanity check + if (!compareLine(toPos + 1, lines[toPos], operation, content)) { + errorCount++; + + if (errorCount > fuzzFactor) { + return false; + } + } + + toPos++; + } + } + + return true; + } // Search best fit offsets for each hunk based on the previous ones + + + for (var i = 0; i < hunks.length; i++) { + var hunk = hunks[i], + maxLine = lines.length - hunk.oldLines, + localOffset = 0, + toPos = offset + hunk.oldStart - 1; + var iterator = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _distanceIterator + /*istanbul ignore end*/ + [ + /*istanbul ignore start*/ + "default" + /*istanbul ignore end*/ + ])(toPos, minLine, maxLine); + + for (; localOffset !== undefined; localOffset = iterator()) { + if (hunkFits(hunk, toPos + localOffset)) { + hunk.offset = offset += localOffset; + break; + } + } + + if (localOffset === undefined) { + return false; + } // Set lower text limit to end of the current hunk, so next ones don't try + // to fit over already patched text + + + minLine = hunk.offset + hunk.oldStart + hunk.oldLines; + } // Apply patch hunks + + + var diffOffset = 0; + + for (var _i = 0; _i < hunks.length; _i++) { + var _hunk = hunks[_i], + _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; + + diffOffset += _hunk.newLines - _hunk.oldLines; + + for (var j = 0; j < _hunk.lines.length; j++) { + var line = _hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line, + delimiter = _hunk.linedelimiters[j]; + + if (operation === ' ') { + _toPos++; + } else if (operation === '-') { + lines.splice(_toPos, 1); + delimiters.splice(_toPos, 1); + /* istanbul ignore else */ + } else if (operation === '+') { + lines.splice(_toPos, 0, content); + delimiters.splice(_toPos, 0, delimiter); + _toPos++; + } else if (operation === '\\') { + var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; + + if (previousOperation === '+') { + removeEOFNL = true; + } else if (previousOperation === '-') { + addEOFNL = true; + } + } + } + } // Handle EOFNL insertion/removal + + + if (removeEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + delimiters.pop(); + } + } else if (addEOFNL) { + lines.push(''); + delimiters.push('\n'); + } + + for (var _k = 0; _k < lines.length - 1; _k++) { + lines[_k] = lines[_k] + delimiters[_k]; + } + + return lines.join(''); + } // Wrapper that supports multiple file patches via callbacks. + + + function applyPatches(uniDiff, options) { + if (typeof uniDiff === 'string') { + uniDiff = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _parse$1 + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + parsePatch) + /*istanbul ignore end*/ + (uniDiff); + } + + var currentIndex = 0; + + function processIndex() { + var index = uniDiff[currentIndex++]; + + if (!index) { + return options.complete(); + } + + options.loadFile(index, function (err, data) { + if (err) { + return options.complete(err); + } + + var updatedContent = applyPatch(data, index, options); + options.patched(index, updatedContent, function (err) { + if (err) { + return options.complete(err); + } + + processIndex(); + }); + }); + } + + processIndex(); + } + + var merge$1 = {}; + + var create = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(create, "__esModule", { + value: true + }); + create.structuredPatch = structuredPatch; + create.formatPatch = formatPatch; + create.createTwoFilesPatch = createTwoFilesPatch; + create.createPatch = createPatch; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _line = line + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _toConsumableArray$1(arr) { return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$1(arr) || _nonIterableSpread$1(); } + + function _nonIterableSpread$1() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + + function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } + + function _iterableToArray$1(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + + function _arrayWithoutHoles$1(arr) { if (Array.isArray(arr)) return _arrayLikeToArray$1(arr); } + + function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + /*istanbul ignore end*/ + function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + if (!options) { + options = {}; + } + + if (typeof options.context === 'undefined') { + options.context = 4; + } + + var diff = + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _line + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + diffLines) + /*istanbul ignore end*/ + (oldStr, newStr, options); + diff.push({ + value: '', + lines: [] + }); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function (entry) { + return ' ' + entry; + }); + } + + var hunks = []; + var oldRangeStart = 0, + newRangeStart = 0, + curRange = [], + oldLine = 1, + newLine = 1; + + /*istanbul ignore start*/ + var _loop = function _loop( + /*istanbul ignore end*/ + i) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + /*istanbul ignore start*/ + var _curRange; + + /*istanbul ignore end*/ + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } // Output our changes + + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_curRange = + /*istanbul ignore end*/ + curRange).push.apply( + /*istanbul ignore start*/ + _curRange + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray$1( + /*istanbul ignore end*/ + lines.map(function (entry) { + return (current.added ? '+' : '-') + entry; + }))); // Track the updated file position + + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= options.context * 2 && i < diff.length - 2) { + /*istanbul ignore start*/ + var _curRange2; + + /*istanbul ignore end*/ + // Overlapping + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_curRange2 = + /*istanbul ignore end*/ + curRange).push.apply( + /*istanbul ignore start*/ + _curRange2 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray$1( + /*istanbul ignore end*/ + contextLines(lines))); + } else { + /*istanbul ignore start*/ + var _curRange3; + + /*istanbul ignore end*/ + // end the range and output + var contextSize = Math.min(lines.length, options.context); + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_curRange3 = + /*istanbul ignore end*/ + curRange).push.apply( + /*istanbul ignore start*/ + _curRange3 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray$1( + /*istanbul ignore end*/ + contextLines(lines.slice(0, contextSize)))); + + var hunk = { + oldStart: oldRangeStart, + oldLines: oldLine - oldRangeStart + contextSize, + newStart: newRangeStart, + newLines: newLine - newRangeStart + contextSize, + lines: curRange + }; + + if (i >= diff.length - 2 && lines.length <= options.context) { + // EOF is inside this hunk + var oldEOFNewline = /\n$/.test(oldStr); + var newEOFNewline = /\n$/.test(newStr); + var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines; + + if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) { + // special case: old has no eol and no trailing context; no-nl can end up before adds + // however, if the old file is empty, do not output the no-nl line + curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); + } + + if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) { + curRange.push('\\ No newline at end of file'); + } + } + + hunks.push(hunk); + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + + oldLine += lines.length; + newLine += lines.length; + } + }; + + for (var i = 0; i < diff.length; i++) { + /*istanbul ignore start*/ + _loop( + /*istanbul ignore end*/ + i); + } + + return { + oldFileName: oldFileName, + newFileName: newFileName, + oldHeader: oldHeader, + newHeader: newHeader, + hunks: hunks + }; + } + + function formatPatch(diff) { + var ret = []; + + if (diff.oldFileName == diff.newFileName) { + ret.push('Index: ' + diff.oldFileName); + } + + ret.push('==================================================================='); + ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); + ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); + + for (var i = 0; i < diff.hunks.length; i++) { + var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0, + // the first number is one lower than one would expect. + // https://www.artima.com/weblogs/viewpost.jsp?thread=164293 + + if (hunk.oldLines === 0) { + hunk.oldStart -= 1; + } + + if (hunk.newLines === 0) { + hunk.newStart -= 1; + } + + ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); + ret.push.apply(ret, hunk.lines); + } + + return ret.join('\n') + '\n'; + } + + function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options)); + } + + function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { + return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); + } + + var array = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(array, "__esModule", { + value: true + }); + array.arrayEqual = arrayEqual; + array.arrayStartsWith = arrayStartsWith; + + /*istanbul ignore end*/ + function arrayEqual(a, b) { + if (a.length !== b.length) { + return false; + } + + return arrayStartsWith(a, b); + } + + function arrayStartsWith(array, start) { + if (start.length > array.length) { + return false; + } + + for (var i = 0; i < start.length; i++) { + if (start[i] !== array[i]) { + return false; + } + } + + return true; + } + + /*istanbul ignore start*/ + + Object.defineProperty(merge$1, "__esModule", { + value: true + }); + merge$1.calcLineCount = calcLineCount; + merge$1.merge = merge; + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _create = create + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _parse = parse$2 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _array = array + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + + function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + + function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + + function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + + function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + + function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + /*istanbul ignore end*/ + function calcLineCount(hunk) { + /*istanbul ignore start*/ + var _calcOldNewLineCount = + /*istanbul ignore end*/ + calcOldNewLineCount(hunk.lines), + oldLines = _calcOldNewLineCount.oldLines, + newLines = _calcOldNewLineCount.newLines; + + if (oldLines !== undefined) { + hunk.oldLines = oldLines; + } else { + delete hunk.oldLines; + } + + if (newLines !== undefined) { + hunk.newLines = newLines; + } else { + delete hunk.newLines; + } + } + + function merge(mine, theirs, base) { + mine = loadPatch(mine, base); + theirs = loadPatch(theirs, base); + var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning. + // Leaving sanity checks on this to the API consumer that may know more about the + // meaning in their own context. + + if (mine.index || theirs.index) { + ret.index = mine.index || theirs.index; + } + + if (mine.newFileName || theirs.newFileName) { + if (!fileNameChanged(mine)) { + // No header or no change in ours, use theirs (and ours if theirs does not exist) + ret.oldFileName = theirs.oldFileName || mine.oldFileName; + ret.newFileName = theirs.newFileName || mine.newFileName; + ret.oldHeader = theirs.oldHeader || mine.oldHeader; + ret.newHeader = theirs.newHeader || mine.newHeader; + } else if (!fileNameChanged(theirs)) { + // No header or no change in theirs, use ours + ret.oldFileName = mine.oldFileName; + ret.newFileName = mine.newFileName; + ret.oldHeader = mine.oldHeader; + ret.newHeader = mine.newHeader; + } else { + // Both changed... figure it out + ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); + ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); + ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); + ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); + } + } + + ret.hunks = []; + var mineIndex = 0, + theirsIndex = 0, + mineOffset = 0, + theirsOffset = 0; + + while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { + var mineCurrent = mine.hunks[mineIndex] || { + oldStart: Infinity + }, + theirsCurrent = theirs.hunks[theirsIndex] || { + oldStart: Infinity + }; + + if (hunkBefore(mineCurrent, theirsCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); + mineIndex++; + theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; + } else if (hunkBefore(theirsCurrent, mineCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); + theirsIndex++; + mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; + } else { + // Overlap, merge as best we can + var mergedHunk = { + oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), + oldLines: 0, + newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), + newLines: 0, + lines: [] + }; + mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); + theirsIndex++; + mineIndex++; + ret.hunks.push(mergedHunk); + } + } + + return ret; + } + + function loadPatch(param, base) { + if (typeof param === 'string') { + if (/^@@/m.test(param) || /^Index:/m.test(param)) { + return ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _parse + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + parsePatch) + /*istanbul ignore end*/ + (param)[0] + ); + } + + if (!base) { + throw new Error('Must provide a base reference or pass in a patch'); + } + + return ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _create + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + structuredPatch) + /*istanbul ignore end*/ + (undefined, undefined, base, param) + ); + } + + return param; + } + + function fileNameChanged(patch) { + return patch.newFileName && patch.newFileName !== patch.oldFileName; + } + + function selectField(index, mine, theirs) { + if (mine === theirs) { + return mine; + } else { + index.conflict = true; + return { + mine: mine, + theirs: theirs + }; + } + } + + function hunkBefore(test, check) { + return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; + } + + function cloneHunk(hunk, offset) { + return { + oldStart: hunk.oldStart, + oldLines: hunk.oldLines, + newStart: hunk.newStart + offset, + newLines: hunk.newLines, + lines: hunk.lines + }; + } + + function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { + // This will generally result in a conflicted hunk, but there are cases where the context + // is the only overlap where we can successfully merge the content here. + var mine = { + offset: mineOffset, + lines: mineLines, + index: 0 + }, + their = { + offset: theirOffset, + lines: theirLines, + index: 0 + }; // Handle any leading content + + insertLeading(hunk, mine, their); + insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each. + + while (mine.index < mine.lines.length && their.index < their.lines.length) { + var mineCurrent = mine.lines[mine.index], + theirCurrent = their.lines[their.index]; + + if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { + // Both modified ... + mutualChange(hunk, mine, their); + } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { + /*istanbul ignore start*/ + var _hunk$lines; + + /*istanbul ignore end*/ + // Mine inserted + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + collectChange(mine))); + } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { + /*istanbul ignore start*/ + var _hunk$lines2; + + /*istanbul ignore end*/ + // Theirs inserted + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines2 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines2 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + collectChange(their))); + } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { + // Mine removed or edited + removal(hunk, mine, their); + } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { + // Their removed or edited + removal(hunk, their, mine, true); + } else if (mineCurrent === theirCurrent) { + // Context identity + hunk.lines.push(mineCurrent); + mine.index++; + their.index++; + } else { + // Context mismatch + conflict(hunk, collectChange(mine), collectChange(their)); + } + } // Now push anything that may be remaining + + + insertTrailing(hunk, mine); + insertTrailing(hunk, their); + calcLineCount(hunk); + } + + function mutualChange(hunk, mine, their) { + var myChanges = collectChange(mine), + theirChanges = collectChange(their); + + if (allRemoves(myChanges) && allRemoves(theirChanges)) { + // Special case for remove changes that are supersets of one another + if ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _array + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + arrayStartsWith) + /*istanbul ignore end*/ + (myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { + /*istanbul ignore start*/ + var _hunk$lines3; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines3 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines3 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + myChanges)); + + return; + } else if ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _array + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + arrayStartsWith) + /*istanbul ignore end*/ + (theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { + /*istanbul ignore start*/ + var _hunk$lines4; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines4 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines4 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + theirChanges)); + + return; + } + } else if ( + /*istanbul ignore start*/ + (/*istanbul ignore end*/ + + /*istanbul ignore start*/ + 0, _array + /*istanbul ignore end*/ + . + /*istanbul ignore start*/ + arrayEqual) + /*istanbul ignore end*/ + (myChanges, theirChanges)) { + /*istanbul ignore start*/ + var _hunk$lines5; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines5 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines5 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + myChanges)); + + return; + } + + conflict(hunk, myChanges, theirChanges); + } + + function removal(hunk, mine, their, swap) { + var myChanges = collectChange(mine), + theirChanges = collectContext(their, myChanges); + + if (theirChanges.merged) { + /*istanbul ignore start*/ + var _hunk$lines6; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + + /*istanbul ignore end*/ + + /*istanbul ignore start*/ + (_hunk$lines6 = + /*istanbul ignore end*/ + hunk.lines).push.apply( + /*istanbul ignore start*/ + _hunk$lines6 + /*istanbul ignore end*/ + , + /*istanbul ignore start*/ + _toConsumableArray( + /*istanbul ignore end*/ + theirChanges.merged)); + } else { + conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); + } + } + + function conflict(hunk, mine, their) { + hunk.conflict = true; + hunk.lines.push({ + conflict: true, + mine: mine, + theirs: their + }); + } + + function insertLeading(hunk, insert, their) { + while (insert.offset < their.offset && insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + insert.offset++; + } + } + + function insertTrailing(hunk, insert) { + while (insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + } + } + + function collectChange(state) { + var ret = [], + operation = state.lines[state.index][0]; + + while (state.index < state.lines.length) { + var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. + + if (operation === '-' && line[0] === '+') { + operation = '+'; + } + + if (operation === line[0]) { + ret.push(line); + state.index++; + } else { + break; + } + } + + return ret; + } + + function collectContext(state, matchChanges) { + var changes = [], + merged = [], + matchIndex = 0, + contextChanges = false, + conflicted = false; + + while (matchIndex < matchChanges.length && state.index < state.lines.length) { + var change = state.lines[state.index], + match = matchChanges[matchIndex]; // Once we've hit our add, then we are done + + if (match[0] === '+') { + break; + } + + contextChanges = contextChanges || change[0] !== ' '; + merged.push(match); + matchIndex++; // Consume any additions in the other block as a conflict to attempt + // to pull in the remaining context after this + + if (change[0] === '+') { + conflicted = true; + + while (change[0] === '+') { + changes.push(change); + change = state.lines[++state.index]; + } + } + + if (match.substr(1) === change.substr(1)) { + changes.push(change); + state.index++; + } else { + conflicted = true; + } + } + + if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { + conflicted = true; + } + + if (conflicted) { + return changes; + } + + while (matchIndex < matchChanges.length) { + merged.push(matchChanges[matchIndex++]); + } + + return { + merged: merged, + changes: changes + }; + } + + function allRemoves(changes) { + return changes.reduce(function (prev, change) { + return prev && change[0] === '-'; + }, true); + } + + function skipRemoveSuperset(state, removeChanges, delta) { + for (var i = 0; i < delta; i++) { + var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); + + if (state.lines[state.index + i] !== ' ' + changeContent) { + return false; + } + } + + state.index += delta; + return true; + } + + function calcOldNewLineCount(lines) { + var oldLines = 0; + var newLines = 0; + lines.forEach(function (line) { + if (typeof line !== 'string') { + var myCount = calcOldNewLineCount(line.mine); + var theirCount = calcOldNewLineCount(line.theirs); + + if (oldLines !== undefined) { + if (myCount.oldLines === theirCount.oldLines) { + oldLines += myCount.oldLines; + } else { + oldLines = undefined; + } + } + + if (newLines !== undefined) { + if (myCount.newLines === theirCount.newLines) { + newLines += myCount.newLines; + } else { + newLines = undefined; + } + } + } else { + if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { + newLines++; + } + + if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { + oldLines++; + } + } + }); + return { + oldLines: oldLines, + newLines: newLines + }; + } + + var dmp = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(dmp, "__esModule", { + value: true + }); + dmp.convertChangesToDMP = convertChangesToDMP; + + /*istanbul ignore end*/ + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + function convertChangesToDMP(changes) { + var ret = [], + change, + operation; + + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + + ret.push([operation, change.value]); + } + + return ret; + } + + var xml = {}; + + /*istanbul ignore start*/ + + Object.defineProperty(xml, "__esModule", { + value: true + }); + xml.convertChangesToXML = convertChangesToXML; + + /*istanbul ignore end*/ + function convertChangesToXML(changes) { + var ret = []; + + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + + return ret.join(''); + } + + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + return n; + } + + /*istanbul ignore start*/ + + (function (exports) { + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "Diff", { + enumerable: true, + get: function get() { + return _base["default"]; + } + }); + Object.defineProperty(exports, "diffChars", { + enumerable: true, + get: function get() { + return _character.diffChars; + } + }); + Object.defineProperty(exports, "diffWords", { + enumerable: true, + get: function get() { + return _word.diffWords; + } + }); + Object.defineProperty(exports, "diffWordsWithSpace", { + enumerable: true, + get: function get() { + return _word.diffWordsWithSpace; + } + }); + Object.defineProperty(exports, "diffLines", { + enumerable: true, + get: function get() { + return _line.diffLines; + } + }); + Object.defineProperty(exports, "diffTrimmedLines", { + enumerable: true, + get: function get() { + return _line.diffTrimmedLines; + } + }); + Object.defineProperty(exports, "diffSentences", { + enumerable: true, + get: function get() { + return _sentence.diffSentences; + } + }); + Object.defineProperty(exports, "diffCss", { + enumerable: true, + get: function get() { + return _css.diffCss; + } + }); + Object.defineProperty(exports, "diffJson", { + enumerable: true, + get: function get() { + return _json.diffJson; + } + }); + Object.defineProperty(exports, "canonicalize", { + enumerable: true, + get: function get() { + return _json.canonicalize; + } + }); + Object.defineProperty(exports, "diffArrays", { + enumerable: true, + get: function get() { + return _array.diffArrays; + } + }); + Object.defineProperty(exports, "applyPatch", { + enumerable: true, + get: function get() { + return _apply.applyPatch; + } + }); + Object.defineProperty(exports, "applyPatches", { + enumerable: true, + get: function get() { + return _apply.applyPatches; + } + }); + Object.defineProperty(exports, "parsePatch", { + enumerable: true, + get: function get() { + return _parse.parsePatch; + } + }); + Object.defineProperty(exports, "merge", { + enumerable: true, + get: function get() { + return _merge.merge; + } + }); + Object.defineProperty(exports, "structuredPatch", { + enumerable: true, + get: function get() { + return _create.structuredPatch; + } + }); + Object.defineProperty(exports, "createTwoFilesPatch", { + enumerable: true, + get: function get() { + return _create.createTwoFilesPatch; + } + }); + Object.defineProperty(exports, "createPatch", { + enumerable: true, + get: function get() { + return _create.createPatch; + } + }); + Object.defineProperty(exports, "convertChangesToDMP", { + enumerable: true, + get: function get() { + return _dmp.convertChangesToDMP; + } + }); + Object.defineProperty(exports, "convertChangesToXML", { + enumerable: true, + get: function get() { + return _xml.convertChangesToXML; + } + }); + + /*istanbul ignore end*/ + var + /*istanbul ignore start*/ + _base = _interopRequireDefault(base) + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _character = character + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _word = word + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _line = line + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _sentence = sentence + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _css = css + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _json = json$1 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _array = array$1 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _apply = apply + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _parse = parse$2 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _merge = merge$1 + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _create = create + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _dmp = dmp + /*istanbul ignore end*/ + ; + + var + /*istanbul ignore start*/ + _xml = xml + /*istanbul ignore end*/ + ; + + /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + + /*istanbul ignore end*/ + + }(lib)); + + /** + * Helpers. + */ + + var s$1 = 1000; + var m$1 = s$1 * 60; + var h$1 = m$1 * 60; + var d$1 = h$1 * 24; + var w$1 = d$1 * 7; + var y$1 = d$1 * 365.25; + + /** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + + var ms$1 = function (val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse$1(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong$1(val) : fmtShort$1(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); + }; + + /** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + + function parse$1(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y$1; + case 'weeks': + case 'week': + case 'w': + return n * w$1; + case 'days': + case 'day': + case 'd': + return n * d$1; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h$1; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m$1; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s$1; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } + } + + /** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtShort$1(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d$1) { + return Math.round(ms / d$1) + 'd'; + } + if (msAbs >= h$1) { + return Math.round(ms / h$1) + 'h'; + } + if (msAbs >= m$1) { + return Math.round(ms / m$1) + 'm'; + } + if (msAbs >= s$1) { + return Math.round(ms / s$1) + 's'; + } + return ms + 'ms'; + } + + /** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtLong$1(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d$1) { + return plural$1(ms, msAbs, d$1, 'day'); + } + if (msAbs >= h$1) { + return plural$1(ms, msAbs, h$1, 'hour'); + } + if (msAbs >= m$1) { + return plural$1(ms, msAbs, m$1, 'minute'); + } + if (msAbs >= s$1) { + return plural$1(ms, msAbs, s$1, 'second'); + } + return ms + ' ms'; + } + + /** + * Pluralization helper. + */ + + function plural$1(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); + } + + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; + var inited = false; + function init () { + inited = true; + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + + revLookup['-'.charCodeAt(0)] = 62; + revLookup['_'.charCodeAt(0)] = 63; + } + + function toByteArray (b64) { + if (!inited) { + init(); + } + var i, j, l, tmp, placeHolders, arr; + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders); + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len; + + var L = 0; + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; + arr[L++] = (tmp >> 16) & 0xFF; + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[L++] = tmp & 0xFF; + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + return arr + } + + function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] + } + + function encodeChunk (uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); + output.push(tripletToBase64(tmp)); + } + return output.join('') + } + + function fromByteArray (uint8) { + if (!inited) { + init(); + } + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var output = ''; + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + output += lookup[tmp >> 2]; + output += lookup[(tmp << 4) & 0x3F]; + output += '=='; + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); + output += lookup[tmp >> 10]; + output += lookup[(tmp >> 4) & 0x3F]; + output += lookup[(tmp << 2) & 0x3F]; + output += '='; + } + + parts.push(output); + + return parts.join('') + } + + function read (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) + } + + function write (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; + } + + var toString$1 = {}.toString; + + var isArray = Array.isArray || function (arr) { + return toString$1.call(arr) == '[object Array]'; + }; + + var INSPECT_MAX_BYTES = 50; + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ + Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined + ? global$1.TYPED_ARRAY_SUPPORT + : true; + + function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff + } + + function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length); + that.__proto__ = Buffer.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length); + } + that.length = length; + } + + return that + } + + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } + + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe(this, arg) + } + return from(this, arg, encodingOrOffset, length) + } + + Buffer.poolSize = 8192; // not used by this implementation + + // TODO: Legacy, not needed anymore. Remove in next major version. + Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype; + return arr + }; + + function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } + + return fromObject(that, value) + } + + /** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) + }; + + if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype; + Buffer.__proto__ = Uint8Array; + } + + function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } + } + + function alloc (that, size, fill, encoding) { + assertSize(size); + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) + } + + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) + }; + + function allocUnsafe (that, size) { + assertSize(size); + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0; + } + } + return that + } + + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) + }; + + function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength(string, encoding) | 0; + that = createBuffer(that, length); + + var actual = that.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual); + } + + return that + } + + function fromArrayLike (that, array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0; + that = createBuffer(that, length); + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255; + } + return that + } + + function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength; // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array); + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset); + } else { + array = new Uint8Array(array, byteOffset, length); + } + + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array; + that.__proto__ = Buffer.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike(that, array); + } + return that + } + + function fromObject (that, obj) { + if (internalIsBuffer(obj)) { + var len = checked(obj.length) | 0; + that = createBuffer(that, len); + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len); + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } + + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') + } + + function checked (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 + } + Buffer.isBuffer = isBuffer; + function internalIsBuffer (b) { + return !!(b != null && b._isBuffer) + } + + Buffer.compare = function compare (a, b) { + if (!internalIsBuffer(a) || !internalIsBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } + }; + + Buffer.concat = function concat (list, length) { + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i; + if (length === undefined) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer.allocUnsafe(length); + var pos = 0; + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + if (!internalIsBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos); + pos += buf.length; + } + return buffer + }; + + function byteLength (string, encoding) { + if (internalIsBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string; + } + + var len = string.length; + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer.byteLength = byteLength; + + function slowToString (encoding, start, end) { + var loweredCase = false; + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0; + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8'; + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } + } + } + + // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect + // Buffer instances. + Buffer.prototype._isBuffer = true; + + function swap (b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; + } + + Buffer.prototype.swap16 = function swap16 () { + var len = this.length; + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this + }; + + Buffer.prototype.swap32 = function swap32 () { + var len = this.length; + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this + }; + + Buffer.prototype.swap64 = function swap64 () { + var len = this.length; + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this + }; + + Buffer.prototype.toString = function toString () { + var length = this.length | 0; + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) + }; + + Buffer.prototype.equals = function equals (b) { + if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 + }; + + Buffer.prototype.inspect = function inspect () { + var str = ''; + var max = INSPECT_MAX_BYTES; + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); + if (this.length > max) str += ' ... '; + } + return '' + }; + + Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!internalIsBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0; + } + if (end === undefined) { + end = target ? target.length : 0; + } + if (thisStart === undefined) { + thisStart = 0; + } + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + + if (this === target) return 0 + + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1); + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (internalIsBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') + } + + function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i; + if (dir) { + var foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + var found = true; + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break + } + } + if (found) return i + } + } + + return -1 + } + + Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 + }; + + Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) + }; + + Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) + }; + + function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + // must be an even number of digits + var strLen = string.length; + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2; + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (isNaN(parsed)) return i + buf[offset + i] = parsed; + } + return i + } + + function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) + } + + function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) + } + + function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) + } + + function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) + } + + function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) + } + + Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0; + if (isFinite(length)) { + length = length | 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8'; + + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } + }; + + function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return fromByteArray(buf) + } else { + return fromByteArray(buf.slice(start, end)) + } + } + + function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + + var i = start; + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + break + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } + } + break + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } + } + break + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray(res) + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH = 0x1000; + + function decodeCodePointsArray (codePoints) { + var len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = ''; + var i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ); + } + return res + } + + function asciiSlice (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + return ret + } + + function latin1Slice (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret + } + + function hexSlice (buf, start, end) { + var len = buf.length; + + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + + var out = ''; + for (var i = start; i < end; ++i) { + out += toHex(buf[i]); + } + return out + } + + function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res + } + + Buffer.prototype.slice = function slice (start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + + var newBuf; + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end); + newBuf.__proto__ = Buffer.prototype; + } else { + var sliceLen = end - start; + newBuf = new Buffer(sliceLen, undefined); + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start]; + } + } + + return newBuf + }; + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') + } + + Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val + }; + + Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + checkOffset(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val + }; + + Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset] + }; + + Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8) + }; + + Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1] + }; + + Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) + }; + + Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + }; + + Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) + }; + + Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset] | (this[offset + 1] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset + 1] | (this[offset] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + }; + + Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) + }; + + Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + return read(this, offset, true, 23, 4) + }; + + Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + return read(this, offset, false, 23, 4) + }; + + Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length); + return read(this, offset, true, 52, 8) + }; + + Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length); + return read(this, offset, false, 52, 8) + }; + + function checkInt (buf, value, offset, ext, max, min) { + if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') + } + + Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + this[offset] = (value & 0xff); + return offset + 1 + }; + + function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8; + } + } + + Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16(this, value, offset, true); + } + return offset + 2 + }; + + Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16(this, value, offset, false); + } + return offset + 2 + }; + + function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; + } + } + + Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24); + this[offset + 2] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, true); + } + return offset + 4 + }; + + Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, false); + } + return offset + 4 + }; + + Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + if (value < 0) value = 0xff + value + 1; + this[offset] = (value & 0xff); + return offset + 1 + }; + + Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16(this, value, offset, true); + } + return offset + 2 + }; + + Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16(this, value, offset, false); + } + return offset + 2 + }; + + Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + this[offset + 2] = (value >>> 16); + this[offset + 3] = (value >>> 24); + } else { + objectWriteUInt32(this, value, offset, true); + } + return offset + 4 + }; + + Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, false); + } + return offset + 4 + }; + + function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') + } + + function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4); + } + write(buf, value, offset, littleEndian, 23, 4); + return offset + 4 + } + + Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) + }; + + Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) + }; + + function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8); + } + write(buf, value, offset, littleEndian, 52, 8); + return offset + 8 + } + + Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) + }; + + Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) + }; + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + var i; + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ); + } + + return len + }; + + // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + if (val.length === 1) { + var code = val.charCodeAt(0); + if (code < 256) { + val = code; + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255; + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + + if (!val) val = 0; + + var i; + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = internalIsBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()); + var len = bytes.length; + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this + }; + + // HELPER FUNCTIONS + // ================ + + var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; + + function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, ''); + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '='; + } + return str + } + + function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') + } + + function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) + } + + function utf8ToBytes (string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } + + // valid lead + leadSurrogate = codePoint; + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + } + + leadSurrogate = null; + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else { + throw new Error('Invalid code point') + } + } + + return bytes + } + + function asciiToBytes (str) { + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + return byteArray + } + + function utf16leToBytes (str, units) { + var c, hi, lo; + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray + } + + + function base64ToBytes (str) { + return toByteArray(base64clean(str)) + } + + function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i]; + } + return i + } + + function isnan (val) { + return val !== val // eslint-disable-line no-self-compare + } + + + // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence + // The _isBuffer check is for Safari 5-7 support, because it's missing + // Object.prototype.constructor. Remove this eventually + function isBuffer(obj) { + return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) + } + + function isFastBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) + } + + // For Node v0.10 support. Remove this eventually. + function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) + } + + var browser$2 = true; + + var utils$3 = {}; + + let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'; + let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = ''; + let i = size; + while (i--) { + id += alphabet[(Math.random() * alphabet.length) | 0]; + } + return id + } + }; + let nanoid = (size = 21) => { + let id = ''; + let i = size; + while (i--) { + id += urlAlphabet[(Math.random() * 64) | 0]; + } + return id + }; + var nonSecure = { nanoid, customAlphabet }; + + var he = {exports: {}}; + + /*! https://mths.be/he v1.2.0 by @mathias | MIT license */ + + (function (module, exports) { + (function(root) { + + // Detect free variables `exports`. + var freeExports = exports; + + // Detect free variable `module`. + var freeModule = module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, + // and use it as `root`. + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + // All astral symbols. + var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + // All ASCII symbols (not just printable ASCII) except those listed in the + // first column of the overrides table. + // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides + var regexAsciiWhitelist = /[\x01-\x7F]/g; + // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or + // code points listed in the first column of the overrides table on + // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides. + var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g; + + var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g; + var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'}; + + var regexEscape = /["&'<>`]/g; + var escapeMap = { + '"': '"', + '&': '&', + '\'': ''', + '<': '<', + // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the + // following is not strictly necessary unless it’s part of a tag or an + // unquoted attribute value. We’re only escaping it to support those + // situations, and for XML support. + '>': '>', + // In Internet Explorer ≤ 8, the backtick character can be used + // to break out of (un)quoted attribute values or HTML comments. + // See http://html5sec.org/#102, http://html5sec.org/#108, and + // http://html5sec.org/#133. + '`': '`' + }; + + var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/; + var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; + var regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g; + var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'}; + var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'}; + var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'}; + var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]; + + /*--------------------------------------------------------------------------*/ + + var stringFromCharCode = String.fromCharCode; + + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + var has = function(object, propertyName) { + return hasOwnProperty.call(object, propertyName); + }; + + var contains = function(array, value) { + var index = -1; + var length = array.length; + while (++index < length) { + if (array[index] == value) { + return true; + } + } + return false; + }; + + var merge = function(options, defaults) { + if (!options) { + return defaults; + } + var result = {}; + var key; + for (key in defaults) { + // A `hasOwnProperty` check is not needed here, since only recognized + // option names are used anyway. Any others are ignored. + result[key] = has(options, key) ? options[key] : defaults[key]; + } + return result; + }; + + // Modified version of `ucs2encode`; see https://mths.be/punycode. + var codePointToSymbol = function(codePoint, strict) { + var output = ''; + if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) { + // See issue #4: + // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is + // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD + // REPLACEMENT CHARACTER.” + if (strict) { + parseError('character reference outside the permissible Unicode range'); + } + return '\uFFFD'; + } + if (has(decodeMapNumeric, codePoint)) { + if (strict) { + parseError('disallowed character reference'); + } + return decodeMapNumeric[codePoint]; + } + if (strict && contains(invalidReferenceCodePoints, codePoint)) { + parseError('disallowed character reference'); + } + if (codePoint > 0xFFFF) { + codePoint -= 0x10000; + output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + output += stringFromCharCode(codePoint); + return output; + }; + + var hexEscape = function(codePoint) { + return '&#x' + codePoint.toString(16).toUpperCase() + ';'; + }; + + var decEscape = function(codePoint) { + return '&#' + codePoint + ';'; + }; + + var parseError = function(message) { + throw Error('Parse error: ' + message); + }; + + /*--------------------------------------------------------------------------*/ + + var encode = function(string, options) { + options = merge(options, encode.options); + var strict = options.strict; + if (strict && regexInvalidRawCodePoint.test(string)) { + parseError('forbidden code point'); + } + var encodeEverything = options.encodeEverything; + var useNamedReferences = options.useNamedReferences; + var allowUnsafeSymbols = options.allowUnsafeSymbols; + var escapeCodePoint = options.decimal ? decEscape : hexEscape; + + var escapeBmpSymbol = function(symbol) { + return escapeCodePoint(symbol.charCodeAt(0)); + }; + + if (encodeEverything) { + // Encode ASCII symbols. + string = string.replace(regexAsciiWhitelist, function(symbol) { + // Use named references if requested & possible. + if (useNamedReferences && has(encodeMap, symbol)) { + return '&' + encodeMap[symbol] + ';'; + } + return escapeBmpSymbol(symbol); + }); + // Shorten a few escapes that represent two symbols, of which at least one + // is within the ASCII range. + if (useNamedReferences) { + string = string + .replace(/>\u20D2/g, '>⃒') + .replace(/<\u20D2/g, '<⃒') + .replace(/fj/g, 'fj'); + } + // Encode non-ASCII symbols. + if (useNamedReferences) { + // Encode non-ASCII symbols that can be replaced with a named reference. + string = string.replace(regexEncodeNonAscii, function(string) { + // Note: there is no need to check `has(encodeMap, string)` here. + return '&' + encodeMap[string] + ';'; + }); + } + // Note: any remaining non-ASCII symbols are handled outside of the `if`. + } else if (useNamedReferences) { + // Apply named character references. + // Encode `<>"'&` using named character references. + if (!allowUnsafeSymbols) { + string = string.replace(regexEscape, function(string) { + return '&' + encodeMap[string] + ';'; // no need to check `has()` here + }); + } + // Shorten escapes that represent two symbols, of which at least one is + // `<>"'&`. + string = string + .replace(/>\u20D2/g, '>⃒') + .replace(/<\u20D2/g, '<⃒'); + // Encode non-ASCII symbols that can be replaced with a named reference. + string = string.replace(regexEncodeNonAscii, function(string) { + // Note: there is no need to check `has(encodeMap, string)` here. + return '&' + encodeMap[string] + ';'; + }); + } else if (!allowUnsafeSymbols) { + // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled + // using named character references. + string = string.replace(regexEscape, escapeBmpSymbol); + } + return string + // Encode astral symbols. + .replace(regexAstralSymbols, function($0) { + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + var high = $0.charCodeAt(0); + var low = $0.charCodeAt(1); + var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; + return escapeCodePoint(codePoint); + }) + // Encode any remaining BMP symbols that are not printable ASCII symbols + // using a hexadecimal escape. + .replace(regexBmpWhitelist, escapeBmpSymbol); + }; + // Expose default options (so they can be overridden globally). + encode.options = { + 'allowUnsafeSymbols': false, + 'encodeEverything': false, + 'strict': false, + 'useNamedReferences': false, + 'decimal' : false + }; + + var decode = function(html, options) { + options = merge(options, decode.options); + var strict = options.strict; + if (strict && regexInvalidEntity.test(html)) { + parseError('malformed character reference'); + } + return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) { + var codePoint; + var semicolon; + var decDigits; + var hexDigits; + var reference; + var next; + + if ($1) { + reference = $1; + // Note: there is no need to check `has(decodeMap, reference)`. + return decodeMap[reference]; + } + + if ($2) { + // Decode named character references without trailing `;`, e.g. `&`. + // This is only a parse error if it gets converted to `&`, or if it is + // followed by `=` in an attribute context. + reference = $2; + next = $3; + if (next && options.isAttributeValue) { + if (strict && next == '=') { + parseError('`&` did not start a character reference'); + } + return $0; + } else { + if (strict) { + parseError( + 'named character reference was not terminated by a semicolon' + ); + } + // Note: there is no need to check `has(decodeMapLegacy, reference)`. + return decodeMapLegacy[reference] + (next || ''); + } + } + + if ($4) { + // Decode decimal escapes, e.g. `𝌆`. + decDigits = $4; + semicolon = $5; + if (strict && !semicolon) { + parseError('character reference was not terminated by a semicolon'); + } + codePoint = parseInt(decDigits, 10); + return codePointToSymbol(codePoint, strict); + } + + if ($6) { + // Decode hexadecimal escapes, e.g. `𝌆`. + hexDigits = $6; + semicolon = $7; + if (strict && !semicolon) { + parseError('character reference was not terminated by a semicolon'); + } + codePoint = parseInt(hexDigits, 16); + return codePointToSymbol(codePoint, strict); + } + + // If we’re still here, `if ($7)` is implied; it’s an ambiguous + // ampersand for sure. https://mths.be/notes/ambiguous-ampersands + if (strict) { + parseError( + 'named character reference was not terminated by a semicolon' + ); + } + return $0; + }); + }; + // Expose default options (so they can be overridden globally). + decode.options = { + 'isAttributeValue': false, + 'strict': false + }; + + var escape = function(string) { + return string.replace(regexEscape, function($0) { + // Note: there is no need to check `has(escapeMap, $0)` here. + return escapeMap[$0]; + }); + }; + + /*--------------------------------------------------------------------------*/ + + var he = { + 'version': '1.2.0', + 'encode': encode, + 'decode': decode, + 'escape': escape, + 'unescape': decode + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = he; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in he) { + has(he, key) && (freeExports[key] = he[key]); + } + } + } else { // in Rhino or a web browser + root.he = he; + } + + }(commonjsGlobal)); + }(he, he.exports)); + + (function (exports) { + + /** + * Various utility functions used throughout Mocha's codebase. + * @module utils + */ + + /** + * Module dependencies. + */ + + const {nanoid} = nonSecure; + var path = require$$1; + var util = require$$0$1; + var he$1 = he.exports; + + const MOCHA_ID_PROP_NAME = '__mocha_id__'; + + /** + * Inherit the prototype methods from one constructor into another. + * + * @param {function} ctor - Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor - Constructor function to inherit prototype from. + * @throws {TypeError} if either constructor is null, or if super constructor + * lacks a prototype. + */ + exports.inherits = util.inherits; + + /** + * Escape special characters in the given string of html. + * + * @private + * @param {string} html + * @return {string} + */ + exports.escape = function (html) { + return he$1.encode(String(html), {useNamedReferences: false}); + }; + + /** + * Test if the given obj is type of string. + * + * @private + * @param {Object} obj + * @return {boolean} + */ + exports.isString = function (obj) { + return typeof obj === 'string'; + }; + + /** + * Compute a slug from the given `str`. + * + * @private + * @param {string} str + * @return {string} + */ + exports.slug = function (str) { + return str + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^-\w]/g, '') + .replace(/-{2,}/g, '-'); + }; + + /** + * Strip the function definition from `str`, and re-indent for pre whitespace. + * + * @param {string} str + * @return {string} + */ + exports.clean = function (str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, '\n') + .replace(/^\uFEFF/, '') + // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content + .replace( + /^function(?:\s*|\s[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\}|((?:.|\n)*))$/, + '$1$2$3' + ); + + var spaces = str.match(/^\n?( *)/)[1].length; + var tabs = str.match(/^\n?(\t*)/)[1].length; + var re = new RegExp( + '^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs || spaces) + '}', + 'gm' + ); + + str = str.replace(re, ''); + + return str.trim(); + }; + + /** + * If a value could have properties, and has none, this function is called, + * which returns a string representation of the empty value. + * + * Functions w/ no properties return `'[Function]'` + * Arrays w/ length === 0 return `'[]'` + * Objects w/ no properties return `'{}'` + * All else: return result of `value.toString()` + * + * @private + * @param {*} value The value to inspect. + * @param {string} typeHint The type of the value + * @returns {string} + */ + function emptyRepresentation(value, typeHint) { + switch (typeHint) { + case 'function': + return '[Function]'; + case 'object': + return '{}'; + case 'array': + return '[]'; + default: + return value.toString(); + } + } + + /** + * Takes some variable and asks `Object.prototype.toString()` what it thinks it + * is. + * + * @private + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString + * @param {*} value The value to test. + * @returns {string} Computed type + * @example + * canonicalType({}) // 'object' + * canonicalType([]) // 'array' + * canonicalType(1) // 'number' + * canonicalType(false) // 'boolean' + * canonicalType(Infinity) // 'number' + * canonicalType(null) // 'null' + * canonicalType(new Date()) // 'date' + * canonicalType(/foo/) // 'regexp' + * canonicalType('type') // 'string' + * canonicalType(global) // 'global' + * canonicalType(new String('foo') // 'object' + * canonicalType(async function() {}) // 'asyncfunction' + * canonicalType(await import(name)) // 'module' + */ + var canonicalType = (exports.canonicalType = function canonicalType(value) { + if (value === undefined) { + return 'undefined'; + } else if (value === null) { + return 'null'; + } else if (isBuffer(value)) { + return 'buffer'; + } + return Object.prototype.toString + .call(value) + .replace(/^\[.+\s(.+?)]$/, '$1') + .toLowerCase(); + }); + + /** + * + * Returns a general type or data structure of a variable + * @private + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures + * @param {*} value The value to test. + * @returns {string} One of undefined, boolean, number, string, bigint, symbol, object + * @example + * type({}) // 'object' + * type([]) // 'array' + * type(1) // 'number' + * type(false) // 'boolean' + * type(Infinity) // 'number' + * type(null) // 'null' + * type(new Date()) // 'object' + * type(/foo/) // 'object' + * type('type') // 'string' + * type(global) // 'object' + * type(new String('foo') // 'string' + */ + exports.type = function type(value) { + // Null is special + if (value === null) return 'null'; + const primitives = new Set([ + 'undefined', + 'boolean', + 'number', + 'string', + 'bigint', + 'symbol' + ]); + const _type = typeof value; + if (_type === 'function') return _type; + if (primitives.has(_type)) return _type; + if (value instanceof String) return 'string'; + if (value instanceof Error) return 'error'; + if (Array.isArray(value)) return 'array'; + + return _type; + }; + + /** + * Stringify `value`. Different behavior depending on type of value: + * + * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. + * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. + * - If `value` is an *empty* object, function, or array, return result of function + * {@link emptyRepresentation}. + * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of + * JSON.stringify(). + * + * @private + * @see exports.type + * @param {*} value + * @return {string} + */ + exports.stringify = function (value) { + var typeHint = canonicalType(value); + + if (!~['object', 'array', 'function'].indexOf(typeHint)) { + if (typeHint === 'buffer') { + var json = Buffer.prototype.toJSON.call(value); + // Based on the toJSON result + return jsonStringify( + json.data && json.type ? json.data : json, + 2 + ).replace(/,(\n|$)/g, '$1'); + } + + // IE7/IE8 has a bizarre String constructor; needs to be coerced + // into an array and back to obj. + if (typeHint === 'string' && typeof value === 'object') { + value = value.split('').reduce(function (acc, char, idx) { + acc[idx] = char; + return acc; + }, {}); + typeHint = 'object'; + } else { + return jsonStringify(value); + } + } + + for (var prop in value) { + if (Object.prototype.hasOwnProperty.call(value, prop)) { + return jsonStringify( + exports.canonicalize(value, null, typeHint), + 2 + ).replace(/,(\n|$)/g, '$1'); + } + } + + return emptyRepresentation(value, typeHint); + }; + + /** + * like JSON.stringify but more sense. + * + * @private + * @param {Object} object + * @param {number=} spaces + * @param {number=} depth + * @returns {*} + */ + function jsonStringify(object, spaces, depth) { + if (typeof spaces === 'undefined') { + // primitive types + return _stringify(object); + } + + depth = depth || 1; + var space = spaces * depth; + var str = Array.isArray(object) ? '[' : '{'; + var end = Array.isArray(object) ? ']' : '}'; + var length = + typeof object.length === 'number' + ? object.length + : Object.keys(object).length; + // `.repeat()` polyfill + function repeat(s, n) { + return new Array(n).join(s); + } + + function _stringify(val) { + switch (canonicalType(val)) { + case 'null': + case 'undefined': + val = '[' + val + ']'; + break; + case 'array': + case 'object': + val = jsonStringify(val, spaces, depth + 1); + break; + case 'boolean': + case 'regexp': + case 'symbol': + case 'number': + val = + val === 0 && 1 / val === -Infinity // `-0` + ? '-0' + : val.toString(); + break; + case 'bigint': + val = val.toString() + 'n'; + break; + case 'date': + var sDate = isNaN(val.getTime()) ? val.toString() : val.toISOString(); + val = '[Date: ' + sDate + ']'; + break; + case 'buffer': + var json = val.toJSON(); + // Based on the toJSON result + json = json.data && json.type ? json.data : json; + val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; + break; + default: + val = + val === '[Function]' || val === '[Circular]' + ? val + : JSON.stringify(val); // string + } + return val; + } + + for (var i in object) { + if (!Object.prototype.hasOwnProperty.call(object, i)) { + continue; // not my business + } + --length; + str += + '\n ' + + repeat(' ', space) + + (Array.isArray(object) ? '' : '"' + i + '": ') + // key + _stringify(object[i]) + // value + (length ? ',' : ''); // comma + } + + return ( + str + + // [], {} + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end) + ); + } + + /** + * Return a new Thing that has the keys in sorted order. Recursive. + * + * If the Thing... + * - has already been seen, return string `'[Circular]'` + * - is `undefined`, return string `'[undefined]'` + * - is `null`, return value `null` + * - is some other primitive, return the value + * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method + * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. + * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` + * + * @private + * @see {@link exports.stringify} + * @param {*} value Thing to inspect. May or may not have properties. + * @param {Array} [stack=[]] Stack of seen values + * @param {string} [typeHint] Type hint + * @return {(Object|Array|Function|string|undefined)} + */ + exports.canonicalize = function canonicalize(value, stack, typeHint) { + var canonicalizedObj; + /* eslint-disable no-unused-vars */ + var prop; + /* eslint-enable no-unused-vars */ + typeHint = typeHint || canonicalType(value); + function withStack(value, fn) { + stack.push(value); + fn(); + stack.pop(); + } + + stack = stack || []; + + if (stack.indexOf(value) !== -1) { + return '[Circular]'; + } + + switch (typeHint) { + case 'undefined': + case 'buffer': + case 'null': + canonicalizedObj = value; + break; + case 'array': + withStack(value, function () { + canonicalizedObj = value.map(function (item) { + return exports.canonicalize(item, stack); + }); + }); + break; + case 'function': + /* eslint-disable-next-line no-unused-vars, no-unreachable-loop */ + for (prop in value) { + canonicalizedObj = {}; + break; + } + /* eslint-enable guard-for-in */ + if (!canonicalizedObj) { + canonicalizedObj = emptyRepresentation(value, typeHint); + break; + } + /* falls through */ + case 'object': + canonicalizedObj = canonicalizedObj || {}; + withStack(value, function () { + Object.keys(value) + .sort() + .forEach(function (key) { + canonicalizedObj[key] = exports.canonicalize(value[key], stack); + }); + }); + break; + case 'date': + case 'number': + case 'regexp': + case 'boolean': + case 'symbol': + canonicalizedObj = value; + break; + default: + canonicalizedObj = value + ''; + } + + return canonicalizedObj; + }; + + /** + * @summary + * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) + * @description + * When invoking this function you get a filter function that get the Error.stack as an input, + * and return a prettify output. + * (i.e: strip Mocha and internal node functions from stack trace). + * @returns {Function} + */ + exports.stackTraceFilter = function () { + // TODO: Replace with `process.browser` + var is = typeof document === 'undefined' ? {node: true} : {browser: true}; + var slash = path.sep; + var cwd; + if (is.node) { + cwd = exports.cwd() + slash; + } else { + cwd = ( + typeof location === 'undefined' ? window.location : location + ).href.replace(/\/[^/]*$/, '/'); + slash = '/'; + } + + function isMochaInternal(line) { + return ( + ~line.indexOf('node_modules' + slash + 'mocha' + slash) || + ~line.indexOf(slash + 'mocha.js') || + ~line.indexOf(slash + 'mocha.min.js') + ); + } + + function isNodeInternal(line) { + return ( + ~line.indexOf('(timers.js:') || + ~line.indexOf('(events.js:') || + ~line.indexOf('(node.js:') || + ~line.indexOf('(module.js:') || + ~line.indexOf('GeneratorFunctionPrototype.next (native)') || + false + ); + } + + return function (stack) { + stack = stack.split('\n'); + + stack = stack.reduce(function (list, line) { + if (isMochaInternal(line)) { + return list; + } + + if (is.node && isNodeInternal(line)) { + return list; + } + + // Clean up cwd(absolute) + if (/:\d+:\d+\)?$/.test(line)) { + line = line.replace('(' + cwd, '('); + } + + list.push(line); + return list; + }, []); + + return stack.join('\n'); + }; + }; + + /** + * Crude, but effective. + * @public + * @param {*} value + * @returns {boolean} Whether or not `value` is a Promise + */ + exports.isPromise = function isPromise(value) { + return ( + typeof value === 'object' && + value !== null && + typeof value.then === 'function' + ); + }; + + /** + * Clamps a numeric value to an inclusive range. + * + * @param {number} value - Value to be clamped. + * @param {number[]} range - Two element array specifying [min, max] range. + * @returns {number} clamped value + */ + exports.clamp = function clamp(value, range) { + return Math.min(Math.max(value, range[0]), range[1]); + }; + + /** + * It's a noop. + * @public + */ + exports.noop = function () {}; + + /** + * Creates a map-like object. + * + * @description + * A "map" is an object with no prototype, for our purposes. In some cases + * this would be more appropriate than a `Map`, especially if your environment + * doesn't support it. Recommended for use in Mocha's public APIs. + * + * @public + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Custom_and_Null_objects|MDN:Map} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Custom_and_Null_objects|MDN:Object.create - Custom objects} + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Custom_and_Null_objects|MDN:Object.assign} + * @param {...*} [obj] - Arguments to `Object.assign()`. + * @returns {Object} An object with no prototype, having `...obj` properties + */ + exports.createMap = function (obj) { + return Object.assign.apply( + null, + [Object.create(null)].concat(Array.prototype.slice.call(arguments)) + ); + }; + + /** + * Creates a read-only map-like object. + * + * @description + * This differs from {@link module:utils.createMap createMap} only in that + * the argument must be non-empty, because the result is frozen. + * + * @see {@link module:utils.createMap createMap} + * @param {...*} [obj] - Arguments to `Object.assign()`. + * @returns {Object} A frozen object with no prototype, having `...obj` properties + * @throws {TypeError} if argument is not a non-empty object. + */ + exports.defineConstants = function (obj) { + if (canonicalType(obj) !== 'object' || !Object.keys(obj).length) { + throw new TypeError('Invalid argument; expected a non-empty object'); + } + return Object.freeze(exports.createMap(obj)); + }; + + /** + * Returns current working directory + * + * Wrapper around `process.cwd()` for isolation + * @private + */ + exports.cwd = function cwd() { + return process.cwd(); + }; + + /** + * Returns `true` if Mocha is running in a browser. + * Checks for `process.browser`. + * @returns {boolean} + * @private + */ + exports.isBrowser = function isBrowser() { + return Boolean(browser$2); + }; + + /* + * Casts `value` to an array; useful for optionally accepting array parameters + * + * It follows these rules, depending on `value`. If `value` is... + * 1. `undefined`: return an empty Array + * 2. `null`: return an array with a single `null` element + * 3. Any other object: return the value of `Array.from()` _if_ the object is iterable + * 4. otherwise: return an array with a single element, `value` + * @param {*} value - Something to cast to an Array + * @returns {Array<*>} + */ + exports.castArray = function castArray(value) { + if (value === undefined) { + return []; + } + if (value === null) { + return [null]; + } + if ( + typeof value === 'object' && + (typeof value[Symbol.iterator] === 'function' || value.length !== undefined) + ) { + return Array.from(value); + } + return [value]; + }; + + exports.constants = exports.defineConstants({ + MOCHA_ID_PROP_NAME + }); + + /** + * Creates a new unique identifier + * @returns {string} Unique identifier + */ + exports.uniqueID = () => nanoid(); + + exports.assignNewMochaID = obj => { + const id = exports.uniqueID(); + Object.defineProperty(obj, MOCHA_ID_PROP_NAME, { + get() { + return id; + } + }); + return obj; + }; + + /** + * Retrieves a Mocha ID from an object, if present. + * @param {*} [obj] - Object + * @returns {string|void} + */ + exports.getMochaID = obj => + obj && typeof obj === 'object' ? obj[MOCHA_ID_PROP_NAME] : undefined; + }(utils$3)); + + var _nodeResolve_empty = {}; + + var _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': _nodeResolve_empty + }); + + var require$$18 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty$1); + + var browser$1 = { + info: 'ℹ️', + success: '✅', + warning: '⚠️', + error: '❌️' + }; + + var require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_events); + + /** + @module Pending + */ + + var pending = Pending$2; + + /** + * Initialize a new `Pending` error with the given message. + * + * @param {string} message + */ + function Pending$2(message) { + this.message = message; + } + + var browser = {exports: {}}; + + /** + * Helpers. + */ + + var s = 1000; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + + /** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + + var ms = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); + }; + + /** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + + function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } + } + + /** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; + } + + /** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; + } + + /** + * Pluralization helper. + */ + + function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); + } + + /** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = ms; + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + + return enabledCache; + }, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; + } + + var common$1 = setup; + + (function (module, exports) { + /** + * This is the web browser implementation of `debug()`. + */ + + exports.formatArgs = formatArgs; + exports.save = save; + exports.load = load; + exports.useColors = useColors; + exports.storage = localstorage(); + exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; + })(); + + /** + * Colors. + */ + + exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' + ]; + + /** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + + // eslint-disable-next-line complexity + function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); + } + + /** + * Colorize log arguments if enabled. + * + * @api public + */ + + function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); + } + + /** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ + exports.log = console.debug || console.log || (() => {}); + + /** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + /** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; + } + + /** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + + function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + module.exports = common$1(exports); + + const {formatters} = module.exports; + + /** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + + formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } + }; + }(browser, browser.exports)); + + const {format} = require$$0$1; + + /** + * Contains error codes, factory functions to create throwable error objects, + * and warning/deprecation functions. + * @module + */ + + /** + * process.emitWarning or a polyfill + * @see https://nodejs.org/api/process.html#process_process_emitwarning_warning_options + * @ignore + */ + const emitWarning = (msg, type) => { + if (process.emitWarning) { + process.emitWarning(msg, type); + } else { + /* istanbul ignore next */ + nextTick$1(function () { + console.warn(type + ': ' + msg); + }); + } + }; + + /** + * Show a deprecation warning. Each distinct message is only displayed once. + * Ignores empty messages. + * + * @param {string} [msg] - Warning to print + * @private + */ + const deprecate = msg => { + msg = String(msg); + if (msg && !deprecate.cache[msg]) { + deprecate.cache[msg] = true; + emitWarning(msg, 'DeprecationWarning'); + } + }; + deprecate.cache = {}; + + /** + * Show a generic warning. + * Ignores empty messages. + * + * @param {string} [msg] - Warning to print + * @private + */ + const warn = msg => { + if (msg) { + emitWarning(msg); + } + }; + + /** + * When Mocha throws exceptions (or rejects `Promise`s), it attempts to assign a `code` property to the `Error` object, for easier handling. These are the potential values of `code`. + * @public + * @namespace + * @memberof module:lib/errors + */ + var constants$4 = { + /** + * An unrecoverable error. + * @constant + * @default + */ + FATAL: 'ERR_MOCHA_FATAL', + + /** + * The type of an argument to a function call is invalid + * @constant + * @default + */ + INVALID_ARG_TYPE: 'ERR_MOCHA_INVALID_ARG_TYPE', + + /** + * The value of an argument to a function call is invalid + * @constant + * @default + */ + INVALID_ARG_VALUE: 'ERR_MOCHA_INVALID_ARG_VALUE', + + /** + * Something was thrown, but it wasn't an `Error` + * @constant + * @default + */ + INVALID_EXCEPTION: 'ERR_MOCHA_INVALID_EXCEPTION', + + /** + * An interface (e.g., `Mocha.interfaces`) is unknown or invalid + * @constant + * @default + */ + INVALID_INTERFACE: 'ERR_MOCHA_INVALID_INTERFACE', + + /** + * A reporter (.e.g, `Mocha.reporters`) is unknown or invalid + * @constant + * @default + */ + INVALID_REPORTER: 'ERR_MOCHA_INVALID_REPORTER', + + /** + * `done()` was called twice in a `Test` or `Hook` callback + * @constant + * @default + */ + MULTIPLE_DONE: 'ERR_MOCHA_MULTIPLE_DONE', + + /** + * No files matched the pattern provided by the user + * @constant + * @default + */ + NO_FILES_MATCH_PATTERN: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN', + + /** + * Known, but unsupported behavior of some kind + * @constant + * @default + */ + UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED', + + /** + * Invalid state transition occurring in `Mocha` instance + * @constant + * @default + */ + INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING', + + /** + * Invalid state transition occurring in `Mocha` instance + * @constant + * @default + */ + INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED', + + /** + * Use of `only()` w/ `--forbid-only` results in this error. + * @constant + * @default + */ + FORBIDDEN_EXCLUSIVITY: 'ERR_MOCHA_FORBIDDEN_EXCLUSIVITY', + + /** + * To be thrown when a user-defined plugin implementation (e.g., `mochaHooks`) is invalid + * @constant + * @default + */ + INVALID_PLUGIN_IMPLEMENTATION: 'ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION', + + /** + * To be thrown when a builtin or third-party plugin definition (the _definition_ of `mochaHooks`) is invalid + * @constant + * @default + */ + INVALID_PLUGIN_DEFINITION: 'ERR_MOCHA_INVALID_PLUGIN_DEFINITION', + + /** + * When a runnable exceeds its allowed run time. + * @constant + * @default + */ + TIMEOUT: 'ERR_MOCHA_TIMEOUT', + + /** + * Input file is not able to be parsed + * @constant + * @default + */ + UNPARSABLE_FILE: 'ERR_MOCHA_UNPARSABLE_FILE' + }; + + /** + * A set containing all string values of all Mocha error constants, for use by {@link isMochaError}. + * @private + */ + const MOCHA_ERRORS = new Set(Object.values(constants$4)); + + /** + * Creates an error object to be thrown when no files to be tested could be found using specified pattern. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} pattern - User-specified argument value. + * @returns {Error} instance detailing the error condition + */ + function createNoFilesMatchPatternError(message, pattern) { + var err = new Error(message); + err.code = constants$4.NO_FILES_MATCH_PATTERN; + err.pattern = pattern; + return err; + } + + /** + * Creates an error object to be thrown when the reporter specified in the options was not found. + * + * @public + * @param {string} message - Error message to be displayed. + * @param {string} reporter - User-specified reporter value. + * @returns {Error} instance detailing the error condition + */ + function createInvalidReporterError(message, reporter) { + var err = new TypeError(message); + err.code = constants$4.INVALID_REPORTER; + err.reporter = reporter; + return err; + } + + /** + * Creates an error object to be thrown when the interface specified in the options was not found. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} ui - User-specified interface value. + * @returns {Error} instance detailing the error condition + */ + function createInvalidInterfaceError(message, ui) { + var err = new Error(message); + err.code = constants$4.INVALID_INTERFACE; + err.interface = ui; + return err; + } + + /** + * Creates an error object to be thrown when a behavior, option, or parameter is unsupported. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ + function createUnsupportedError$2(message) { + var err = new Error(message); + err.code = constants$4.UNSUPPORTED; + return err; + } + + /** + * Creates an error object to be thrown when an argument is missing. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} argument - Argument name. + * @param {string} expected - Expected argument datatype. + * @returns {Error} instance detailing the error condition + */ + function createMissingArgumentError$1(message, argument, expected) { + return createInvalidArgumentTypeError$1(message, argument, expected); + } + + /** + * Creates an error object to be thrown when an argument did not use the supported type + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} argument - Argument name. + * @param {string} expected - Expected argument datatype. + * @returns {Error} instance detailing the error condition + */ + function createInvalidArgumentTypeError$1(message, argument, expected) { + var err = new TypeError(message); + err.code = constants$4.INVALID_ARG_TYPE; + err.argument = argument; + err.expected = expected; + err.actual = typeof argument; + return err; + } + + /** + * Creates an error object to be thrown when an argument did not use the supported value + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} argument - Argument name. + * @param {string} value - Argument value. + * @param {string} [reason] - Why value is invalid. + * @returns {Error} instance detailing the error condition + */ + function createInvalidArgumentValueError(message, argument, value, reason) { + var err = new TypeError(message); + err.code = constants$4.INVALID_ARG_VALUE; + err.argument = argument; + err.value = value; + err.reason = typeof reason !== 'undefined' ? reason : 'is invalid'; + return err; + } + + /** + * Creates an error object to be thrown when an exception was caught, but the `Error` is falsy or undefined. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ + function createInvalidExceptionError$2(message, value) { + var err = new Error(message); + err.code = constants$4.INVALID_EXCEPTION; + err.valueType = typeof value; + err.value = value; + return err; + } + + /** + * Creates an error object to be thrown when an unrecoverable error occurs. + * + * @public + * @static + * @param {string} message - Error message to be displayed. + * @returns {Error} instance detailing the error condition + */ + function createFatalError$1(message, value) { + var err = new Error(message); + err.code = constants$4.FATAL; + err.valueType = typeof value; + err.value = value; + return err; + } + + /** + * Dynamically creates a plugin-type-specific error based on plugin type + * @param {string} message - Error message + * @param {"reporter"|"ui"} pluginType - Plugin type. Future: expand as needed + * @param {string} [pluginId] - Name/path of plugin, if any + * @throws When `pluginType` is not known + * @public + * @static + * @returns {Error} + */ + function createInvalidLegacyPluginError(message, pluginType, pluginId) { + switch (pluginType) { + case 'reporter': + return createInvalidReporterError(message, pluginId); + case 'ui': + return createInvalidInterfaceError(message, pluginId); + default: + throw new Error('unknown pluginType "' + pluginType + '"'); + } + } + + /** + * **DEPRECATED**. Use {@link createInvalidLegacyPluginError} instead Dynamically creates a plugin-type-specific error based on plugin type + * @deprecated + * @param {string} message - Error message + * @param {"reporter"|"interface"} pluginType - Plugin type. Future: expand as needed + * @param {string} [pluginId] - Name/path of plugin, if any + * @throws When `pluginType` is not known + * @public + * @static + * @returns {Error} + */ + function createInvalidPluginError(...args) { + deprecate('Use createInvalidLegacyPluginError() instead'); + return createInvalidLegacyPluginError(...args); + } + + /** + * Creates an error object to be thrown when a mocha object's `run` method is executed while it is already disposed. + * @param {string} message The error message to be displayed. + * @param {boolean} cleanReferencesAfterRun the value of `cleanReferencesAfterRun` + * @param {Mocha} instance the mocha instance that throw this error + * @static + */ + function createMochaInstanceAlreadyDisposedError( + message, + cleanReferencesAfterRun, + instance + ) { + var err = new Error(message); + err.code = constants$4.INSTANCE_ALREADY_DISPOSED; + err.cleanReferencesAfterRun = cleanReferencesAfterRun; + err.instance = instance; + return err; + } + + /** + * Creates an error object to be thrown when a mocha object's `run` method is called while a test run is in progress. + * @param {string} message The error message to be displayed. + * @static + * @public + */ + function createMochaInstanceAlreadyRunningError(message, instance) { + var err = new Error(message); + err.code = constants$4.INSTANCE_ALREADY_RUNNING; + err.instance = instance; + return err; + } + + /** + * Creates an error object to be thrown when done() is called multiple times in a test + * + * @public + * @param {Runnable} runnable - Original runnable + * @param {Error} [originalErr] - Original error, if any + * @returns {Error} instance detailing the error condition + * @static + */ + function createMultipleDoneError$1(runnable, originalErr) { + var title; + try { + title = format('<%s>', runnable.fullTitle()); + if (runnable.parent.root) { + title += ' (of root suite)'; + } + } catch (ignored) { + title = format('<%s> (of unknown suite)', runnable.title); + } + var message = format( + 'done() called multiple times in %s %s', + runnable.type ? runnable.type : 'unknown runnable', + title + ); + if (runnable.file) { + message += format(' of file %s', runnable.file); + } + if (originalErr) { + message += format('; in addition, done() received error: %s', originalErr); + } + + var err = new Error(message); + err.code = constants$4.MULTIPLE_DONE; + err.valueType = typeof originalErr; + err.value = originalErr; + return err; + } + + /** + * Creates an error object to be thrown when `.only()` is used with + * `--forbid-only`. + * @static + * @public + * @param {Mocha} mocha - Mocha instance + * @returns {Error} Error with code {@link constants.FORBIDDEN_EXCLUSIVITY} + */ + function createForbiddenExclusivityError$1(mocha) { + var err = new Error( + mocha.isWorker + ? '`.only` is not supported in parallel mode' + : '`.only` forbidden by --forbid-only' + ); + err.code = constants$4.FORBIDDEN_EXCLUSIVITY; + return err; + } + + /** + * Creates an error object to be thrown when a plugin definition is invalid + * @static + * @param {string} msg - Error message + * @param {PluginDefinition} [pluginDef] - Problematic plugin definition + * @public + * @returns {Error} Error with code {@link constants.INVALID_PLUGIN_DEFINITION} + */ + function createInvalidPluginDefinitionError(msg, pluginDef) { + const err = new Error(msg); + err.code = constants$4.INVALID_PLUGIN_DEFINITION; + err.pluginDef = pluginDef; + return err; + } + + /** + * Creates an error object to be thrown when a plugin implementation (user code) is invalid + * @static + * @param {string} msg - Error message + * @param {Object} [opts] - Plugin definition and user-supplied implementation + * @param {PluginDefinition} [opts.pluginDef] - Plugin Definition + * @param {*} [opts.pluginImpl] - Plugin Implementation (user-supplied) + * @public + * @returns {Error} Error with code {@link constants.INVALID_PLUGIN_DEFINITION} + */ + function createInvalidPluginImplementationError( + msg, + {pluginDef, pluginImpl} = {} + ) { + const err = new Error(msg); + err.code = constants$4.INVALID_PLUGIN_IMPLEMENTATION; + err.pluginDef = pluginDef; + err.pluginImpl = pluginImpl; + return err; + } + + /** + * Creates an error object to be thrown when a runnable exceeds its allowed run time. + * @static + * @param {string} msg - Error message + * @param {number} [timeout] - Timeout in ms + * @param {string} [file] - File, if given + * @returns {MochaTimeoutError} + */ + function createTimeoutError$1(msg, timeout, file) { + const err = new Error(msg); + err.code = constants$4.TIMEOUT; + err.timeout = timeout; + err.file = file; + return err; + } + + /** + * Creates an error object to be thrown when file is unparsable + * @public + * @static + * @param {string} message - Error message to be displayed. + * @param {string} filename - File name + * @returns {Error} Error with code {@link constants.UNPARSABLE_FILE} + */ + function createUnparsableFileError(message, filename) { + var err = new Error(message); + err.code = constants$4.UNPARSABLE_FILE; + return err; + } + + /** + * Returns `true` if an error came out of Mocha. + * _Can suffer from false negatives, but not false positives._ + * @static + * @public + * @param {*} err - Error, or anything + * @returns {boolean} + */ + const isMochaError$1 = err => + Boolean(err && typeof err === 'object' && MOCHA_ERRORS.has(err.code)); + + var errors$2 = { + constants: constants$4, + createFatalError: createFatalError$1, + createForbiddenExclusivityError: createForbiddenExclusivityError$1, + createInvalidArgumentTypeError: createInvalidArgumentTypeError$1, + createInvalidArgumentValueError, + createInvalidExceptionError: createInvalidExceptionError$2, + createInvalidInterfaceError, + createInvalidLegacyPluginError, + createInvalidPluginDefinitionError, + createInvalidPluginError, + createInvalidPluginImplementationError, + createInvalidReporterError, + createMissingArgumentError: createMissingArgumentError$1, + createMochaInstanceAlreadyDisposedError, + createMochaInstanceAlreadyRunningError, + createMultipleDoneError: createMultipleDoneError$1, + createNoFilesMatchPatternError, + createTimeoutError: createTimeoutError$1, + createUnparsableFileError, + createUnsupportedError: createUnsupportedError$2, + deprecate, + isMochaError: isMochaError$1, + warn + }; + + var EventEmitter$1 = require$$0.EventEmitter; + var Pending$1 = pending; + var debug$1 = browser.exports('mocha:runnable'); + var milliseconds = ms$1; + var utils$2 = utils$3; + const { + createInvalidExceptionError: createInvalidExceptionError$1, + createMultipleDoneError, + createTimeoutError + } = errors$2; + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + * @private + */ + var Date$3 = commonjsGlobal.Date; + var setTimeout$2 = commonjsGlobal.setTimeout; + var clearTimeout$1 = commonjsGlobal.clearTimeout; + var toString = Object.prototype.toString; + + var runnable = Runnable$3; + + /** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @class + * @extends external:EventEmitter + * @public + * @param {String} title + * @param {Function} fn + */ + function Runnable$3(title, fn) { + this.title = title; + this.fn = fn; + this.body = (fn || '').toString(); + this.async = fn && fn.length; + this.sync = !this.async; + this._timeout = 2000; + this._slow = 75; + this._retries = -1; + utils$2.assignNewMochaID(this); + Object.defineProperty(this, 'id', { + get() { + return utils$2.getMochaID(this); + } + }); + this.reset(); + } + + /** + * Inherit from `EventEmitter.prototype`. + */ + utils$2.inherits(Runnable$3, EventEmitter$1); + + /** + * Resets the state initially or for a next run. + */ + Runnable$3.prototype.reset = function () { + this.timedOut = false; + this._currentRetry = 0; + this.pending = false; + delete this.state; + delete this.err; + }; + + /** + * Get current timeout value in msecs. + * + * @private + * @returns {number} current timeout threshold value + */ + /** + * @summary + * Set timeout threshold value (msecs). + * + * @description + * A string argument can use shorthand (e.g., "2s") and will be converted. + * The value will be clamped to range [0, 2^31-1]. + * If clamped value matches either range endpoint, timeouts will be disabled. + * + * @private + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value} + * @param {number|string} ms - Timeout threshold value. + * @returns {Runnable} this + * @chainable + */ + Runnable$3.prototype.timeout = function (ms) { + if (!arguments.length) { + return this._timeout; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + + // Clamp to range + var INT_MAX = Math.pow(2, 31) - 1; + var range = [0, INT_MAX]; + ms = utils$2.clamp(ms, range); + + // see #1652 for reasoning + if (ms === range[0] || ms === range[1]) { + this._timeout = 0; + } else { + this._timeout = ms; + } + debug$1('timeout %d', this._timeout); + + if (this.timer) { + this.resetTimeout(); + } + return this; + }; + + /** + * Set or get slow `ms`. + * + * @private + * @param {number|string} ms + * @return {Runnable|number} ms or Runnable instance. + */ + Runnable$3.prototype.slow = function (ms) { + if (!arguments.length || typeof ms === 'undefined') { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug$1('slow %d', ms); + this._slow = ms; + return this; + }; + + /** + * Halt and mark as pending. + * + * @memberof Mocha.Runnable + * @public + */ + Runnable$3.prototype.skip = function () { + this.pending = true; + throw new Pending$1('sync skip; aborting execution'); + }; + + /** + * Check if this runnable or its parent suite is marked as pending. + * + * @private + */ + Runnable$3.prototype.isPending = function () { + return this.pending || (this.parent && this.parent.isPending()); + }; + + /** + * Return `true` if this Runnable has failed. + * @return {boolean} + * @private + */ + Runnable$3.prototype.isFailed = function () { + return !this.isPending() && this.state === constants$3.STATE_FAILED; + }; + + /** + * Return `true` if this Runnable has passed. + * @return {boolean} + * @private + */ + Runnable$3.prototype.isPassed = function () { + return !this.isPending() && this.state === constants$3.STATE_PASSED; + }; + + /** + * Set or get number of retries. + * + * @private + */ + Runnable$3.prototype.retries = function (n) { + if (!arguments.length) { + return this._retries; + } + this._retries = n; + }; + + /** + * Set or get current retry + * + * @private + */ + Runnable$3.prototype.currentRetry = function (n) { + if (!arguments.length) { + return this._currentRetry; + } + this._currentRetry = n; + }; + + /** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @memberof Mocha.Runnable + * @public + * @return {string} + */ + Runnable$3.prototype.fullTitle = function () { + return this.titlePath().join(' '); + }; + + /** + * Return the title path generated by concatenating the parent's title path with the title. + * + * @memberof Mocha.Runnable + * @public + * @return {string} + */ + Runnable$3.prototype.titlePath = function () { + return this.parent.titlePath().concat([this.title]); + }; + + /** + * Clear the timeout. + * + * @private + */ + Runnable$3.prototype.clearTimeout = function () { + clearTimeout$1(this.timer); + }; + + /** + * Reset the timeout. + * + * @private + */ + Runnable$3.prototype.resetTimeout = function () { + var self = this; + var ms = this.timeout(); + + if (ms === 0) { + return; + } + this.clearTimeout(); + this.timer = setTimeout$2(function () { + if (self.timeout() === 0) { + return; + } + self.callback(self._timeoutError(ms)); + self.timedOut = true; + }, ms); + }; + + /** + * Set or get a list of whitelisted globals for this test run. + * + * @private + * @param {string[]} globals + */ + Runnable$3.prototype.globals = function (globals) { + if (!arguments.length) { + return this._allowedGlobals; + } + this._allowedGlobals = globals; + }; + + /** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @private + */ + Runnable$3.prototype.run = function (fn) { + var self = this; + var start = new Date$3(); + var ctx = this.ctx; + var finished; + var errorWasHandled = false; + + if (this.isPending()) return fn(); + + // Sometimes the ctx exists, but it is not runnable + if (ctx && ctx.runnable) { + ctx.runnable(this); + } + + // called multiple times + function multiple(err) { + if (errorWasHandled) { + return; + } + errorWasHandled = true; + self.emit('error', createMultipleDoneError(self, err)); + } + + // finished + function done(err) { + var ms = self.timeout(); + if (self.timedOut) { + return; + } + + if (finished) { + return multiple(err); + } + + self.clearTimeout(); + self.duration = new Date$3() - start; + finished = true; + if (!err && self.duration > ms && ms > 0) { + err = self._timeoutError(ms); + } + fn(err); + } + + // for .resetTimeout() and Runner#uncaught() + this.callback = done; + + if (this.fn && typeof this.fn.call !== 'function') { + done( + new TypeError( + 'A runnable must be passed a function as its second argument.' + ) + ); + return; + } + + // explicit async with `done` argument + if (this.async) { + this.resetTimeout(); + + // allows skip() to be used in an explicit async context + this.skip = function asyncSkip() { + this.pending = true; + done(); + // halt execution, the uncaught handler will ignore the failure. + throw new Pending$1('async skip; aborting execution'); + }; + + try { + callFnAsync(this.fn); + } catch (err) { + // handles async runnables which actually run synchronously + errorWasHandled = true; + if (err instanceof Pending$1) { + return; // done() is already called in this.skip() + } else if (this.allowUncaught) { + throw err; + } + done(Runnable$3.toValueOrError(err)); + } + return; + } + + // sync or promise-returning + try { + callFn(this.fn); + } catch (err) { + errorWasHandled = true; + if (err instanceof Pending$1) { + return done(); + } else if (this.allowUncaught) { + throw err; + } + done(Runnable$3.toValueOrError(err)); + } + + function callFn(fn) { + var result = fn.call(ctx); + if (result && typeof result.then === 'function') { + self.resetTimeout(); + result.then( + function () { + done(); + // Return null so libraries like bluebird do not warn about + // subsequently constructed Promises. + return null; + }, + function (reason) { + done(reason || new Error('Promise rejected with no or falsy reason')); + } + ); + } else { + if (self.asyncOnly) { + return done( + new Error( + '--async-only option in use without declaring `done()` or returning a promise' + ) + ); + } + + done(); + } + } + + function callFnAsync(fn) { + var result = fn.call(ctx, function (err) { + if (err instanceof Error || toString.call(err) === '[object Error]') { + return done(err); + } + if (err) { + if (Object.prototype.toString.call(err) === '[object Object]') { + return done( + new Error('done() invoked with non-Error: ' + JSON.stringify(err)) + ); + } + return done(new Error('done() invoked with non-Error: ' + err)); + } + if (result && utils$2.isPromise(result)) { + return done( + new Error( + 'Resolution method is overspecified. Specify a callback *or* return a Promise; not both.' + ) + ); + } + + done(); + }); + } + }; + + /** + * Instantiates a "timeout" error + * + * @param {number} ms - Timeout (in milliseconds) + * @returns {Error} a "timeout" error + * @private + */ + Runnable$3.prototype._timeoutError = function (ms) { + let msg = `Timeout of ${ms}ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.`; + if (this.file) { + msg += ' (' + this.file + ')'; + } + return createTimeoutError(msg, ms, this.file); + }; + + var constants$3 = utils$2.defineConstants( + /** + * {@link Runnable}-related constants. + * @public + * @memberof Runnable + * @readonly + * @static + * @alias constants + * @enum {string} + */ + { + /** + * Value of `state` prop when a `Runnable` has failed + */ + STATE_FAILED: 'failed', + /** + * Value of `state` prop when a `Runnable` has passed + */ + STATE_PASSED: 'passed', + /** + * Value of `state` prop when a `Runnable` has been skipped by user + */ + STATE_PENDING: 'pending' + } + ); + + /** + * Given `value`, return identity if truthy, otherwise create an "invalid exception" error and return that. + * @param {*} [value] - Value to return, if present + * @returns {*|Error} `value`, otherwise an `Error` + * @private + */ + Runnable$3.toValueOrError = function (value) { + return ( + value || + createInvalidExceptionError$1( + 'Runnable failed with falsy or undefined exception. Please throw an Error instead.', + value + ) + ); + }; + + Runnable$3.constants = constants$3; + + var suite = {exports: {}}; + + var Runnable$2 = runnable; + const {inherits, constants: constants$2} = utils$3; + const {MOCHA_ID_PROP_NAME: MOCHA_ID_PROP_NAME$1} = constants$2; + + /** + * Expose `Hook`. + */ + + var hook = Hook; + + /** + * Initialize a new `Hook` with the given `title` and callback `fn` + * + * @class + * @extends Runnable + * @param {String} title + * @param {Function} fn + */ + function Hook(title, fn) { + Runnable$2.call(this, title, fn); + this.type = 'hook'; + } + + /** + * Inherit from `Runnable.prototype`. + */ + inherits(Hook, Runnable$2); + + /** + * Resets the state for a next run. + */ + Hook.prototype.reset = function () { + Runnable$2.prototype.reset.call(this); + delete this._error; + }; + + /** + * Get or set the test `err`. + * + * @memberof Hook + * @public + * @param {Error} err + * @return {Error} + */ + Hook.prototype.error = function (err) { + if (!arguments.length) { + err = this._error; + this._error = null; + return err; + } + + this._error = err; + }; + + /** + * Returns an object suitable for IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ + Hook.prototype.serialize = function serialize() { + return { + $$currentRetry: this.currentRetry(), + $$fullTitle: this.fullTitle(), + $$isPending: Boolean(this.isPending()), + $$titlePath: this.titlePath(), + ctx: + this.ctx && this.ctx.currentTest + ? { + currentTest: { + title: this.ctx.currentTest.title, + [MOCHA_ID_PROP_NAME$1]: this.ctx.currentTest.id + } + } + : {}, + duration: this.duration, + file: this.file, + parent: { + $$fullTitle: this.parent.fullTitle(), + [MOCHA_ID_PROP_NAME$1]: this.parent.id + }, + state: this.state, + title: this.title, + type: this.type, + [MOCHA_ID_PROP_NAME$1]: this.id + }; + }; + + (function (module, exports) { + + /** + * Module dependencies. + * @private + */ + const {EventEmitter} = require$$0; + const Hook = hook; + var { + assignNewMochaID, + clamp, + constants: utilsConstants, + defineConstants, + getMochaID, + inherits, + isString + } = utils$3; + const debug = browser.exports('mocha:suite'); + const milliseconds = ms$1; + const errors = errors$2; + + const {MOCHA_ID_PROP_NAME} = utilsConstants; + + /** + * Expose `Suite`. + */ + + module.exports = Suite; + + /** + * Create a new `Suite` with the given `title` and parent `Suite`. + * + * @public + * @param {Suite} parent - Parent suite (required!) + * @param {string} title - Title + * @return {Suite} + */ + Suite.create = function (parent, title) { + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; + }; + + /** + * Constructs a new `Suite` instance with the given `title`, `ctx`, and `isRoot`. + * + * @public + * @class + * @extends EventEmitter + * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter|EventEmitter} + * @param {string} title - Suite title. + * @param {Context} parentContext - Parent context instance. + * @param {boolean} [isRoot=false] - Whether this is the root suite. + */ + function Suite(title, parentContext, isRoot) { + if (!isString(title)) { + throw errors.createInvalidArgumentTypeError( + 'Suite argument "title" must be a string. Received type "' + + typeof title + + '"', + 'title', + 'string' + ); + } + this.title = title; + function Context() {} + Context.prototype = parentContext; + this.ctx = new Context(); + this.suites = []; + this.tests = []; + this.root = isRoot === true; + this.pending = false; + this._retries = -1; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this._timeout = 2000; + this._slow = 75; + this._bail = false; + this._onlyTests = []; + this._onlySuites = []; + assignNewMochaID(this); + + Object.defineProperty(this, 'id', { + get() { + return getMochaID(this); + } + }); + + this.reset(); + } + + /** + * Inherit from `EventEmitter.prototype`. + */ + inherits(Suite, EventEmitter); + + /** + * Resets the state initially or for a next run. + */ + Suite.prototype.reset = function () { + this.delayed = false; + function doReset(thingToReset) { + thingToReset.reset(); + } + this.suites.forEach(doReset); + this.tests.forEach(doReset); + this._beforeEach.forEach(doReset); + this._afterEach.forEach(doReset); + this._beforeAll.forEach(doReset); + this._afterAll.forEach(doReset); + }; + + /** + * Return a clone of this `Suite`. + * + * @private + * @return {Suite} + */ + Suite.prototype.clone = function () { + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.root = this.root; + suite.timeout(this.timeout()); + suite.retries(this.retries()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; + }; + + /** + * Set or get timeout `ms` or short-hand such as "2s". + * + * @private + * @todo Do not attempt to set value if `ms` is undefined + * @param {number|string} ms + * @return {Suite|number} for chaining + */ + Suite.prototype.timeout = function (ms) { + if (!arguments.length) { + return this._timeout; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + + // Clamp to range + var INT_MAX = Math.pow(2, 31) - 1; + var range = [0, INT_MAX]; + ms = clamp(ms, range); + + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; + }; + + /** + * Set or get number of times to retry a failed test. + * + * @private + * @param {number|string} n + * @return {Suite|number} for chaining + */ + Suite.prototype.retries = function (n) { + if (!arguments.length) { + return this._retries; + } + debug('retries %d', n); + this._retries = parseInt(n, 10) || 0; + return this; + }; + + /** + * Set or get slow `ms` or short-hand such as "2s". + * + * @private + * @param {number|string} ms + * @return {Suite|number} for chaining + */ + Suite.prototype.slow = function (ms) { + if (!arguments.length) { + return this._slow; + } + if (typeof ms === 'string') { + ms = milliseconds(ms); + } + debug('slow %d', ms); + this._slow = ms; + return this; + }; + + /** + * Set or get whether to bail after first error. + * + * @private + * @param {boolean} bail + * @return {Suite|number} for chaining + */ + Suite.prototype.bail = function (bail) { + if (!arguments.length) { + return this._bail; + } + debug('bail %s', bail); + this._bail = bail; + return this; + }; + + /** + * Check if this suite or its parent suite is marked as pending. + * + * @private + */ + Suite.prototype.isPending = function () { + return this.pending || (this.parent && this.parent.isPending()); + }; + + /** + * Generic hook-creator. + * @private + * @param {string} title - Title of hook + * @param {Function} fn - Hook callback + * @returns {Hook} A new hook + */ + Suite.prototype._createHook = function (title, fn) { + var hook = new Hook(title, fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.retries(this.retries()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + hook.file = this.file; + return hook; + }; + + /** + * Run `fn(test[, done])` before running tests. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.beforeAll = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"before all" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._beforeAll.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_ALL, hook); + return this; + }; + + /** + * Run `fn(test[, done])` after running tests. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.afterAll = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"after all" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._afterAll.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_ALL, hook); + return this; + }; + + /** + * Run `fn(test[, done])` before each test case. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.beforeEach = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"before each" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._beforeEach.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_EACH, hook); + return this; + }; + + /** + * Run `fn(test[, done])` after each test case. + * + * @private + * @param {string} title + * @param {Function} fn + * @return {Suite} for chaining + */ + Suite.prototype.afterEach = function (title, fn) { + if (this.isPending()) { + return this; + } + if (typeof title === 'function') { + fn = title; + title = fn.name; + } + title = '"after each" hook' + (title ? ': ' + title : ''); + + var hook = this._createHook(title, fn); + this._afterEach.push(hook); + this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_EACH, hook); + return this; + }; + + /** + * Add a test `suite`. + * + * @private + * @param {Suite} suite + * @return {Suite} for chaining + */ + Suite.prototype.addSuite = function (suite) { + suite.parent = this; + suite.root = false; + suite.timeout(this.timeout()); + suite.retries(this.retries()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit(constants.EVENT_SUITE_ADD_SUITE, suite); + return this; + }; + + /** + * Add a `test` to this suite. + * + * @private + * @param {Test} test + * @return {Suite} for chaining + */ + Suite.prototype.addTest = function (test) { + test.parent = this; + test.timeout(this.timeout()); + test.retries(this.retries()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit(constants.EVENT_SUITE_ADD_TEST, test); + return this; + }; + + /** + * Return the full title generated by recursively concatenating the parent's + * full title. + * + * @memberof Suite + * @public + * @return {string} + */ + Suite.prototype.fullTitle = function () { + return this.titlePath().join(' '); + }; + + /** + * Return the title path generated by recursively concatenating the parent's + * title path. + * + * @memberof Suite + * @public + * @return {string} + */ + Suite.prototype.titlePath = function () { + var result = []; + if (this.parent) { + result = result.concat(this.parent.titlePath()); + } + if (!this.root) { + result.push(this.title); + } + return result; + }; + + /** + * Return the total number of tests. + * + * @memberof Suite + * @public + * @return {number} + */ + Suite.prototype.total = function () { + return ( + this.suites.reduce(function (sum, suite) { + return sum + suite.total(); + }, 0) + this.tests.length + ); + }; + + /** + * Iterates through each suite recursively to find all tests. Applies a + * function in the format `fn(test)`. + * + * @private + * @param {Function} fn + * @return {Suite} + */ + Suite.prototype.eachTest = function (fn) { + this.tests.forEach(fn); + this.suites.forEach(function (suite) { + suite.eachTest(fn); + }); + return this; + }; + + /** + * This will run the root suite if we happen to be running in delayed mode. + * @private + */ + Suite.prototype.run = function run() { + if (this.root) { + this.emit(constants.EVENT_ROOT_SUITE_RUN); + } + }; + + /** + * Determines whether a suite has an `only` test or suite as a descendant. + * + * @private + * @returns {Boolean} + */ + Suite.prototype.hasOnly = function hasOnly() { + return ( + this._onlyTests.length > 0 || + this._onlySuites.length > 0 || + this.suites.some(function (suite) { + return suite.hasOnly(); + }) + ); + }; + + /** + * Filter suites based on `isOnly` logic. + * + * @private + * @returns {Boolean} + */ + Suite.prototype.filterOnly = function filterOnly() { + if (this._onlyTests.length) { + // If the suite contains `only` tests, run those and ignore any nested suites. + this.tests = this._onlyTests; + this.suites = []; + } else { + // Otherwise, do not run any of the tests in this suite. + this.tests = []; + this._onlySuites.forEach(function (onlySuite) { + // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. + // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. + if (onlySuite.hasOnly()) { + onlySuite.filterOnly(); + } + }); + // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. + var onlySuites = this._onlySuites; + this.suites = this.suites.filter(function (childSuite) { + return onlySuites.indexOf(childSuite) !== -1 || childSuite.filterOnly(); + }); + } + // Keep the suite only if there is something to run + return this.tests.length > 0 || this.suites.length > 0; + }; + + /** + * Adds a suite to the list of subsuites marked `only`. + * + * @private + * @param {Suite} suite + */ + Suite.prototype.appendOnlySuite = function (suite) { + this._onlySuites.push(suite); + }; + + /** + * Marks a suite to be `only`. + * + * @private + */ + Suite.prototype.markOnly = function () { + this.parent && this.parent.appendOnlySuite(this); + }; + + /** + * Adds a test to the list of tests marked `only`. + * + * @private + * @param {Test} test + */ + Suite.prototype.appendOnlyTest = function (test) { + this._onlyTests.push(test); + }; + + /** + * Returns the array of hooks by hook name; see `HOOK_TYPE_*` constants. + * @private + */ + Suite.prototype.getHooks = function getHooks(name) { + return this['_' + name]; + }; + + /** + * cleans all references from this suite and all child suites. + */ + Suite.prototype.dispose = function () { + this.suites.forEach(function (suite) { + suite.dispose(); + }); + this.cleanReferences(); + }; + + /** + * Cleans up the references to all the deferred functions + * (before/after/beforeEach/afterEach) and tests of a Suite. + * These must be deleted otherwise a memory leak can happen, + * as those functions may reference variables from closures, + * thus those variables can never be garbage collected as long + * as the deferred functions exist. + * + * @private + */ + Suite.prototype.cleanReferences = function cleanReferences() { + function cleanArrReferences(arr) { + for (var i = 0; i < arr.length; i++) { + delete arr[i].fn; + } + } + + if (Array.isArray(this._beforeAll)) { + cleanArrReferences(this._beforeAll); + } + + if (Array.isArray(this._beforeEach)) { + cleanArrReferences(this._beforeEach); + } + + if (Array.isArray(this._afterAll)) { + cleanArrReferences(this._afterAll); + } + + if (Array.isArray(this._afterEach)) { + cleanArrReferences(this._afterEach); + } + + for (var i = 0; i < this.tests.length; i++) { + delete this.tests[i].fn; + } + }; + + /** + * Returns an object suitable for IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ + Suite.prototype.serialize = function serialize() { + return { + _bail: this._bail, + $$fullTitle: this.fullTitle(), + $$isPending: Boolean(this.isPending()), + root: this.root, + title: this.title, + [MOCHA_ID_PROP_NAME]: this.id, + parent: this.parent ? {[MOCHA_ID_PROP_NAME]: this.parent.id} : null + }; + }; + + var constants = defineConstants( + /** + * {@link Suite}-related constants. + * @public + * @memberof Suite + * @alias constants + * @readonly + * @static + * @enum {string} + */ + { + /** + * Event emitted after a test file has been loaded. Not emitted in browser. + */ + EVENT_FILE_POST_REQUIRE: 'post-require', + /** + * Event emitted before a test file has been loaded. In browser, this is emitted once an interface has been selected. + */ + EVENT_FILE_PRE_REQUIRE: 'pre-require', + /** + * Event emitted immediately after a test file has been loaded. Not emitted in browser. + */ + EVENT_FILE_REQUIRE: 'require', + /** + * Event emitted when `global.run()` is called (use with `delay` option). + */ + EVENT_ROOT_SUITE_RUN: 'run', + + /** + * Namespace for collection of a `Suite`'s "after all" hooks. + */ + HOOK_TYPE_AFTER_ALL: 'afterAll', + /** + * Namespace for collection of a `Suite`'s "after each" hooks. + */ + HOOK_TYPE_AFTER_EACH: 'afterEach', + /** + * Namespace for collection of a `Suite`'s "before all" hooks. + */ + HOOK_TYPE_BEFORE_ALL: 'beforeAll', + /** + * Namespace for collection of a `Suite`'s "before each" hooks. + */ + HOOK_TYPE_BEFORE_EACH: 'beforeEach', + + /** + * Emitted after a child `Suite` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_SUITE: 'suite', + /** + * Emitted after an "after all" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_AFTER_ALL: 'afterAll', + /** + * Emitted after an "after each" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_AFTER_EACH: 'afterEach', + /** + * Emitted after an "before all" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_BEFORE_ALL: 'beforeAll', + /** + * Emitted after an "before each" `Hook` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_HOOK_BEFORE_EACH: 'beforeEach', + /** + * Emitted after a `Test` has been added to a `Suite`. + */ + EVENT_SUITE_ADD_TEST: 'test' + } + ); + + Suite.constants = constants; + }(suite)); + + /** + * Module dependencies. + * @private + */ + var EventEmitter = require$$0.EventEmitter; + var Pending = pending; + var utils$1 = utils$3; + var debug = browser.exports('mocha:runner'); + var Runnable$1 = runnable; + var Suite$2 = suite.exports; + var HOOK_TYPE_BEFORE_EACH = Suite$2.constants.HOOK_TYPE_BEFORE_EACH; + var HOOK_TYPE_AFTER_EACH = Suite$2.constants.HOOK_TYPE_AFTER_EACH; + var HOOK_TYPE_AFTER_ALL = Suite$2.constants.HOOK_TYPE_AFTER_ALL; + var HOOK_TYPE_BEFORE_ALL = Suite$2.constants.HOOK_TYPE_BEFORE_ALL; + var EVENT_ROOT_SUITE_RUN = Suite$2.constants.EVENT_ROOT_SUITE_RUN; + var STATE_FAILED = Runnable$1.constants.STATE_FAILED; + var STATE_PASSED = Runnable$1.constants.STATE_PASSED; + var STATE_PENDING = Runnable$1.constants.STATE_PENDING; + var stackFilter = utils$1.stackTraceFilter(); + var stringify = utils$1.stringify; + + const { + createInvalidExceptionError, + createUnsupportedError: createUnsupportedError$1, + createFatalError, + isMochaError, + constants: errorConstants + } = errors$2; + + /** + * Non-enumerable globals. + * @private + * @readonly + */ + var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date', + 'setImmediate', + 'clearImmediate' + ]; + + var constants$1 = utils$1.defineConstants( + /** + * {@link Runner}-related constants. + * @public + * @memberof Runner + * @readonly + * @alias constants + * @static + * @enum {string} + */ + { + /** + * Emitted when {@link Hook} execution begins + */ + EVENT_HOOK_BEGIN: 'hook', + /** + * Emitted when {@link Hook} execution ends + */ + EVENT_HOOK_END: 'hook end', + /** + * Emitted when Root {@link Suite} execution begins (all files have been parsed and hooks/tests are ready for execution) + */ + EVENT_RUN_BEGIN: 'start', + /** + * Emitted when Root {@link Suite} execution has been delayed via `delay` option + */ + EVENT_DELAY_BEGIN: 'waiting', + /** + * Emitted when delayed Root {@link Suite} execution is triggered by user via `global.run()` + */ + EVENT_DELAY_END: 'ready', + /** + * Emitted when Root {@link Suite} execution ends + */ + EVENT_RUN_END: 'end', + /** + * Emitted when {@link Suite} execution begins + */ + EVENT_SUITE_BEGIN: 'suite', + /** + * Emitted when {@link Suite} execution ends + */ + EVENT_SUITE_END: 'suite end', + /** + * Emitted when {@link Test} execution begins + */ + EVENT_TEST_BEGIN: 'test', + /** + * Emitted when {@link Test} execution ends + */ + EVENT_TEST_END: 'test end', + /** + * Emitted when {@link Test} execution fails + */ + EVENT_TEST_FAIL: 'fail', + /** + * Emitted when {@link Test} execution succeeds + */ + EVENT_TEST_PASS: 'pass', + /** + * Emitted when {@link Test} becomes pending + */ + EVENT_TEST_PENDING: 'pending', + /** + * Emitted when {@link Test} execution has failed, but will retry + */ + EVENT_TEST_RETRY: 'retry', + /** + * Initial state of Runner + */ + STATE_IDLE: 'idle', + /** + * State set to this value when the Runner has started running + */ + STATE_RUNNING: 'running', + /** + * State set to this value when the Runner has stopped + */ + STATE_STOPPED: 'stopped' + } + ); + + class Runner extends EventEmitter { + /** + * Initialize a `Runner` at the Root {@link Suite}, which represents a hierarchy of {@link Suite|Suites} and {@link Test|Tests}. + * + * @extends external:EventEmitter + * @public + * @class + * @param {Suite} suite - Root suite + * @param {Object} [opts] - Settings object + * @param {boolean} [opts.cleanReferencesAfterRun] - Whether to clean references to test fns and hooks when a suite is done. + * @param {boolean} [opts.delay] - Whether to delay execution of root suite until ready. + * @param {boolean} [opts.dryRun] - Whether to report tests without running them. + * @param {boolean} [opts.failZero] - Whether to fail test run if zero tests encountered. + */ + constructor(suite, opts = {}) { + super(); + + var self = this; + this._globals = []; + this._abort = false; + this.suite = suite; + this._opts = opts; + this.state = constants$1.STATE_IDLE; + this.total = suite.total(); + this.failures = 0; + /** + * @type {Map>>} + */ + this._eventListeners = new Map(); + this.on(constants$1.EVENT_TEST_END, function (test) { + if (test.type === 'test' && test.retriedTest() && test.parent) { + var idx = + test.parent.tests && test.parent.tests.indexOf(test.retriedTest()); + if (idx > -1) test.parent.tests[idx] = test; + } + self.checkGlobals(test); + }); + this.on(constants$1.EVENT_HOOK_END, function (hook) { + self.checkGlobals(hook); + }); + this._defaultGrep = /.*/; + this.grep(this._defaultGrep); + this.globals(this.globalProps()); + + this.uncaught = this._uncaught.bind(this); + this.unhandled = (reason, promise) => { + if (isMochaError(reason)) { + debug( + 'trapped unhandled rejection coming out of Mocha; forwarding to uncaught handler:', + reason + ); + this.uncaught(reason); + } else { + debug( + 'trapped unhandled rejection from (probably) user code; re-emitting on process' + ); + this._removeEventListener( + process, + 'unhandledRejection', + this.unhandled + ); + try { + process.emit('unhandledRejection', reason, promise); + } finally { + this._addEventListener(process, 'unhandledRejection', this.unhandled); + } + } + }; + } + } + + /** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @private + */ + Runner.immediately = commonjsGlobal.setImmediate || nextTick$1; + + /** + * Replacement for `target.on(eventName, listener)` that does bookkeeping to remove them when this runner instance is disposed. + * @param {EventEmitter} target - The `EventEmitter` + * @param {string} eventName - The event name + * @param {string} fn - Listener function + * @private + */ + Runner.prototype._addEventListener = function (target, eventName, listener) { + debug( + '_addEventListener(): adding for event %s; %d current listeners', + eventName, + target.listenerCount(eventName) + ); + /* istanbul ignore next */ + if ( + this._eventListeners.has(target) && + this._eventListeners.get(target).has(eventName) && + this._eventListeners.get(target).get(eventName).has(listener) + ) { + debug( + 'warning: tried to attach duplicate event listener for %s', + eventName + ); + return; + } + target.on(eventName, listener); + const targetListeners = this._eventListeners.has(target) + ? this._eventListeners.get(target) + : new Map(); + const targetEventListeners = targetListeners.has(eventName) + ? targetListeners.get(eventName) + : new Set(); + targetEventListeners.add(listener); + targetListeners.set(eventName, targetEventListeners); + this._eventListeners.set(target, targetListeners); + }; + + /** + * Replacement for `target.removeListener(eventName, listener)` that also updates the bookkeeping. + * @param {EventEmitter} target - The `EventEmitter` + * @param {string} eventName - The event name + * @param {function} listener - Listener function + * @private + */ + Runner.prototype._removeEventListener = function (target, eventName, listener) { + target.removeListener(eventName, listener); + + if (this._eventListeners.has(target)) { + const targetListeners = this._eventListeners.get(target); + if (targetListeners.has(eventName)) { + const targetEventListeners = targetListeners.get(eventName); + targetEventListeners.delete(listener); + if (!targetEventListeners.size) { + targetListeners.delete(eventName); + } + } + if (!targetListeners.size) { + this._eventListeners.delete(target); + } + } else { + debug('trying to remove listener for untracked object %s', target); + } + }; + + /** + * Removes all event handlers set during a run on this instance. + * Remark: this does _not_ clean/dispose the tests or suites themselves. + */ + Runner.prototype.dispose = function () { + this.removeAllListeners(); + this._eventListeners.forEach((targetListeners, target) => { + targetListeners.forEach((targetEventListeners, eventName) => { + targetEventListeners.forEach(listener => { + target.removeListener(eventName, listener); + }); + }); + }); + this._eventListeners.clear(); + }; + + /** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @public + * @memberof Runner + * @param {RegExp} re + * @param {boolean} invert + * @return {Runner} Runner instance. + */ + Runner.prototype.grep = function (re, invert) { + debug('grep(): setting to %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; + }; + + /** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @memberof Runner + * @public + * @param {Suite} suite + * @return {number} + */ + Runner.prototype.grepTotal = function (suite) { + var self = this; + var total = 0; + + suite.eachTest(function (test) { + var match = self._grep.test(test.fullTitle()); + if (self._invert) { + match = !match; + } + if (match) { + total++; + } + }); + + return total; + }; + + /** + * Return a list of global properties. + * + * @return {Array} + * @private + */ + Runner.prototype.globalProps = function () { + var props = Object.keys(commonjsGlobal); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~props.indexOf(globals[i])) { + continue; + } + props.push(globals[i]); + } + + return props; + }; + + /** + * Allow the given `arr` of globals. + * + * @public + * @memberof Runner + * @param {Array} arr + * @return {Runner} Runner instance. + */ + Runner.prototype.globals = function (arr) { + if (!arguments.length) { + return this._globals; + } + debug('globals(): setting to %O', arr); + this._globals = this._globals.concat(arr); + return this; + }; + + /** + * Check for global variable leaks. + * + * @private + */ + Runner.prototype.checkGlobals = function (test) { + if (!this.checkLeaks) { + return; + } + var ok = this._globals; + + var globals = this.globalProps(); + var leaks; + + if (test) { + ok = ok.concat(test._allowedGlobals || []); + } + + if (this.prevGlobalsLength === globals.length) { + return; + } + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length) { + var msg = `global leak(s) detected: ${leaks.map(e => `'${e}'`).join(', ')}`; + this.fail(test, new Error(msg)); + } + }; + + /** + * Fail the given `test`. + * + * If `test` is a hook, failures work in the following pattern: + * - If bail, run corresponding `after each` and `after` hooks, + * then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @private + * @param {Runnable} test + * @param {Error} err + * @param {boolean} [force=false] - Whether to fail a pending test. + */ + Runner.prototype.fail = function (test, err, force) { + force = force === true; + if (test.isPending() && !force) { + return; + } + if (this.state === constants$1.STATE_STOPPED) { + if (err.code === errorConstants.MULTIPLE_DONE) { + throw err; + } + throw createFatalError( + 'Test failed after root suite execution completed!', + err + ); + } + + ++this.failures; + debug('total number of failures: %d', this.failures); + test.state = STATE_FAILED; + + if (!isError(err)) { + err = thrown2Error(err); + } + + try { + err.stack = + this.fullStackTrace || !err.stack ? err.stack : stackFilter(err.stack); + } catch (ignore) { + // some environments do not take kindly to monkeying with the stack + } + + this.emit(constants$1.EVENT_TEST_FAIL, test, err); + }; + + /** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @private + * @param {string} name + * @param {Function} fn + */ + + Runner.prototype.hook = function (name, fn) { + if (this._opts.dryRun) return fn(); + + var suite = this.suite; + var hooks = suite.getHooks(name); + var self = this; + + function next(i) { + var hook = hooks[i]; + if (!hook) { + return fn(); + } + self.currentRunnable = hook; + + if (name === HOOK_TYPE_BEFORE_ALL) { + hook.ctx.currentTest = hook.parent.tests[0]; + } else if (name === HOOK_TYPE_AFTER_ALL) { + hook.ctx.currentTest = hook.parent.tests[hook.parent.tests.length - 1]; + } else { + hook.ctx.currentTest = self.test; + } + + setHookTitle(hook); + + hook.allowUncaught = self.allowUncaught; + + self.emit(constants$1.EVENT_HOOK_BEGIN, hook); + + if (!hook.listeners('error').length) { + self._addEventListener(hook, 'error', function (err) { + self.fail(hook, err); + }); + } + + hook.run(function cbHookRun(err) { + var testError = hook.error(); + if (testError) { + self.fail(self.test, testError); + } + // conditional skip + if (hook.pending) { + if (name === HOOK_TYPE_AFTER_EACH) { + // TODO define and implement use case + if (self.test) { + self.test.pending = true; + } + } else if (name === HOOK_TYPE_BEFORE_EACH) { + if (self.test) { + self.test.pending = true; + } + self.emit(constants$1.EVENT_HOOK_END, hook); + hook.pending = false; // activates hook for next test + return fn(new Error('abort hookDown')); + } else if (name === HOOK_TYPE_BEFORE_ALL) { + suite.tests.forEach(function (test) { + test.pending = true; + }); + suite.suites.forEach(function (suite) { + suite.pending = true; + }); + hooks = []; + } else { + hook.pending = false; + var errForbid = createUnsupportedError$1('`this.skip` forbidden'); + self.fail(hook, errForbid); + return fn(errForbid); + } + } else if (err) { + self.fail(hook, err); + // stop executing hooks, notify callee of hook err + return fn(err); + } + self.emit(constants$1.EVENT_HOOK_END, hook); + delete hook.ctx.currentTest; + setHookTitle(hook); + next(++i); + }); + + function setHookTitle(hook) { + hook.originalTitle = hook.originalTitle || hook.title; + if (hook.ctx && hook.ctx.currentTest) { + hook.title = `${hook.originalTitle} for "${hook.ctx.currentTest.title}"`; + } else { + var parentTitle; + if (hook.parent.title) { + parentTitle = hook.parent.title; + } else { + parentTitle = hook.parent.root ? '{root}' : ''; + } + hook.title = `${hook.originalTitle} in "${parentTitle}"`; + } + } + } + + Runner.immediately(function () { + next(0); + }); + }; + + /** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @private + * @param {string} name + * @param {Array} suites + * @param {Function} fn + */ + Runner.prototype.hooks = function (name, suites, fn) { + var self = this; + var orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function (err) { + if (err) { + var errSuite = self.suite; + self.suite = orig; + return fn(err, errSuite); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); + }; + + /** + * Run 'afterEach' hooks from bottom up. + * + * @param {String} name + * @param {Function} fn + * @private + */ + Runner.prototype.hookUp = function (name, fn) { + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); + }; + + /** + * Run 'beforeEach' hooks from top level down. + * + * @param {String} name + * @param {Function} fn + * @private + */ + Runner.prototype.hookDown = function (name, fn) { + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); + }; + + /** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @private + */ + Runner.prototype.parents = function () { + var suite = this.suite; + var suites = []; + while (suite.parent) { + suite = suite.parent; + suites.push(suite); + } + return suites; + }; + + /** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @private + */ + Runner.prototype.runTest = function (fn) { + if (this._opts.dryRun) return Runner.immediately(fn); + + var self = this; + var test = this.test; + + if (!test) { + return; + } + + if (this.asyncOnly) { + test.asyncOnly = true; + } + this._addEventListener(test, 'error', function (err) { + self.fail(test, err); + }); + if (this.allowUncaught) { + test.allowUncaught = true; + return test.run(fn); + } + try { + test.run(fn); + } catch (err) { + fn(err); + } + }; + + /** + * Run tests in the given `suite` and invoke the callback `fn()` when complete. + * + * @private + * @param {Suite} suite + * @param {Function} fn + */ + Runner.prototype.runTests = function (suite, fn) { + var self = this; + var tests = suite.tests.slice(); + var test; + + function hookErr(_, errSuite, after) { + // before/after Each hook for errSuite failed: + var orig = self.suite; + + // for failed 'after each' hook start from errSuite parent, + // otherwise start from errSuite itself + self.suite = after ? errSuite.parent : errSuite; + + if (self.suite) { + self.hookUp(HOOK_TYPE_AFTER_EACH, function (err2, errSuite2) { + self.suite = orig; + // some hooks may fail even now + if (err2) { + return hookErr(err2, errSuite2, true); + } + // report error suite + fn(errSuite); + }); + } else { + // there is no need calling other 'after each' hooks + self.suite = orig; + fn(errSuite); + } + } + + function next(err, errSuite) { + // if we bail after first err + if (self.failures && suite._bail) { + tests = []; + } + + if (self._abort) { + return fn(); + } + + if (err) { + return hookErr(err, errSuite, true); + } + + // next test + test = tests.shift(); + + // all done + if (!test) { + return fn(); + } + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) { + match = !match; + } + if (!match) { + // Run immediately only if we have defined a grep. When we + // define a grep — It can cause maximum callstack error if + // the grep is doing a large recursive loop by neglecting + // all tests. The run immediately function also comes with + // a performance cost. So we don't want to run immediately + // if we run the whole test suite, because running the whole + // test suite don't do any immediate recursive loops. Thus, + // allowing a JS runtime to breathe. + if (self._grep !== self._defaultGrep) { + Runner.immediately(next); + } else { + next(); + } + return; + } + + // static skip, no hooks are executed + if (test.isPending()) { + if (self.forbidPending) { + self.fail(test, new Error('Pending test forbidden'), true); + } else { + test.state = STATE_PENDING; + self.emit(constants$1.EVENT_TEST_PENDING, test); + } + self.emit(constants$1.EVENT_TEST_END, test); + return next(); + } + + // execute test and hook(s) + self.emit(constants$1.EVENT_TEST_BEGIN, (self.test = test)); + self.hookDown(HOOK_TYPE_BEFORE_EACH, function (err, errSuite) { + // conditional skip within beforeEach + if (test.isPending()) { + if (self.forbidPending) { + self.fail(test, new Error('Pending test forbidden'), true); + } else { + test.state = STATE_PENDING; + self.emit(constants$1.EVENT_TEST_PENDING, test); + } + self.emit(constants$1.EVENT_TEST_END, test); + // skip inner afterEach hooks below errSuite level + var origSuite = self.suite; + self.suite = errSuite || self.suite; + return self.hookUp(HOOK_TYPE_AFTER_EACH, function (e, eSuite) { + self.suite = origSuite; + next(e, eSuite); + }); + } + if (err) { + return hookErr(err, errSuite, false); + } + self.currentRunnable = self.test; + self.runTest(function (err) { + test = self.test; + // conditional skip within it + if (test.pending) { + if (self.forbidPending) { + self.fail(test, new Error('Pending test forbidden'), true); + } else { + test.state = STATE_PENDING; + self.emit(constants$1.EVENT_TEST_PENDING, test); + } + self.emit(constants$1.EVENT_TEST_END, test); + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } else if (err) { + var retry = test.currentRetry(); + if (retry < test.retries()) { + var clonedTest = test.clone(); + clonedTest.currentRetry(retry + 1); + tests.unshift(clonedTest); + + self.emit(constants$1.EVENT_TEST_RETRY, test, err); + + // Early return + hook trigger so that it doesn't + // increment the count wrong + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } else { + self.fail(test, err); + } + self.emit(constants$1.EVENT_TEST_END, test); + return self.hookUp(HOOK_TYPE_AFTER_EACH, next); + } + + test.state = STATE_PASSED; + self.emit(constants$1.EVENT_TEST_PASS, test); + self.emit(constants$1.EVENT_TEST_END, test); + self.hookUp(HOOK_TYPE_AFTER_EACH, next); + }); + }); + } + + this.next = next; + this.hookErr = hookErr; + next(); + }; + + /** + * Run the given `suite` and invoke the callback `fn()` when complete. + * + * @private + * @param {Suite} suite + * @param {Function} fn + */ + Runner.prototype.runSuite = function (suite, fn) { + var i = 0; + var self = this; + var total = this.grepTotal(suite); + + debug('runSuite(): running %s', suite.fullTitle()); + + if (!total || (self.failures && suite._bail)) { + debug('runSuite(): bailing'); + return fn(); + } + + this.emit(constants$1.EVENT_SUITE_BEGIN, (this.suite = suite)); + + function next(errSuite) { + if (errSuite) { + // current suite failed on a hook from errSuite + if (errSuite === suite) { + // if errSuite is current suite + // continue to the next sibling suite + return done(); + } + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); + } + + if (self._abort) { + return done(); + } + + var curr = suite.suites[i++]; + if (!curr) { + return done(); + } + + // Avoid grep neglecting large number of tests causing a + // huge recursive loop and thus a maximum call stack error. + // See comment in `this.runTests()` for more information. + if (self._grep !== self._defaultGrep) { + Runner.immediately(function () { + self.runSuite(curr, next); + }); + } else { + self.runSuite(curr, next); + } + } + + function done(errSuite) { + self.suite = suite; + self.nextSuite = next; + + // remove reference to test + delete self.test; + + self.hook(HOOK_TYPE_AFTER_ALL, function () { + self.emit(constants$1.EVENT_SUITE_END, suite); + fn(errSuite); + }); + } + + this.nextSuite = next; + + this.hook(HOOK_TYPE_BEFORE_ALL, function (err) { + if (err) { + return done(); + } + self.runTests(suite, next); + }); + }; + + /** + * Handle uncaught exceptions within runner. + * + * This function is bound to the instance as `Runner#uncaught` at instantiation + * time. It's intended to be listening on the `Process.uncaughtException` event. + * In order to not leak EE listeners, we need to ensure no more than a single + * `uncaughtException` listener exists per `Runner`. The only way to do + * this--because this function needs the context (and we don't have lambdas)--is + * to use `Function.prototype.bind`. We need strict equality to unregister and + * _only_ unregister the _one_ listener we set from the + * `Process.uncaughtException` event; would be poor form to just remove + * everything. See {@link Runner#run} for where the event listener is registered + * and unregistered. + * @param {Error} err - Some uncaught error + * @private + */ + Runner.prototype._uncaught = function (err) { + // this is defensive to prevent future developers from mis-calling this function. + // it's more likely that it'd be called with the incorrect context--say, the global + // `process` object--than it would to be called with a context that is not a "subclass" + // of `Runner`. + if (!(this instanceof Runner)) { + throw createFatalError( + 'Runner#uncaught() called with invalid context', + this + ); + } + if (err instanceof Pending) { + debug('uncaught(): caught a Pending'); + return; + } + // browser does not exit script when throwing in global.onerror() + if (this.allowUncaught && !utils$1.isBrowser()) { + debug('uncaught(): bubbling exception due to --allow-uncaught'); + throw err; + } + + if (this.state === constants$1.STATE_STOPPED) { + debug('uncaught(): throwing after run has completed!'); + throw err; + } + + if (err) { + debug('uncaught(): got truthy exception %O', err); + } else { + debug('uncaught(): undefined/falsy exception'); + err = createInvalidExceptionError( + 'Caught falsy/undefined exception which would otherwise be uncaught. No stack trace found; try a debugger', + err + ); + } + + if (!isError(err)) { + err = thrown2Error(err); + debug('uncaught(): converted "error" %o to Error', err); + } + err.uncaught = true; + + var runnable = this.currentRunnable; + + if (!runnable) { + runnable = new Runnable$1('Uncaught error outside test suite'); + debug('uncaught(): no current Runnable; created a phony one'); + runnable.parent = this.suite; + + if (this.state === constants$1.STATE_RUNNING) { + debug('uncaught(): failing gracefully'); + this.fail(runnable, err); + } else { + // Can't recover from this failure + debug('uncaught(): test run has not yet started; unrecoverable'); + this.emit(constants$1.EVENT_RUN_BEGIN); + this.fail(runnable, err); + this.emit(constants$1.EVENT_RUN_END); + } + + return; + } + + runnable.clearTimeout(); + + if (runnable.isFailed()) { + debug('uncaught(): Runnable has already failed'); + // Ignore error if already failed + return; + } else if (runnable.isPending()) { + debug('uncaught(): pending Runnable wound up failing!'); + // report 'pending test' retrospectively as failed + this.fail(runnable, err, true); + return; + } + + // we cannot recover gracefully if a Runnable has already passed + // then fails asynchronously + if (runnable.isPassed()) { + debug('uncaught(): Runnable has already passed; bailing gracefully'); + this.fail(runnable, err); + this.abort(); + } else { + debug('uncaught(): forcing Runnable to complete with Error'); + return runnable.callback(err); + } + }; + + /** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @public + * @memberof Runner + * @param {Function} fn - Callback when finished + * @param {Object} [opts] - For subclasses + * @param {string[]} opts.files - Files to run + * @param {Options} opts.options - command-line options + * @returns {Runner} Runner instance. + */ + Runner.prototype.run = function (fn, opts = {}) { + var rootSuite = this.suite; + var options = opts.options || {}; + + debug('run(): got options: %O', options); + fn = fn || function () {}; + + const end = () => { + if (!this.total && this._opts.failZero) this.failures = 1; + + debug('run(): root suite completed; emitting %s', constants$1.EVENT_RUN_END); + this.emit(constants$1.EVENT_RUN_END); + }; + + const begin = () => { + debug('run(): emitting %s', constants$1.EVENT_RUN_BEGIN); + this.emit(constants$1.EVENT_RUN_BEGIN); + debug('run(): emitted %s', constants$1.EVENT_RUN_BEGIN); + + this.runSuite(rootSuite, end); + }; + + const prepare = () => { + debug('run(): starting'); + // If there is an `only` filter + if (rootSuite.hasOnly()) { + rootSuite.filterOnly(); + debug('run(): filtered exclusive Runnables'); + } + this.state = constants$1.STATE_RUNNING; + if (this._opts.delay) { + this.emit(constants$1.EVENT_DELAY_END); + debug('run(): "delay" ended'); + } + + return begin(); + }; + + // references cleanup to avoid memory leaks + if (this._opts.cleanReferencesAfterRun) { + this.on(constants$1.EVENT_SUITE_END, suite => { + suite.cleanReferences(); + }); + } + + // callback + this.on(constants$1.EVENT_RUN_END, function () { + this.state = constants$1.STATE_STOPPED; + debug('run(): emitted %s', constants$1.EVENT_RUN_END); + fn(this.failures); + }); + + this._removeEventListener(process, 'uncaughtException', this.uncaught); + this._removeEventListener(process, 'unhandledRejection', this.unhandled); + this._addEventListener(process, 'uncaughtException', this.uncaught); + this._addEventListener(process, 'unhandledRejection', this.unhandled); + + if (this._opts.delay) { + // for reporters, I guess. + // might be nice to debounce some dots while we wait. + this.emit(constants$1.EVENT_DELAY_BEGIN, rootSuite); + rootSuite.once(EVENT_ROOT_SUITE_RUN, prepare); + debug('run(): waiting for green light due to --delay'); + } else { + Runner.immediately(prepare); + } + + return this; + }; + + /** + * Toggle partial object linking behavior; used for building object references from + * unique ID's. Does nothing in serial mode, because the object references already exist. + * Subclasses can implement this (e.g., `ParallelBufferedRunner`) + * @abstract + * @param {boolean} [value] - If `true`, enable partial object linking, otherwise disable + * @returns {Runner} + * @chainable + * @public + * @example + * // this reporter needs proper object references when run in parallel mode + * class MyReporter() { + * constructor(runner) { + * this.runner.linkPartialObjects(true) + * .on(EVENT_SUITE_BEGIN, suite => { + // this Suite may be the same object... + * }) + * .on(EVENT_TEST_BEGIN, test => { + * // ...as the `test.parent` property + * }); + * } + * } + */ + Runner.prototype.linkPartialObjects = function (value) { + return this; + }; + + /* + * Like {@link Runner#run}, but does not accept a callback and returns a `Promise` instead of a `Runner`. + * This function cannot reject; an `unhandledRejection` event will bubble up to the `process` object instead. + * @public + * @memberof Runner + * @param {Object} [opts] - Options for {@link Runner#run} + * @returns {Promise} Failure count + */ + Runner.prototype.runAsync = async function runAsync(opts = {}) { + return new Promise(resolve => { + this.run(resolve, opts); + }); + }; + + /** + * Cleanly abort execution. + * + * @memberof Runner + * @public + * @return {Runner} Runner instance. + */ + Runner.prototype.abort = function () { + debug('abort(): aborting'); + this._abort = true; + + return this; + }; + + /** + * Returns `true` if Mocha is running in parallel mode. For reporters. + * + * Subclasses should return an appropriate value. + * @public + * @returns {false} + */ + Runner.prototype.isParallelMode = function isParallelMode() { + return false; + }; + + /** + * Configures an alternate reporter for worker processes to use. Subclasses + * using worker processes should implement this. + * @public + * @param {string} path - Absolute path to alternate reporter for worker processes to use + * @returns {Runner} + * @throws When in serial mode + * @chainable + * @abstract + */ + Runner.prototype.workerReporter = function () { + throw createUnsupportedError$1('workerReporter() not supported in serial mode'); + }; + + /** + * Filter leaks with the given globals flagged as `ok`. + * + * @private + * @param {Array} ok + * @param {Array} globals + * @return {Array} + */ + function filterLeaks(ok, globals) { + return globals.filter(function (key) { + // Firefox and Chrome exposes iframes as index inside the window object + if (/^\d+/.test(key)) { + return false; + } + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method + // not init at first it is assigned in some seconds + if (commonjsGlobal.navigator && /^getInterface/.test(key)) { + return false; + } + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (commonjsGlobal.navigator && /^\d+/.test(key)) { + return false; + } + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) { + return false; + } + + var matched = ok.filter(function (ok) { + if (~ok.indexOf('*')) { + return key.indexOf(ok.split('*')[0]) === 0; + } + return key === ok; + }); + return !matched.length && (!commonjsGlobal.navigator || key !== 'onerror'); + }); + } + + /** + * Check if argument is an instance of Error object or a duck-typed equivalent. + * + * @private + * @param {Object} err - object to check + * @param {string} err.message - error message + * @returns {boolean} + */ + function isError(err) { + return err instanceof Error || (err && typeof err.message === 'string'); + } + + /** + * + * Converts thrown non-extensible type into proper Error. + * + * @private + * @param {*} thrown - Non-extensible type thrown by code + * @return {Error} + */ + function thrown2Error(err) { + return new Error( + `the ${utils$1.canonicalType(err)} ${stringify( + err + )} was thrown, throw an Error :)` + ); + } + + Runner.constants = constants$1; + + /** + * Node.js' `EventEmitter` + * @external EventEmitter + * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter} + */ + + var runner = Runner; + + (function (module, exports) { + /** + * @module Base + */ + /** + * Module dependencies. + */ + + var diff = lib; + var milliseconds = ms$1; + var utils = utils$3; + var supportsColor = require$$18; + var symbols = browser$1; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + + const isBrowser = utils.isBrowser(); + + function getBrowserWindowSize() { + if ('innerHeight' in commonjsGlobal) { + return [commonjsGlobal.innerHeight, commonjsGlobal.innerWidth]; + } + // In a Web Worker, the DOM Window is not available. + return [640, 480]; + } + + /** + * Expose `Base`. + */ + + exports = module.exports = Base; + + /** + * Check if both stdio streams are associated with a tty. + */ + + var isatty = isBrowser || (process.stdout.isTTY && process.stderr.isTTY); + + /** + * Save log references to avoid tests interfering (see GH-3604). + */ + var consoleLog = console.log; + + /** + * Enable coloring by default, except in the browser interface. + */ + + exports.useColors = + !isBrowser && + (supportsColor.stdout || process.env.MOCHA_COLORS !== undefined); + + /** + * Inline diffs instead of +/- + */ + + exports.inlineDiffs = false; + + /** + * Truncate diffs longer than this value to avoid slow performance + */ + exports.maxDiffSize = 8192; + + /** + * Default color map. + */ + + exports.colors = { + pass: 90, + fail: 31, + 'bright pass': 92, + 'bright fail': 91, + 'bright yellow': 93, + pending: 36, + suite: 0, + 'error title': 0, + 'error message': 31, + 'error stack': 90, + checkmark: 32, + fast: 90, + medium: 33, + slow: 31, + green: 32, + light: 90, + 'diff gutter': 90, + 'diff added': 32, + 'diff removed': 31, + 'diff added inline': '30;42', + 'diff removed inline': '30;41' + }; + + /** + * Default symbol map. + */ + + exports.symbols = { + ok: symbols.success, + err: symbols.error, + dot: '.', + comma: ',', + bang: '!' + }; + + /** + * Color `str` with the given `type`, + * allowing colors to be disabled, + * as well as user-defined color + * schemes. + * + * @private + * @param {string} type + * @param {string} str + * @return {string} + */ + var color = (exports.color = function (type, str) { + if (!exports.useColors) { + return String(str); + } + return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; + }); + + /** + * Expose term window size, with some defaults for when stderr is not a tty. + */ + + exports.window = { + width: 75 + }; + + if (isatty) { + if (isBrowser) { + exports.window.width = getBrowserWindowSize()[1]; + } else { + exports.window.width = process.stdout.getWindowSize(1)[0]; + } + } + + /** + * Expose some basic cursor interactions that are common among reporters. + */ + + exports.cursor = { + hide: function () { + isatty && process.stdout.write('\u001b[?25l'); + }, + + show: function () { + isatty && process.stdout.write('\u001b[?25h'); + }, + + deleteLine: function () { + isatty && process.stdout.write('\u001b[2K'); + }, + + beginningOfLine: function () { + isatty && process.stdout.write('\u001b[0G'); + }, + + CR: function () { + if (isatty) { + exports.cursor.deleteLine(); + exports.cursor.beginningOfLine(); + } else { + process.stdout.write('\r'); + } + } + }; + + var showDiff = (exports.showDiff = function (err) { + return ( + err && + err.showDiff !== false && + sameType(err.actual, err.expected) && + err.expected !== undefined + ); + }); + + function stringifyDiffObjs(err) { + if (!utils.isString(err.actual) || !utils.isString(err.expected)) { + err.actual = utils.stringify(err.actual); + err.expected = utils.stringify(err.expected); + } + } + + /** + * Returns a diff between 2 strings with coloured ANSI output. + * + * @description + * The diff will be either inline or unified dependent on the value + * of `Base.inlineDiff`. + * + * @param {string} actual + * @param {string} expected + * @return {string} Diff + */ + + var generateDiff = (exports.generateDiff = function (actual, expected) { + try { + var maxLen = exports.maxDiffSize; + var skipped = 0; + if (maxLen > 0) { + skipped = Math.max(actual.length - maxLen, expected.length - maxLen); + actual = actual.slice(0, maxLen); + expected = expected.slice(0, maxLen); + } + let result = exports.inlineDiffs + ? inlineDiff(actual, expected) + : unifiedDiff(actual, expected); + if (skipped > 0) { + result = `${result}\n [mocha] output truncated to ${maxLen} characters, see "maxDiffSize" reporter-option\n`; + } + return result; + } catch (err) { + var msg = + '\n ' + + color('diff added', '+ expected') + + ' ' + + color('diff removed', '- actual: failed to generate Mocha diff') + + '\n'; + return msg; + } + }); + + /** + * Outputs the given `failures` as a list. + * + * @public + * @memberof Mocha.reporters.Base + * @variation 1 + * @param {Object[]} failures - Each is Test instance with corresponding + * Error property + */ + exports.list = function (failures) { + var multipleErr, multipleTest; + Base.consoleLog(); + failures.forEach(function (test, i) { + // format + var fmt = + color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); + + // msg + var msg; + var err; + if (test.err && test.err.multiple) { + if (multipleTest !== test) { + multipleTest = test; + multipleErr = [test.err].concat(test.err.multiple); + } + err = multipleErr.shift(); + } else { + err = test.err; + } + var message; + if (typeof err.inspect === 'function') { + message = err.inspect() + ''; + } else if (err.message && typeof err.message.toString === 'function') { + message = err.message + ''; + } else { + message = ''; + } + var stack = err.stack || message; + var index = message ? stack.indexOf(message) : -1; + + if (index === -1) { + msg = message; + } else { + index += message.length; + msg = stack.slice(0, index); + // remove msg from stack + stack = stack.slice(index + 1); + } + + // uncaught + if (err.uncaught) { + msg = 'Uncaught ' + msg; + } + // explicitly show diff + if (!exports.hideDiff && showDiff(err)) { + stringifyDiffObjs(err); + fmt = + color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); + var match = message.match(/^([^:]+): expected/); + msg = '\n ' + color('error message', match ? match[1] : msg); + + msg += generateDiff(err.actual, err.expected); + } + + // indent stack trace + stack = stack.replace(/^/gm, ' '); + + // indented test title + var testTitle = ''; + test.titlePath().forEach(function (str, index) { + if (index !== 0) { + testTitle += '\n '; + } + for (var i = 0; i < index; i++) { + testTitle += ' '; + } + testTitle += str; + }); + + Base.consoleLog(fmt, i + 1, testTitle, msg, stack); + }); + }; + + /** + * Constructs a new `Base` reporter instance. + * + * @description + * All other reporters generally inherit from this reporter. + * + * @public + * @class + * @memberof Mocha.reporters + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Base(runner, options) { + var failures = (this.failures = []); + + if (!runner) { + throw new TypeError('Missing runner argument'); + } + this.options = options || {}; + this.runner = runner; + this.stats = runner.stats; // assigned so Reporters keep a closer reference + + var maxDiffSizeOpt = + this.options.reporterOption && this.options.reporterOption.maxDiffSize; + if (maxDiffSizeOpt !== undefined && !isNaN(Number(maxDiffSizeOpt))) { + exports.maxDiffSize = Number(maxDiffSizeOpt); + } + + runner.on(EVENT_TEST_PASS, function (test) { + if (test.duration > test.slow()) { + test.speed = 'slow'; + } else if (test.duration > test.slow() / 2) { + test.speed = 'medium'; + } else { + test.speed = 'fast'; + } + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + if (showDiff(err)) { + stringifyDiffObjs(err); + } + // more than one error per test + if (test.err && err instanceof Error) { + test.err.multiple = (test.err.multiple || []).concat(err); + } else { + test.err = err; + } + failures.push(test); + }); + } + + /** + * Outputs common epilogue used by many of the bundled reporters. + * + * @public + * @memberof Mocha.reporters + */ + Base.prototype.epilogue = function () { + var stats = this.stats; + var fmt; + + Base.consoleLog(); + + // passes + fmt = + color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); + + Base.consoleLog(fmt, stats.passes || 0, milliseconds(stats.duration)); + + // pending + if (stats.pending) { + fmt = color('pending', ' ') + color('pending', ' %d pending'); + + Base.consoleLog(fmt, stats.pending); + } + + // failures + if (stats.failures) { + fmt = color('fail', ' %d failing'); + + Base.consoleLog(fmt, stats.failures); + + Base.list(this.failures); + Base.consoleLog(); + } + + Base.consoleLog(); + }; + + /** + * Pads the given `str` to `len`. + * + * @private + * @param {string} str + * @param {string} len + * @return {string} + */ + function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; + } + + /** + * Returns inline diff between 2 strings with coloured ANSI output. + * + * @private + * @param {String} actual + * @param {String} expected + * @return {string} Diff + */ + function inlineDiff(actual, expected) { + var msg = errorDiff(actual, expected); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines + .map(function (str, i) { + return pad(++i, width) + ' |' + ' ' + str; + }) + .join('\n'); + } + + // legend + msg = + '\n' + + color('diff removed inline', 'actual') + + ' ' + + color('diff added inline', 'expected') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + return msg; + } + + /** + * Returns unified diff between two strings with coloured ANSI output. + * + * @private + * @param {String} actual + * @param {String} expected + * @return {string} The diff. + */ + function unifiedDiff(actual, expected) { + var indent = ' '; + function cleanUp(line) { + if (line[0] === '+') { + return indent + colorLines('diff added', line); + } + if (line[0] === '-') { + return indent + colorLines('diff removed', line); + } + if (line.match(/@@/)) { + return '--'; + } + if (line.match(/\\ No newline/)) { + return null; + } + return indent + line; + } + function notBlank(line) { + return typeof line !== 'undefined' && line !== null; + } + var msg = diff.createPatch('string', actual, expected); + var lines = msg.split('\n').splice(5); + return ( + '\n ' + + colorLines('diff added', '+ expected') + + ' ' + + colorLines('diff removed', '- actual') + + '\n\n' + + lines.map(cleanUp).filter(notBlank).join('\n') + ); + } + + /** + * Returns character diff for `err`. + * + * @private + * @param {String} actual + * @param {String} expected + * @return {string} the diff + */ + function errorDiff(actual, expected) { + return diff + .diffWordsWithSpace(actual, expected) + .map(function (str) { + if (str.added) { + return colorLines('diff added inline', str.value); + } + if (str.removed) { + return colorLines('diff removed inline', str.value); + } + return str.value; + }) + .join(''); + } + + /** + * Colors lines for `str`, using the color `name`. + * + * @private + * @param {string} name + * @param {string} str + * @return {string} + */ + function colorLines(name, str) { + return str + .split('\n') + .map(function (str) { + return color(name, str); + }) + .join('\n'); + } + + /** + * Object#toString reference. + */ + var objToString = Object.prototype.toString; + + /** + * Checks that a / b have the same type. + * + * @private + * @param {Object} a + * @param {Object} b + * @return {boolean} + */ + function sameType(a, b) { + return objToString.call(a) === objToString.call(b); + } + + Base.consoleLog = consoleLog; + + Base.abstract = true; + }(base$1, base$1.exports)); + + var dot = {exports: {}}; + + (function (module, exports) { + /** + * @module Dot + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_RUN_END = constants.EVENT_RUN_END; + + /** + * Expose `Dot`. + */ + + module.exports = Dot; + + /** + * Constructs a new `Dot` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Dot(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.75) | 0; + var n = -1; + + runner.on(EVENT_RUN_BEGIN, function () { + process.stdout.write('\n'); + }); + + runner.on(EVENT_TEST_PENDING, function () { + if (++n % width === 0) { + process.stdout.write('\n '); + } + process.stdout.write(Base.color('pending', Base.symbols.comma)); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + if (++n % width === 0) { + process.stdout.write('\n '); + } + if (test.speed === 'slow') { + process.stdout.write(Base.color('bright yellow', Base.symbols.dot)); + } else { + process.stdout.write(Base.color(test.speed, Base.symbols.dot)); + } + }); + + runner.on(EVENT_TEST_FAIL, function () { + if (++n % width === 0) { + process.stdout.write('\n '); + } + process.stdout.write(Base.color('fail', Base.symbols.bang)); + }); + + runner.once(EVENT_RUN_END, function () { + process.stdout.write('\n'); + self.epilogue(); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Dot, Base); + + Dot.description = 'dot matrix representation'; + }(dot)); + + var doc = {exports: {}}; + + (function (module, exports) { + /** + * @module Doc + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + + /** + * Expose `Doc`. + */ + + module.exports = Doc; + + /** + * Constructs a new `Doc` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Doc(runner, options) { + Base.call(this, runner, options); + + var indents = 2; + + function indent() { + return Array(indents).join(' '); + } + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + if (suite.root) { + return; + } + ++indents; + Base.consoleLog('%s
', indent()); + ++indents; + Base.consoleLog('%s

%s

', indent(), utils.escape(suite.title)); + Base.consoleLog('%s
', indent()); + }); + + runner.on(EVENT_SUITE_END, function (suite) { + if (suite.root) { + return; + } + Base.consoleLog('%s
', indent()); + --indents; + Base.consoleLog('%s
', indent()); + --indents; + }); + + runner.on(EVENT_TEST_PASS, function (test) { + Base.consoleLog('%s
%s
', indent(), utils.escape(test.title)); + Base.consoleLog('%s
%s
', indent(), utils.escape(test.file)); + var code = utils.escape(utils.clean(test.body)); + Base.consoleLog('%s
%s
', indent(), code); + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + Base.consoleLog( + '%s
%s
', + indent(), + utils.escape(test.title) + ); + Base.consoleLog( + '%s
%s
', + indent(), + utils.escape(test.file) + ); + var code = utils.escape(utils.clean(test.body)); + Base.consoleLog( + '%s
%s
', + indent(), + code + ); + Base.consoleLog( + '%s
%s
', + indent(), + utils.escape(err) + ); + }); + } + + Doc.description = 'HTML documentation'; + }(doc)); + + var tap = {exports: {}}; + + (function (module, exports) { + /** + * @module TAP + */ + /** + * Module dependencies. + */ + + var util = require$$0$1; + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var inherits = utils$3.inherits; + var sprintf = util.format; + + /** + * Expose `TAP`. + */ + + module.exports = TAP; + + /** + * Constructs a new `TAP` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function TAP(runner, options) { + Base.call(this, runner, options); + + var self = this; + var n = 1; + + var tapVersion = '12'; + if (options && options.reporterOptions) { + if (options.reporterOptions.tapVersion) { + tapVersion = options.reporterOptions.tapVersion.toString(); + } + } + + this._producer = createProducer(tapVersion); + + runner.once(EVENT_RUN_BEGIN, function () { + self._producer.writeVersion(); + }); + + runner.on(EVENT_TEST_END, function () { + ++n; + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + self._producer.writePending(n, test); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + self._producer.writePass(n, test); + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + self._producer.writeFail(n, test, err); + }); + + runner.once(EVENT_RUN_END, function () { + self._producer.writeEpilogue(runner.stats); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(TAP, Base); + + /** + * Returns a TAP-safe title of `test`. + * + * @private + * @param {Test} test - Test instance. + * @return {String} title with any hash character removed + */ + function title(test) { + return test.fullTitle().replace(/#/g, ''); + } + + /** + * Writes newline-terminated formatted string to reporter output stream. + * + * @private + * @param {string} format - `printf`-like format string + * @param {...*} [varArgs] - Format string arguments + */ + function println(format, varArgs) { + var vargs = Array.from(arguments); + vargs[0] += '\n'; + process.stdout.write(sprintf.apply(null, vargs)); + } + + /** + * Returns a `tapVersion`-appropriate TAP producer instance, if possible. + * + * @private + * @param {string} tapVersion - Version of TAP specification to produce. + * @returns {TAPProducer} specification-appropriate instance + * @throws {Error} if specification version has no associated producer. + */ + function createProducer(tapVersion) { + var producers = { + 12: new TAP12Producer(), + 13: new TAP13Producer() + }; + var producer = producers[tapVersion]; + + if (!producer) { + throw new Error( + 'invalid or unsupported TAP version: ' + JSON.stringify(tapVersion) + ); + } + + return producer; + } + + /** + * @summary + * Constructs a new TAPProducer. + * + * @description + * Only to be used as an abstract base class. + * + * @private + * @constructor + */ + function TAPProducer() {} + + /** + * Writes the TAP version to reporter output stream. + * + * @abstract + */ + TAPProducer.prototype.writeVersion = function () {}; + + /** + * Writes the plan to reporter output stream. + * + * @abstract + * @param {number} ntests - Number of tests that are planned to run. + */ + TAPProducer.prototype.writePlan = function (ntests) { + println('%d..%d', 1, ntests); + }; + + /** + * Writes that test passed to reporter output stream. + * + * @abstract + * @param {number} n - Index of test that passed. + * @param {Test} test - Instance containing test information. + */ + TAPProducer.prototype.writePass = function (n, test) { + println('ok %d %s', n, title(test)); + }; + + /** + * Writes that test was skipped to reporter output stream. + * + * @abstract + * @param {number} n - Index of test that was skipped. + * @param {Test} test - Instance containing test information. + */ + TAPProducer.prototype.writePending = function (n, test) { + println('ok %d %s # SKIP -', n, title(test)); + }; + + /** + * Writes that test failed to reporter output stream. + * + * @abstract + * @param {number} n - Index of test that failed. + * @param {Test} test - Instance containing test information. + * @param {Error} err - Reason the test failed. + */ + TAPProducer.prototype.writeFail = function (n, test, err) { + println('not ok %d %s', n, title(test)); + }; + + /** + * Writes the summary epilogue to reporter output stream. + * + * @abstract + * @param {Object} stats - Object containing run statistics. + */ + TAPProducer.prototype.writeEpilogue = function (stats) { + // :TBD: Why is this not counting pending tests? + println('# tests ' + (stats.passes + stats.failures)); + println('# pass ' + stats.passes); + // :TBD: Why are we not showing pending results? + println('# fail ' + stats.failures); + this.writePlan(stats.passes + stats.failures + stats.pending); + }; + + /** + * @summary + * Constructs a new TAP12Producer. + * + * @description + * Produces output conforming to the TAP12 specification. + * + * @private + * @constructor + * @extends TAPProducer + * @see {@link https://testanything.org/tap-specification.html|Specification} + */ + function TAP12Producer() { + /** + * Writes that test failed to reporter output stream, with error formatting. + * @override + */ + this.writeFail = function (n, test, err) { + TAPProducer.prototype.writeFail.call(this, n, test, err); + if (err.message) { + println(err.message.replace(/^/gm, ' ')); + } + if (err.stack) { + println(err.stack.replace(/^/gm, ' ')); + } + }; + } + + /** + * Inherit from `TAPProducer.prototype`. + */ + inherits(TAP12Producer, TAPProducer); + + /** + * @summary + * Constructs a new TAP13Producer. + * + * @description + * Produces output conforming to the TAP13 specification. + * + * @private + * @constructor + * @extends TAPProducer + * @see {@link https://testanything.org/tap-version-13-specification.html|Specification} + */ + function TAP13Producer() { + /** + * Writes the TAP version to reporter output stream. + * @override + */ + this.writeVersion = function () { + println('TAP version 13'); + }; + + /** + * Writes that test failed to reporter output stream, with error formatting. + * @override + */ + this.writeFail = function (n, test, err) { + TAPProducer.prototype.writeFail.call(this, n, test, err); + var emitYamlBlock = err.message != null || err.stack != null; + if (emitYamlBlock) { + println(indent(1) + '---'); + if (err.message) { + println(indent(2) + 'message: |-'); + println(err.message.replace(/^/gm, indent(3))); + } + if (err.stack) { + println(indent(2) + 'stack: |-'); + println(err.stack.replace(/^/gm, indent(3))); + } + println(indent(1) + '...'); + } + }; + + function indent(level) { + return Array(level + 1).join(' '); + } + } + + /** + * Inherit from `TAPProducer.prototype`. + */ + inherits(TAP13Producer, TAPProducer); + + TAP.description = 'TAP-compatible output'; + }(tap)); + + var json = {exports: {}}; + + var _polyfillNode_fs = {}; + + var _polyfillNode_fs$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': _polyfillNode_fs + }); + + var require$$2 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_fs$1); + + (function (module, exports) { + /** + * @module JSON + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var fs = require$$2; + var path = require$$1; + const createUnsupportedError = errors$2.createUnsupportedError; + const utils = utils$3; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var EVENT_RUN_END = constants.EVENT_RUN_END; + + /** + * Expose `JSON`. + */ + + module.exports = JSONReporter; + + /** + * Constructs a new `JSON` reporter instance. + * + * @public + * @class JSON + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function JSONReporter(runner, options = {}) { + Base.call(this, runner, options); + + var self = this; + var tests = []; + var pending = []; + var failures = []; + var passes = []; + var output; + + if (options.reporterOption && options.reporterOption.output) { + if (utils.isBrowser()) { + throw createUnsupportedError('file output not supported in browser'); + } + output = options.reporterOption.output; + } + + runner.on(EVENT_TEST_END, function (test) { + tests.push(test); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + passes.push(test); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + failures.push(test); + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + pending.push(test); + }); + + runner.once(EVENT_RUN_END, function () { + var obj = { + stats: self.stats, + tests: tests.map(clean), + pending: pending.map(clean), + failures: failures.map(clean), + passes: passes.map(clean) + }; + + runner.testResults = obj; + + var json = JSON.stringify(obj, null, 2); + if (output) { + try { + fs.mkdirSync(path.dirname(output), {recursive: true}); + fs.writeFileSync(output, json); + } catch (err) { + console.error( + `${Base.symbols.err} [mocha] writing output to "${output}" failed: ${err.message}\n` + ); + process.stdout.write(json); + } + } else { + process.stdout.write(json); + } + }); + } + + /** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @private + * @param {Object} test + * @return {Object} + */ + function clean(test) { + var err = test.err || {}; + if (err instanceof Error) { + err = errorJSON(err); + } + + return { + title: test.title, + fullTitle: test.fullTitle(), + file: test.file, + duration: test.duration, + currentRetry: test.currentRetry(), + speed: test.speed, + err: cleanCycles(err) + }; + } + + /** + * Replaces any circular references inside `obj` with '[object Object]' + * + * @private + * @param {Object} obj + * @return {Object} + */ + function cleanCycles(obj) { + var cache = []; + return JSON.parse( + JSON.stringify(obj, function (key, value) { + if (typeof value === 'object' && value !== null) { + if (cache.indexOf(value) !== -1) { + // Instead of going in a circle, we'll print [object Object] + return '' + value; + } + cache.push(value); + } + + return value; + }) + ); + } + + /** + * Transform an Error object into a JSON object. + * + * @private + * @param {Error} err + * @return {Object} + */ + function errorJSON(err) { + var res = {}; + Object.getOwnPropertyNames(err).forEach(function (key) { + res[key] = err[key]; + }, err); + return res; + } + + JSONReporter.description = 'single JSON object'; + }(json)); + + var html = {exports: {}}; + + /** + @module browser/Progress + */ + + /** + * Expose `Progress`. + */ + + var progress$1 = Progress; + + /** + * Initialize a new `Progress` indicator. + */ + function Progress() { + this.percent = 0; + this.size(0); + this.fontSize(11); + this.font('helvetica, arial, sans-serif'); + } + + /** + * Set progress size to `size`. + * + * @public + * @param {number} size + * @return {Progress} Progress instance. + */ + Progress.prototype.size = function (size) { + this._size = size; + return this; + }; + + /** + * Set text to `text`. + * + * @public + * @param {string} text + * @return {Progress} Progress instance. + */ + Progress.prototype.text = function (text) { + this._text = text; + return this; + }; + + /** + * Set font size to `size`. + * + * @public + * @param {number} size + * @return {Progress} Progress instance. + */ + Progress.prototype.fontSize = function (size) { + this._fontSize = size; + return this; + }; + + /** + * Set font to `family`. + * + * @param {string} family + * @return {Progress} Progress instance. + */ + Progress.prototype.font = function (family) { + this._font = family; + return this; + }; + + /** + * Update percentage to `n`. + * + * @param {number} n + * @return {Progress} Progress instance. + */ + Progress.prototype.update = function (n) { + this.percent = n; + return this; + }; + + /** + * Draw on `ctx`. + * + * @param {CanvasRenderingContext2d} ctx + * @return {Progress} Progress instance. + */ + Progress.prototype.draw = function (ctx) { + try { + var darkMatcher = window.matchMedia('(prefers-color-scheme: dark)'); + var isDarkMode = !!darkMatcher.matches; + var lightColors = { + outerCircle: '#9f9f9f', + innerCircle: '#eee', + text: '#000' + }; + var darkColors = { + outerCircle: '#888', + innerCircle: '#444', + text: '#fff' + }; + var colors = isDarkMode ? darkColors : lightColors; + + var percent = Math.min(this.percent, 100); + var size = this._size; + var half = size / 2; + var x = half; + var y = half; + var rad = half - 1; + var fontSize = this._fontSize; + + ctx.font = fontSize + 'px ' + this._font; + + var angle = Math.PI * 2 * (percent / 100); + ctx.clearRect(0, 0, size, size); + + // outer circle + ctx.strokeStyle = colors.outerCircle; + ctx.beginPath(); + ctx.arc(x, y, rad, 0, angle, false); + ctx.stroke(); + + // inner circle + ctx.strokeStyle = colors.innerCircle; + ctx.beginPath(); + ctx.arc(x, y, rad - 1, 0, angle, true); + ctx.stroke(); + + // text + var text = this._text || (percent | 0) + '%'; + var w = ctx.measureText(text).width; + + ctx.fillStyle = colors.text; + ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1); + } catch (ignore) { + // don't fail if we can't render progress + } + return this; + }; + + (function (module, exports) { + + /* eslint-env browser */ + /** + * @module HTML + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var Progress = progress$1; + var escapeRe = escapeStringRegexp; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var escape = utils.escape; + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + + var Date = commonjsGlobal.Date; + + /** + * Expose `HTML`. + */ + + module.exports = HTML; + + /** + * Stats template. + */ + + var statsTemplate = + ''; + + var playIcon = '‣'; + + /** + * Constructs a new `HTML` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function HTML(runner, options) { + Base.call(this, runner, options); + + var self = this; + var stats = this.stats; + var stat = fragment(statsTemplate); + var items = stat.getElementsByTagName('li'); + var passes = items[1].getElementsByTagName('em')[0]; + var passesLink = items[1].getElementsByTagName('a')[0]; + var failures = items[2].getElementsByTagName('em')[0]; + var failuresLink = items[2].getElementsByTagName('a')[0]; + var duration = items[3].getElementsByTagName('em')[0]; + var canvas = stat.getElementsByTagName('canvas')[0]; + var report = fragment('
    '); + var stack = [report]; + var progress; + var ctx; + var root = document.getElementById('mocha'); + + if (canvas.getContext) { + var ratio = window.devicePixelRatio || 1; + canvas.style.width = canvas.width; + canvas.style.height = canvas.height; + canvas.width *= ratio; + canvas.height *= ratio; + ctx = canvas.getContext('2d'); + ctx.scale(ratio, ratio); + progress = new Progress(); + } + + if (!root) { + return error('#mocha div missing, add it to your document'); + } + + // pass toggle + on(passesLink, 'click', function (evt) { + evt.preventDefault(); + unhide(); + var name = /pass/.test(report.className) ? '' : ' pass'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) { + hideSuitesWithout('test pass'); + } + }); + + // failure toggle + on(failuresLink, 'click', function (evt) { + evt.preventDefault(); + unhide(); + var name = /fail/.test(report.className) ? '' : ' fail'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) { + hideSuitesWithout('test fail'); + } + }); + + root.appendChild(stat); + root.appendChild(report); + + if (progress) { + progress.size(40); + } + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + if (suite.root) { + return; + } + + // suite + var url = self.suiteURL(suite); + var el = fragment( + '
  • %s

  • ', + url, + escape(suite.title) + ); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on(EVENT_SUITE_END, function (suite) { + if (suite.root) { + updateStats(); + return; + } + stack.shift(); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var url = self.testURL(test); + var markup = + '
  • %e%ems ' + + '' + + playIcon + + '

  • '; + var el = fragment(markup, test.speed, test.title, test.duration, url); + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + var el = fragment( + '
  • %e ' + + playIcon + + '

  • ', + test.title, + self.testURL(test) + ); + var stackString; // Note: Includes leading newline + var message = test.err.toString(); + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if (message === '[object Error]') { + message = test.err.message; + } + + if (test.err.stack) { + var indexOfMessage = test.err.stack.indexOf(test.err.message); + if (indexOfMessage === -1) { + stackString = test.err.stack; + } else { + stackString = test.err.stack.slice( + test.err.message.length + indexOfMessage + ); + } + } else if (test.err.sourceURL && test.err.line !== undefined) { + // Safari doesn't give you a stack. Let's at least provide a source line. + stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; + } + + stackString = stackString || ''; + + if (test.err.htmlMessage && stackString) { + el.appendChild( + fragment( + '
    %s\n
    %e
    ', + test.err.htmlMessage, + stackString + ) + ); + } else if (test.err.htmlMessage) { + el.appendChild( + fragment('
    %s
    ', test.err.htmlMessage) + ); + } else { + el.appendChild( + fragment('
    %e%e
    ', message, stackString) + ); + } + + self.addCodeToggle(el, test.body); + appendToStack(el); + updateStats(); + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + var el = fragment( + '
  • %e

  • ', + test.title + ); + appendToStack(el); + updateStats(); + }); + + function appendToStack(el) { + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) { + stack[0].appendChild(el); + } + } + + function updateStats() { + // TODO: add to stats + var percent = ((stats.tests / runner.total) * 100) | 0; + if (progress) { + progress.update(percent).draw(ctx); + } + + // update stats + var ms = new Date() - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + } + } + + /** + * Makes a URL, preserving querystring ("search") parameters. + * + * @param {string} s + * @return {string} A new URL. + */ + function makeUrl(s) { + var search = window.location.search; + + // Remove previous grep query parameter if present + if (search) { + search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); + } + + return ( + window.location.pathname + + (search ? search + '&' : '?') + + 'grep=' + + encodeURIComponent(escapeRe(s)) + ); + } + + /** + * Provide suite URL. + * + * @param {Object} [suite] + */ + HTML.prototype.suiteURL = function (suite) { + return makeUrl(suite.fullTitle()); + }; + + /** + * Provide test URL. + * + * @param {Object} [test] + */ + HTML.prototype.testURL = function (test) { + return makeUrl(test.fullTitle()); + }; + + /** + * Adds code toggle functionality for the provided test's list element. + * + * @param {HTMLLIElement} el + * @param {string} contents + */ + HTML.prototype.addCodeToggle = function (el, contents) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function () { + pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; + }); + + var pre = fragment('
    %e
    ', utils.clean(contents)); + el.appendChild(pre); + pre.style.display = 'none'; + }; + + /** + * Display error `msg`. + * + * @param {string} msg + */ + function error(msg) { + document.body.appendChild(fragment('
    %s
    ', msg)); + } + + /** + * Return a DOM fragment from `html`. + * + * @param {string} html + */ + function fragment(html) { + var args = arguments; + var div = document.createElement('div'); + var i = 1; + + div.innerHTML = html.replace(/%([se])/g, function (_, type) { + switch (type) { + case 's': + return String(args[i++]); + case 'e': + return escape(args[i++]); + // no default + } + }); + + return div.firstChild; + } + + /** + * Check for suites that do not have elements + * with `classname`, and hide them. + * + * @param {text} classname + */ + function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (!els.length) { + suites[i].className += ' hidden'; + } + } + } + + /** + * Unhide .hidden suites. + */ + function unhide() { + var els = document.getElementsByClassName('suite hidden'); + while (els.length > 0) { + els[0].className = els[0].className.replace('suite hidden', 'suite'); + } + } + + /** + * Set an element's text contents. + * + * @param {HTMLElement} el + * @param {string} contents + */ + function text(el, contents) { + if (el.textContent) { + el.textContent = contents; + } else { + el.innerText = contents; + } + } + + /** + * Listen on `event` with callback `fn`. + */ + function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } + } + + HTML.browserOnly = true; + }(html)); + + var list = {exports: {}}; + + (function (module, exports) { + /** + * @module List + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_BEGIN = constants.EVENT_TEST_BEGIN; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var color = Base.color; + var cursor = Base.cursor; + + /** + * Expose `List`. + */ + + module.exports = List; + + /** + * Constructs a new `List` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function List(runner, options) { + Base.call(this, runner, options); + + var self = this; + var n = 0; + + runner.on(EVENT_RUN_BEGIN, function () { + Base.consoleLog(); + }); + + runner.on(EVENT_TEST_BEGIN, function (test) { + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + var fmt = color('checkmark', ' -') + color('pending', ' %s'); + Base.consoleLog(fmt, test.fullTitle()); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var fmt = + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + Base.consoleLog(fmt, test.fullTitle(), test.duration); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + cursor.CR(); + Base.consoleLog(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.once(EVENT_RUN_END, self.epilogue.bind(self)); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(List, Base); + + List.description = 'like "spec" reporter but flat'; + }(list)); + + var min = {exports: {}}; + + (function (module, exports) { + /** + * @module Min + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + + /** + * Expose `Min`. + */ + + module.exports = Min; + + /** + * Constructs a new `Min` reporter instance. + * + * @description + * This minimal test reporter is best used with '--watch'. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Min(runner, options) { + Base.call(this, runner, options); + + runner.on(EVENT_RUN_BEGIN, function () { + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.once(EVENT_RUN_END, this.epilogue.bind(this)); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Min, Base); + + Min.description = 'essentially just a summary'; + }(min)); + + var spec = {exports: {}}; + + (function (module, exports) { + /** + * @module Spec + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_SUITE_END = constants.EVENT_SUITE_END; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var inherits = utils$3.inherits; + var color = Base.color; + + /** + * Expose `Spec`. + */ + + module.exports = Spec; + + /** + * Constructs a new `Spec` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Spec(runner, options) { + Base.call(this, runner, options); + + var self = this; + var indents = 0; + var n = 0; + + function indent() { + return Array(indents).join(' '); + } + + runner.on(EVENT_RUN_BEGIN, function () { + Base.consoleLog(); + }); + + runner.on(EVENT_SUITE_BEGIN, function (suite) { + ++indents; + Base.consoleLog(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on(EVENT_SUITE_END, function () { + --indents; + if (indents === 1) { + Base.consoleLog(); + } + }); + + runner.on(EVENT_TEST_PENDING, function (test) { + var fmt = indent() + color('pending', ' - %s'); + Base.consoleLog(fmt, test.title); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var fmt; + if (test.speed === 'fast') { + fmt = + indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s'); + Base.consoleLog(fmt, test.title); + } else { + fmt = + indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s') + + color(test.speed, ' (%dms)'); + Base.consoleLog(fmt, test.title, test.duration); + } + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + Base.consoleLog(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.once(EVENT_RUN_END, self.epilogue.bind(self)); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Spec, Base); + + Spec.description = 'hierarchical & verbose [default]'; + }(spec)); + + var nyan = {exports: {}}; + + (function (module, exports) { + /** + * @module Nyan + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var inherits = utils$3.inherits; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + + /** + * Expose `Dot`. + */ + + module.exports = NyanCat; + + /** + * Constructs a new `Nyan` reporter instance. + * + * @public + * @class Nyan + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function NyanCat(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.75) | 0; + var nyanCatWidth = (this.nyanCatWidth = 11); + + this.colorIndex = 0; + this.numberOfLines = 4; + this.rainbowColors = self.generateColors(); + this.scoreboardWidth = 5; + this.tick = 0; + this.trajectories = [[], [], [], []]; + this.trajectoryWidthMax = width - nyanCatWidth; + + runner.on(EVENT_RUN_BEGIN, function () { + Base.cursor.hide(); + self.draw(); + }); + + runner.on(EVENT_TEST_PENDING, function () { + self.draw(); + }); + + runner.on(EVENT_TEST_PASS, function () { + self.draw(); + }); + + runner.on(EVENT_TEST_FAIL, function () { + self.draw(); + }); + + runner.once(EVENT_RUN_END, function () { + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) { + write('\n'); + } + self.epilogue(); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(NyanCat, Base); + + /** + * Draw the nyan cat + * + * @private + */ + + NyanCat.prototype.draw = function () { + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(); + this.tick = !this.tick; + }; + + /** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @private + */ + + NyanCat.prototype.drawScoreboard = function () { + var stats = this.stats; + + function draw(type, n) { + write(' '); + write(Base.color(type, n)); + write('\n'); + } + + draw('green', stats.passes); + draw('fail', stats.failures); + draw('pending', stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); + }; + + /** + * Append the rainbow. + * + * @private + */ + + NyanCat.prototype.appendRainbow = function () { + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) { + trajectory.shift(); + } + trajectory.push(rainbowified); + } + }; + + /** + * Draw the rainbow. + * + * @private + */ + + NyanCat.prototype.drawRainbow = function () { + var self = this; + + this.trajectories.forEach(function (line) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); + }; + + /** + * Draw the nyan cat + * + * @private + */ + NyanCat.prototype.drawNyanCat = function () { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var dist = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(dist); + write('_,------,'); + write('\n'); + + write(dist); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(dist); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + write(tail + '|' + padding + this.face() + ' '); + write('\n'); + + write(dist); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); + }; + + /** + * Draw nyan cat face. + * + * @private + * @return {string} + */ + + NyanCat.prototype.face = function () { + var stats = this.stats; + if (stats.failures) { + return '( x .x)'; + } else if (stats.pending) { + return '( o .o)'; + } else if (stats.passes) { + return '( ^ .^)'; + } + return '( - .-)'; + }; + + /** + * Move cursor up `n`. + * + * @private + * @param {number} n + */ + + NyanCat.prototype.cursorUp = function (n) { + write('\u001b[' + n + 'A'); + }; + + /** + * Move cursor down `n`. + * + * @private + * @param {number} n + */ + + NyanCat.prototype.cursorDown = function (n) { + write('\u001b[' + n + 'B'); + }; + + /** + * Generate rainbow colors. + * + * @private + * @return {Array} + */ + NyanCat.prototype.generateColors = function () { + var colors = []; + + for (var i = 0; i < 6 * 7; i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = i * (1.0 / 6); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; + }; + + /** + * Apply rainbow to the given `str`. + * + * @private + * @param {string} str + * @return {string} + */ + NyanCat.prototype.rainbowify = function (str) { + if (!Base.useColors) { + return str; + } + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; + }; + + /** + * Stdout helper. + * + * @param {string} string A message to write to stdout. + */ + function write(string) { + process.stdout.write(string); + } + + NyanCat.description = '"nyan cat"'; + }(nyan)); + + var xunit = {exports: {}}; + + (function (module, exports) { + /** + * @module XUnit + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var utils = utils$3; + var fs = require$$2; + var path = require$$1; + var errors = errors$2; + var createUnsupportedError = errors.createUnsupportedError; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var STATE_FAILED = runnable.constants.STATE_FAILED; + var inherits = utils.inherits; + var escape = utils.escape; + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + var Date = commonjsGlobal.Date; + + /** + * Expose `XUnit`. + */ + + module.exports = XUnit; + + /** + * Constructs a new `XUnit` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function XUnit(runner, options) { + Base.call(this, runner, options); + + var stats = this.stats; + var tests = []; + var self = this; + + // the name of the test suite, as it will appear in the resulting XML file + var suiteName; + + // the default name of the test suite if none is provided + var DEFAULT_SUITE_NAME = 'Mocha Tests'; + + if (options && options.reporterOptions) { + if (options.reporterOptions.output) { + if (!fs.createWriteStream) { + throw createUnsupportedError('file output not supported in browser'); + } + + fs.mkdirSync(path.dirname(options.reporterOptions.output), { + recursive: true + }); + self.fileStream = fs.createWriteStream(options.reporterOptions.output); + } + + // get the suite name from the reporter options (if provided) + suiteName = options.reporterOptions.suiteName; + } + + // fall back to the default suite name + suiteName = suiteName || DEFAULT_SUITE_NAME; + + runner.on(EVENT_TEST_PENDING, function (test) { + tests.push(test); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + tests.push(test); + }); + + runner.on(EVENT_TEST_FAIL, function (test) { + tests.push(test); + }); + + runner.once(EVENT_RUN_END, function () { + self.write( + tag( + 'testsuite', + { + name: suiteName, + tests: stats.tests, + failures: 0, + errors: stats.failures, + skipped: stats.tests - stats.failures - stats.passes, + timestamp: new Date().toUTCString(), + time: stats.duration / 1000 || 0 + }, + false + ) + ); + + tests.forEach(function (t) { + self.test(t); + }); + + self.write(''); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(XUnit, Base); + + /** + * Override done to close the stream (if it's a file). + * + * @param failures + * @param {Function} fn + */ + XUnit.prototype.done = function (failures, fn) { + if (this.fileStream) { + this.fileStream.end(function () { + fn(failures); + }); + } else { + fn(failures); + } + }; + + /** + * Write out the given line. + * + * @param {string} line + */ + XUnit.prototype.write = function (line) { + if (this.fileStream) { + this.fileStream.write(line + '\n'); + } else if (typeof process === 'object' && process.stdout) { + process.stdout.write(line + '\n'); + } else { + Base.consoleLog(line); + } + }; + + /** + * Output tag for the given `test.` + * + * @param {Test} test + */ + XUnit.prototype.test = function (test) { + Base.useColors = false; + + var attrs = { + classname: test.parent.fullTitle(), + name: test.title, + time: test.duration / 1000 || 0 + }; + + if (test.state === STATE_FAILED) { + var err = test.err; + var diff = + !Base.hideDiff && Base.showDiff(err) + ? '\n' + Base.generateDiff(err.actual, err.expected) + : ''; + this.write( + tag( + 'testcase', + attrs, + false, + tag( + 'failure', + {}, + false, + escape(err.message) + escape(diff) + '\n' + escape(err.stack) + ) + ) + ); + } else if (test.isPending()) { + this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + this.write(tag('testcase', attrs, true)); + } + }; + + /** + * HTML tag helper. + * + * @param name + * @param attrs + * @param close + * @param content + * @return {string} + */ + function tag(name, attrs, close, content) { + var end = close ? '/>' : '>'; + var pairs = []; + var tag; + + for (var key in attrs) { + if (Object.prototype.hasOwnProperty.call(attrs, key)) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) { + tag += content + '' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on(EVENT_SUITE_END, function () { + --level; + }); + + runner.on(EVENT_TEST_PASS, function (test) { + var code = utils.clean(test.body); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.once(EVENT_RUN_END, function () { + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); + } + + Markdown.description = 'GitHub Flavored Markdown'; + }(markdown)); + + var progress = {exports: {}}; + + (function (module, exports) { + /** + * @module Progress + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var inherits = utils$3.inherits; + var color = Base.color; + var cursor = Base.cursor; + + /** + * Expose `Progress`. + */ + + module.exports = Progress; + + /** + * General progress bar color. + */ + + Base.colors.progress = 90; + + /** + * Constructs a new `Progress` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Progress(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.5) | 0; + var total = runner.total; + var complete = 0; + var lastN = -1; + + // default chars + options = options || {}; + var reporterOptions = options.reporterOptions || {}; + + options.open = reporterOptions.open || '['; + options.complete = reporterOptions.complete || '▬'; + options.incomplete = reporterOptions.incomplete || Base.symbols.dot; + options.close = reporterOptions.close || ']'; + options.verbose = reporterOptions.verbose || false; + + // tests started + runner.on(EVENT_RUN_BEGIN, function () { + process.stdout.write('\n'); + cursor.hide(); + }); + + // tests complete + runner.on(EVENT_TEST_END, function () { + complete++; + + var percent = complete / total; + var n = (width * percent) | 0; + var i = width - n; + + if (n === lastN && !options.verbose) { + // Don't re-render the line if it hasn't changed + return; + } + lastN = n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.once(EVENT_RUN_END, function () { + cursor.show(); + process.stdout.write('\n'); + self.epilogue(); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Progress, Base); + + Progress.description = 'a progress bar'; + }(progress)); + + var landing = {exports: {}}; + + (function (module, exports) { + /** + * @module Landing + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var inherits = utils$3.inherits; + var constants = runner.constants; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_END = constants.EVENT_TEST_END; + var STATE_FAILED = runnable.constants.STATE_FAILED; + + var cursor = Base.cursor; + var color = Base.color; + + /** + * Expose `Landing`. + */ + + module.exports = Landing; + + /** + * Airplane color. + */ + + Base.colors.plane = 0; + + /** + * Airplane crash color. + */ + + Base.colors['plane crash'] = 31; + + /** + * Runway color. + */ + + Base.colors.runway = 90; + + /** + * Constructs a new `Landing` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function Landing(runner, options) { + Base.call(this, runner, options); + + var self = this; + var width = (Base.window.width * 0.75) | 0; + var stream = process.stdout; + + var plane = color('plane', '✈'); + var crashed = -1; + var n = 0; + var total = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on(EVENT_RUN_BEGIN, function () { + stream.write('\n\n\n '); + cursor.hide(); + }); + + runner.on(EVENT_TEST_END, function (test) { + // check if the plane crashed + var col = crashed === -1 ? ((width * ++n) / ++total) | 0 : crashed; + // show the crash + if (test.state === STATE_FAILED) { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane); + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.once(EVENT_RUN_END, function () { + cursor.show(); + process.stdout.write('\n'); + self.epilogue(); + }); + + // if cursor is hidden when we ctrl-C, then it will remain hidden unless... + process.once('SIGINT', function () { + cursor.show(); + nextTick$1(function () { + process.kill(process.pid, 'SIGINT'); + }); + }); + } + + /** + * Inherit from `Base.prototype`. + */ + inherits(Landing, Base); + + Landing.description = 'Unicode landing strip'; + }(landing)); + + var jsonStream = {exports: {}}; + + (function (module, exports) { + /** + * @module JSONStream + */ + /** + * Module dependencies. + */ + + var Base = base$1.exports; + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_RUN_END = constants.EVENT_RUN_END; + + /** + * Expose `JSONStream`. + */ + + module.exports = JSONStream; + + /** + * Constructs a new `JSONStream` reporter instance. + * + * @public + * @class + * @memberof Mocha.reporters + * @extends Mocha.reporters.Base + * @param {Runner} runner - Instance triggers reporter actions. + * @param {Object} [options] - runner options + */ + function JSONStream(runner, options) { + Base.call(this, runner, options); + + var self = this; + var total = runner.total; + + runner.once(EVENT_RUN_BEGIN, function () { + writeEvent(['start', {total}]); + }); + + runner.on(EVENT_TEST_PASS, function (test) { + writeEvent(['pass', clean(test)]); + }); + + runner.on(EVENT_TEST_FAIL, function (test, err) { + test = clean(test); + test.err = err.message; + test.stack = err.stack || null; + writeEvent(['fail', test]); + }); + + runner.once(EVENT_RUN_END, function () { + writeEvent(['end', self.stats]); + }); + } + + /** + * Mocha event to be written to the output stream. + * @typedef {Array} JSONStream~MochaEvent + */ + + /** + * Writes Mocha event to reporter output stream. + * + * @private + * @param {JSONStream~MochaEvent} event - Mocha event to be output. + */ + function writeEvent(event) { + process.stdout.write(JSON.stringify(event) + '\n'); + } + + /** + * Returns an object literal representation of `test` + * free of cyclic properties, etc. + * + * @private + * @param {Test} test - Instance used as data source. + * @return {Object} object containing pared-down test instance data + */ + function clean(test) { + return { + title: test.title, + fullTitle: test.fullTitle(), + file: test.file, + duration: test.duration, + currentRetry: test.currentRetry(), + speed: test.speed + }; + } + + JSONStream.description = 'newline delimited JSON events'; + }(jsonStream)); + + (function (exports) { + + // Alias exports to a their normalized format Mocha#reporter to prevent a need + // for dynamic (try/catch) requires, which Browserify doesn't handle. + exports.Base = exports.base = base$1.exports; + exports.Dot = exports.dot = dot.exports; + exports.Doc = exports.doc = doc.exports; + exports.TAP = exports.tap = tap.exports; + exports.JSON = exports.json = json.exports; + exports.HTML = exports.html = html.exports; + exports.List = exports.list = list.exports; + exports.Min = exports.min = min.exports; + exports.Spec = exports.spec = spec.exports; + exports.Nyan = exports.nyan = nyan.exports; + exports.XUnit = exports.xunit = xunit.exports; + exports.Markdown = exports.markdown = markdown.exports; + exports.Progress = exports.progress = progress.exports; + exports.Landing = exports.landing = landing.exports; + exports.JSONStream = exports['json-stream'] = jsonStream.exports; + }(reporters)); + + var diff = true; + var extension = [ + "js", + "cjs", + "mjs" + ]; + var reporter = "spec"; + var slow = 75; + var timeout = 2000; + var ui = "bdd"; + var require$$4 = { + diff: diff, + extension: extension, + "package": "./package.json", + reporter: reporter, + slow: slow, + timeout: timeout, + ui: ui, + "watch-ignore": [ + "node_modules", + ".git" + ] + }; + + /** + * Provides a factory function for a {@link StatsCollector} object. + * @module + */ + + var constants = runner.constants; + var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; + var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; + var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; + var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; + var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; + var EVENT_RUN_END = constants.EVENT_RUN_END; + var EVENT_TEST_END = constants.EVENT_TEST_END; + + /** + * Test statistics collector. + * + * @public + * @typedef {Object} StatsCollector + * @property {number} suites - integer count of suites run. + * @property {number} tests - integer count of tests run. + * @property {number} passes - integer count of passing tests. + * @property {number} pending - integer count of pending tests. + * @property {number} failures - integer count of failed tests. + * @property {Date} start - time when testing began. + * @property {Date} end - time when testing concluded. + * @property {number} duration - number of msecs that testing took. + */ + + var Date$2 = commonjsGlobal.Date; + + /** + * Provides stats such as test duration, number of tests passed / failed etc., by listening for events emitted by `runner`. + * + * @private + * @param {Runner} runner - Runner instance + * @throws {TypeError} If falsy `runner` + */ + function createStatsCollector(runner) { + /** + * @type StatsCollector + */ + var stats = { + suites: 0, + tests: 0, + passes: 0, + pending: 0, + failures: 0 + }; + + if (!runner) { + throw new TypeError('Missing runner argument'); + } + + runner.stats = stats; + + runner.once(EVENT_RUN_BEGIN, function () { + stats.start = new Date$2(); + }); + runner.on(EVENT_SUITE_BEGIN, function (suite) { + suite.root || stats.suites++; + }); + runner.on(EVENT_TEST_PASS, function () { + stats.passes++; + }); + runner.on(EVENT_TEST_FAIL, function () { + stats.failures++; + }); + runner.on(EVENT_TEST_PENDING, function () { + stats.pending++; + }); + runner.on(EVENT_TEST_END, function () { + stats.tests++; + }); + runner.once(EVENT_RUN_END, function () { + stats.end = new Date$2(); + stats.duration = stats.end - stats.start; + }); + } + + var statsCollector = createStatsCollector; + + var interfaces = {}; + + var bdd = {exports: {}}; + + var Runnable = runnable; + var utils = utils$3; + var errors$1 = errors$2; + var createInvalidArgumentTypeError = errors$1.createInvalidArgumentTypeError; + var isString = utils.isString; + + const {MOCHA_ID_PROP_NAME} = utils.constants; + + var test = Test$4; + + /** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @public + * @class + * @extends Runnable + * @param {String} title - Test title (required) + * @param {Function} [fn] - Test callback. If omitted, the Test is considered "pending" + */ + function Test$4(title, fn) { + if (!isString(title)) { + throw createInvalidArgumentTypeError( + 'Test argument "title" should be a string. Received type "' + + typeof title + + '"', + 'title', + 'string' + ); + } + this.type = 'test'; + Runnable.call(this, title, fn); + this.reset(); + } + + /** + * Inherit from `Runnable.prototype`. + */ + utils.inherits(Test$4, Runnable); + + /** + * Resets the state initially or for a next run. + */ + Test$4.prototype.reset = function () { + Runnable.prototype.reset.call(this); + this.pending = !this.fn; + delete this.state; + }; + + /** + * Set or get retried test + * + * @private + */ + Test$4.prototype.retriedTest = function (n) { + if (!arguments.length) { + return this._retriedTest; + } + this._retriedTest = n; + }; + + /** + * Add test to the list of tests marked `only`. + * + * @private + */ + Test$4.prototype.markOnly = function () { + this.parent.appendOnlyTest(this); + }; + + Test$4.prototype.clone = function () { + var test = new Test$4(this.title, this.fn); + test.timeout(this.timeout()); + test.slow(this.slow()); + test.retries(this.retries()); + test.currentRetry(this.currentRetry()); + test.retriedTest(this.retriedTest() || this); + test.globals(this.globals()); + test.parent = this.parent; + test.file = this.file; + test.ctx = this.ctx; + return test; + }; + + /** + * Returns an minimal object suitable for transmission over IPC. + * Functions are represented by keys beginning with `$$`. + * @private + * @returns {Object} + */ + Test$4.prototype.serialize = function serialize() { + return { + $$currentRetry: this._currentRetry, + $$fullTitle: this.fullTitle(), + $$isPending: Boolean(this.pending), + $$retriedTest: this._retriedTest || null, + $$slow: this._slow, + $$titlePath: this.titlePath(), + body: this.body, + duration: this.duration, + err: this.err, + parent: { + $$fullTitle: this.parent.fullTitle(), + [MOCHA_ID_PROP_NAME]: this.parent.id + }, + speed: this.speed, + state: this.state, + title: this.title, + type: this.type, + file: this.file, + [MOCHA_ID_PROP_NAME]: this.id + }; + }; + + /** + @module interfaces/common + */ + + var Suite$1 = suite.exports; + var errors = errors$2; + var createMissingArgumentError = errors.createMissingArgumentError; + var createUnsupportedError = errors.createUnsupportedError; + var createForbiddenExclusivityError = errors.createForbiddenExclusivityError; + + /** + * Functions common to more than one interface. + * + * @private + * @param {Suite[]} suites + * @param {Context} context + * @param {Mocha} mocha + * @return {Object} An object containing common functions. + */ + var common = function (suites, context, mocha) { + /** + * Check if the suite should be tested. + * + * @private + * @param {Suite} suite - suite to check + * @returns {boolean} + */ + function shouldBeTested(suite) { + return ( + !mocha.options.grep || + (mocha.options.grep && + mocha.options.grep.test(suite.fullTitle()) && + !mocha.options.invert) + ); + } + + return { + /** + * This is only present if flag --delay is passed into Mocha. It triggers + * root suite execution. + * + * @param {Suite} suite The root suite. + * @return {Function} A function which runs the root suite + */ + runWithSuite: function runWithSuite(suite) { + return function run() { + suite.run(); + }; + }, + + /** + * Execute before running tests. + * + * @param {string} name + * @param {Function} fn + */ + before: function (name, fn) { + suites[0].beforeAll(name, fn); + }, + + /** + * Execute after running tests. + * + * @param {string} name + * @param {Function} fn + */ + after: function (name, fn) { + suites[0].afterAll(name, fn); + }, + + /** + * Execute before each test case. + * + * @param {string} name + * @param {Function} fn + */ + beforeEach: function (name, fn) { + suites[0].beforeEach(name, fn); + }, + + /** + * Execute after each test case. + * + * @param {string} name + * @param {Function} fn + */ + afterEach: function (name, fn) { + suites[0].afterEach(name, fn); + }, + + suite: { + /** + * Create an exclusive Suite; convenience function + * See docstring for create() below. + * + * @param {Object} opts + * @returns {Suite} + */ + only: function only(opts) { + if (mocha.options.forbidOnly) { + throw createForbiddenExclusivityError(mocha); + } + opts.isOnly = true; + return this.create(opts); + }, + + /** + * Create a Suite, but skip it; convenience function + * See docstring for create() below. + * + * @param {Object} opts + * @returns {Suite} + */ + skip: function skip(opts) { + opts.pending = true; + return this.create(opts); + }, + + /** + * Creates a suite. + * + * @param {Object} opts Options + * @param {string} opts.title Title of Suite + * @param {Function} [opts.fn] Suite Function (not always applicable) + * @param {boolean} [opts.pending] Is Suite pending? + * @param {string} [opts.file] Filepath where this Suite resides + * @param {boolean} [opts.isOnly] Is Suite exclusive? + * @returns {Suite} + */ + create: function create(opts) { + var suite = Suite$1.create(suites[0], opts.title); + suite.pending = Boolean(opts.pending); + suite.file = opts.file; + suites.unshift(suite); + if (opts.isOnly) { + suite.markOnly(); + } + if ( + suite.pending && + mocha.options.forbidPending && + shouldBeTested(suite) + ) { + throw createUnsupportedError('Pending test forbidden'); + } + if (typeof opts.fn === 'function') { + opts.fn.call(suite); + suites.shift(); + } else if (typeof opts.fn === 'undefined' && !suite.pending) { + throw createMissingArgumentError( + 'Suite "' + + suite.fullTitle() + + '" was defined but no callback was supplied. ' + + 'Supply a callback or explicitly skip the suite.', + 'callback', + 'function' + ); + } else if (!opts.fn && suite.pending) { + suites.shift(); + } + + return suite; + } + }, + + test: { + /** + * Exclusive test-case. + * + * @param {Object} mocha + * @param {Function} test + * @returns {*} + */ + only: function (mocha, test) { + if (mocha.options.forbidOnly) { + throw createForbiddenExclusivityError(mocha); + } + test.markOnly(); + return test; + }, + + /** + * Pending test case. + * + * @param {string} title + */ + skip: function (title) { + context.test(title); + } + } + }; + }; + + var Test$3 = test; + var EVENT_FILE_PRE_REQUIRE$2 = + suite.exports.constants.EVENT_FILE_PRE_REQUIRE; + + /** + * BDD-style interface: + * + * describe('Array', function() { + * describe('#indexOf()', function() { + * it('should return -1 when not present', function() { + * // ... + * }); + * + * it('should return the index when present', function() { + * // ... + * }); + * }); + * }); + * + * @param {Suite} suite Root suite. + */ + bdd.exports = function bddInterface(suite) { + var suites = [suite]; + + suite.on(EVENT_FILE_PRE_REQUIRE$2, function (context, file, mocha) { + var common$1 = common(suites, context, mocha); + + context.before = common$1.before; + context.after = common$1.after; + context.beforeEach = common$1.beforeEach; + context.afterEach = common$1.afterEach; + context.run = mocha.options.delay && common$1.runWithSuite(suite); + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.describe = context.context = function (title, fn) { + return common$1.suite.create({ + title, + file, + fn + }); + }; + + /** + * Pending describe. + */ + + context.xdescribe = + context.xcontext = + context.describe.skip = + function (title, fn) { + return common$1.suite.skip({ + title, + file, + fn + }); + }; + + /** + * Exclusive suite. + */ + + context.describe.only = function (title, fn) { + return common$1.suite.only({ + title, + file, + fn + }); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.it = context.specify = function (title, fn) { + var suite = suites[0]; + if (suite.isPending()) { + fn = null; + } + var test = new Test$3(title, fn); + test.file = file; + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.it.only = function (title, fn) { + return common$1.test.only(mocha, context.it(title, fn)); + }; + + /** + * Pending test case. + */ + + context.xit = + context.xspecify = + context.it.skip = + function (title) { + return context.it(title); + }; + }); + }; + + bdd.exports.description = 'BDD or RSpec style [default]'; + + var tdd = {exports: {}}; + + var Test$2 = test; + var EVENT_FILE_PRE_REQUIRE$1 = + suite.exports.constants.EVENT_FILE_PRE_REQUIRE; + + /** + * TDD-style interface: + * + * suite('Array', function() { + * suite('#indexOf()', function() { + * suiteSetup(function() { + * + * }); + * + * test('should return -1 when not present', function() { + * + * }); + * + * test('should return the index when present', function() { + * + * }); + * + * suiteTeardown(function() { + * + * }); + * }); + * }); + * + * @param {Suite} suite Root suite. + */ + tdd.exports = function (suite) { + var suites = [suite]; + + suite.on(EVENT_FILE_PRE_REQUIRE$1, function (context, file, mocha) { + var common$1 = common(suites, context, mocha); + + context.setup = common$1.beforeEach; + context.teardown = common$1.afterEach; + context.suiteSetup = common$1.before; + context.suiteTeardown = common$1.after; + context.run = mocha.options.delay && common$1.runWithSuite(suite); + + /** + * Describe a "suite" with the given `title` and callback `fn` containing + * nested suites and/or tests. + */ + context.suite = function (title, fn) { + return common$1.suite.create({ + title, + file, + fn + }); + }; + + /** + * Pending suite. + */ + context.suite.skip = function (title, fn) { + return common$1.suite.skip({ + title, + file, + fn + }); + }; + + /** + * Exclusive test-case. + */ + context.suite.only = function (title, fn) { + return common$1.suite.only({ + title, + file, + fn + }); + }; + + /** + * Describe a specification or test-case with the given `title` and + * callback `fn` acting as a thunk. + */ + context.test = function (title, fn) { + var suite = suites[0]; + if (suite.isPending()) { + fn = null; + } + var test = new Test$2(title, fn); + test.file = file; + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function (title, fn) { + return common$1.test.only(mocha, context.test(title, fn)); + }; + + context.test.skip = common$1.test.skip; + }); + }; + + tdd.exports.description = + 'traditional "suite"/"test" instead of BDD\'s "describe"/"it"'; + + var qunit = {exports: {}}; + + var Test$1 = test; + var EVENT_FILE_PRE_REQUIRE = + suite.exports.constants.EVENT_FILE_PRE_REQUIRE; + + /** + * QUnit-style interface: + * + * suite('Array'); + * + * test('#length', function() { + * var arr = [1,2,3]; + * ok(arr.length == 3); + * }); + * + * test('#indexOf()', function() { + * var arr = [1,2,3]; + * ok(arr.indexOf(1) == 0); + * ok(arr.indexOf(2) == 1); + * ok(arr.indexOf(3) == 2); + * }); + * + * suite('String'); + * + * test('#length', function() { + * ok('foo'.length == 3); + * }); + * + * @param {Suite} suite Root suite. + */ + qunit.exports = function qUnitInterface(suite) { + var suites = [suite]; + + suite.on(EVENT_FILE_PRE_REQUIRE, function (context, file, mocha) { + var common$1 = common(suites, context, mocha); + + context.before = common$1.before; + context.after = common$1.after; + context.beforeEach = common$1.beforeEach; + context.afterEach = common$1.afterEach; + context.run = mocha.options.delay && common$1.runWithSuite(suite); + /** + * Describe a "suite" with the given `title`. + */ + + context.suite = function (title) { + if (suites.length > 1) { + suites.shift(); + } + return common$1.suite.create({ + title, + file, + fn: false + }); + }; + + /** + * Exclusive Suite. + */ + + context.suite.only = function (title) { + if (suites.length > 1) { + suites.shift(); + } + return common$1.suite.only({ + title, + file, + fn: false + }); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function (title, fn) { + var test = new Test$1(title, fn); + test.file = file; + suites[0].addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function (title, fn) { + return common$1.test.only(mocha, context.test(title, fn)); + }; + + context.test.skip = common$1.test.skip; + }); + }; + + qunit.exports.description = 'QUnit style'; + + var exports$1 = {exports: {}}; + + var Suite = suite.exports; + var Test = test; + + /** + * Exports-style (as Node.js module) interface: + * + * exports.Array = { + * '#indexOf()': { + * 'should return -1 when the value is not present': function() { + * + * }, + * + * 'should return the correct index when the value is present': function() { + * + * } + * } + * }; + * + * @param {Suite} suite Root suite. + */ + exports$1.exports = function (suite) { + var suites = [suite]; + + suite.on(Suite.constants.EVENT_FILE_REQUIRE, visit); + + function visit(obj, file) { + var suite; + for (var key in obj) { + if (typeof obj[key] === 'function') { + var fn = obj[key]; + switch (key) { + case 'before': + suites[0].beforeAll(fn); + break; + case 'after': + suites[0].afterAll(fn); + break; + case 'beforeEach': + suites[0].beforeEach(fn); + break; + case 'afterEach': + suites[0].afterEach(fn); + break; + default: + var test = new Test(key, fn); + test.file = file; + suites[0].addTest(test); + } + } else { + suite = Suite.create(suites[0], key); + suites.unshift(suite); + visit(obj[key], file); + suites.shift(); + } + } + } + }; + + exports$1.exports.description = 'Node.js module ("exports") style'; + + interfaces.bdd = bdd.exports; + interfaces.tdd = tdd.exports; + interfaces.qunit = qunit.exports; + interfaces.exports = exports$1.exports; + + /** + * @module Context + */ + /** + * Expose `Context`. + */ + + var context = Context; + + /** + * Initialize a new `Context`. + * + * @private + */ + function Context() {} + + /** + * Set or get the context `Runnable` to `runnable`. + * + * @private + * @param {Runnable} runnable + * @return {Context} context + */ + Context.prototype.runnable = function (runnable) { + if (!arguments.length) { + return this._runnable; + } + this.test = this._runnable = runnable; + return this; + }; + + /** + * Set or get test timeout `ms`. + * + * @private + * @param {number} ms + * @return {Context} self + */ + Context.prototype.timeout = function (ms) { + if (!arguments.length) { + return this.runnable().timeout(); + } + this.runnable().timeout(ms); + return this; + }; + + /** + * Set or get test slowness threshold `ms`. + * + * @private + * @param {number} ms + * @return {Context} self + */ + Context.prototype.slow = function (ms) { + if (!arguments.length) { + return this.runnable().slow(); + } + this.runnable().slow(ms); + return this; + }; + + /** + * Mark a test as skipped. + * + * @private + * @throws Pending + */ + Context.prototype.skip = function () { + this.runnable().skip(); + }; + + /** + * Set or get a number of allowed retries on failed tests + * + * @private + * @param {number} n + * @return {Context} self + */ + Context.prototype.retries = function (n) { + if (!arguments.length) { + return this.runnable().retries(); + } + this.runnable().retries(n); + return this; + }; + + var name = "mocha"; + var version = "10.2.0"; + var homepage = "https://mochajs.org/"; + var notifyLogo = "https://ibin.co/4QuRuGjXvl36.png"; + var require$$17 = { + name: name, + version: version, + homepage: homepage, + notifyLogo: notifyLogo + }; + + (function (module, exports) { + + /*! + * mocha + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + + var escapeRe = escapeStringRegexp; + var path = require$$1; + var builtinReporters = reporters; + var utils = utils$3; + var mocharc = require$$4; + var Suite = suite.exports; + var esmUtils = require$$18; + var createStatsCollector = statsCollector; + const { + createInvalidReporterError, + createInvalidInterfaceError, + createMochaInstanceAlreadyDisposedError, + createMochaInstanceAlreadyRunningError, + createUnsupportedError + } = errors$2; + const {EVENT_FILE_PRE_REQUIRE, EVENT_FILE_POST_REQUIRE, EVENT_FILE_REQUIRE} = + Suite.constants; + var debug = browser.exports('mocha:mocha'); + + exports = module.exports = Mocha; + + /** + * A Mocha instance is a finite state machine. + * These are the states it can be in. + * @private + */ + var mochaStates = utils.defineConstants({ + /** + * Initial state of the mocha instance + * @private + */ + INIT: 'init', + /** + * Mocha instance is running tests + * @private + */ + RUNNING: 'running', + /** + * Mocha instance is done running tests and references to test functions and hooks are cleaned. + * You can reset this state by unloading the test files. + * @private + */ + REFERENCES_CLEANED: 'referencesCleaned', + /** + * Mocha instance is disposed and can no longer be used. + * @private + */ + DISPOSED: 'disposed' + }); + + /** + * To require local UIs and reporters when running in node. + */ + + if (!utils.isBrowser() && typeof module.paths !== 'undefined') { + var cwd = utils.cwd(); + module.paths.push(cwd, path.join(cwd, 'node_modules')); + } + + /** + * Expose internals. + * @private + */ + + exports.utils = utils; + exports.interfaces = interfaces; + /** + * @public + * @memberof Mocha + */ + exports.reporters = builtinReporters; + exports.Runnable = runnable; + exports.Context = context; + /** + * + * @memberof Mocha + */ + exports.Runner = runner; + exports.Suite = Suite; + exports.Hook = hook; + exports.Test = test; + + let currentContext; + exports.afterEach = function (...args) { + return (currentContext.afterEach || currentContext.teardown).apply( + this, + args + ); + }; + exports.after = function (...args) { + return (currentContext.after || currentContext.suiteTeardown).apply( + this, + args + ); + }; + exports.beforeEach = function (...args) { + return (currentContext.beforeEach || currentContext.setup).apply(this, args); + }; + exports.before = function (...args) { + return (currentContext.before || currentContext.suiteSetup).apply(this, args); + }; + exports.describe = function (...args) { + return (currentContext.describe || currentContext.suite).apply(this, args); + }; + exports.describe.only = function (...args) { + return (currentContext.describe || currentContext.suite).only.apply( + this, + args + ); + }; + exports.describe.skip = function (...args) { + return (currentContext.describe || currentContext.suite).skip.apply( + this, + args + ); + }; + exports.it = function (...args) { + return (currentContext.it || currentContext.test).apply(this, args); + }; + exports.it.only = function (...args) { + return (currentContext.it || currentContext.test).only.apply(this, args); + }; + exports.it.skip = function (...args) { + return (currentContext.it || currentContext.test).skip.apply(this, args); + }; + exports.xdescribe = exports.describe.skip; + exports.xit = exports.it.skip; + exports.setup = exports.beforeEach; + exports.suiteSetup = exports.before; + exports.suiteTeardown = exports.after; + exports.suite = exports.describe; + exports.teardown = exports.afterEach; + exports.test = exports.it; + exports.run = function (...args) { + return currentContext.run.apply(this, args); + }; + + /** + * Constructs a new Mocha instance with `options`. + * + * @public + * @class Mocha + * @param {Object} [options] - Settings object. + * @param {boolean} [options.allowUncaught] - Propagate uncaught errors? + * @param {boolean} [options.asyncOnly] - Force `done` callback or promise? + * @param {boolean} [options.bail] - Bail after first test failure? + * @param {boolean} [options.checkLeaks] - Check for global variable leaks? + * @param {boolean} [options.color] - Color TTY output from reporter? + * @param {boolean} [options.delay] - Delay root suite execution? + * @param {boolean} [options.diff] - Show diff on failure? + * @param {boolean} [options.dryRun] - Report tests without running them? + * @param {boolean} [options.failZero] - Fail test run if zero tests? + * @param {string} [options.fgrep] - Test filter given string. + * @param {boolean} [options.forbidOnly] - Tests marked `only` fail the suite? + * @param {boolean} [options.forbidPending] - Pending tests fail the suite? + * @param {boolean} [options.fullTrace] - Full stacktrace upon failure? + * @param {string[]} [options.global] - Variables expected in global scope. + * @param {RegExp|string} [options.grep] - Test filter given regular expression. + * @param {boolean} [options.inlineDiffs] - Display inline diffs? + * @param {boolean} [options.invert] - Invert test filter matches? + * @param {boolean} [options.noHighlighting] - Disable syntax highlighting? + * @param {string|constructor} [options.reporter] - Reporter name or constructor. + * @param {Object} [options.reporterOption] - Reporter settings object. + * @param {number} [options.retries] - Number of times to retry failed tests. + * @param {number} [options.slow] - Slow threshold value. + * @param {number|string} [options.timeout] - Timeout threshold value. + * @param {string} [options.ui] - Interface name. + * @param {boolean} [options.parallel] - Run jobs in parallel. + * @param {number} [options.jobs] - Max number of worker processes for parallel runs. + * @param {MochaRootHookObject} [options.rootHooks] - Hooks to bootstrap the root suite with. + * @param {string[]} [options.require] - Pathname of `rootHooks` plugin for parallel runs. + * @param {boolean} [options.isWorker] - Should be `true` if `Mocha` process is running in a worker process. + */ + function Mocha(options = {}) { + options = {...mocharc, ...options}; + this.files = []; + this.options = options; + // root suite + this.suite = new exports.Suite('', new exports.Context(), true); + this._cleanReferencesAfterRun = true; + this._state = mochaStates.INIT; + + this.grep(options.grep) + .fgrep(options.fgrep) + .ui(options.ui) + .reporter( + options.reporter, + options.reporterOption || options.reporterOptions // for backwards compatibility + ) + .slow(options.slow) + .global(options.global); + + // this guard exists because Suite#timeout does not consider `undefined` to be valid input + if (typeof options.timeout !== 'undefined') { + this.timeout(options.timeout === false ? 0 : options.timeout); + } + + if ('retries' in options) { + this.retries(options.retries); + } + + [ + 'allowUncaught', + 'asyncOnly', + 'bail', + 'checkLeaks', + 'color', + 'delay', + 'diff', + 'dryRun', + 'failZero', + 'forbidOnly', + 'forbidPending', + 'fullTrace', + 'inlineDiffs', + 'invert' + ].forEach(function (opt) { + if (options[opt]) { + this[opt](); + } + }, this); + + if (options.rootHooks) { + this.rootHooks(options.rootHooks); + } + + /** + * The class which we'll instantiate in {@link Mocha#run}. Defaults to + * {@link Runner} in serial mode; changes in parallel mode. + * @memberof Mocha + * @private + */ + this._runnerClass = exports.Runner; + + /** + * Whether or not to call {@link Mocha#loadFiles} implicitly when calling + * {@link Mocha#run}. If this is `true`, then it's up to the consumer to call + * {@link Mocha#loadFiles} _or_ {@link Mocha#loadFilesAsync}. + * @private + * @memberof Mocha + */ + this._lazyLoadFiles = false; + + /** + * It's useful for a Mocha instance to know if it's running in a worker process. + * We could derive this via other means, but it's helpful to have a flag to refer to. + * @memberof Mocha + * @private + */ + this.isWorker = Boolean(options.isWorker); + + this.globalSetup(options.globalSetup) + .globalTeardown(options.globalTeardown) + .enableGlobalSetup(options.enableGlobalSetup) + .enableGlobalTeardown(options.enableGlobalTeardown); + + if ( + options.parallel && + (typeof options.jobs === 'undefined' || options.jobs > 1) + ) { + debug('attempting to enable parallel mode'); + this.parallelMode(true); + } + } + + /** + * Enables or disables bailing on the first failure. + * + * @public + * @see [CLI option](../#-bail-b) + * @param {boolean} [bail=true] - Whether to bail on first error. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.bail = function (bail) { + this.suite.bail(bail !== false); + return this; + }; + + /** + * @summary + * Adds `file` to be loaded for execution. + * + * @description + * Useful for generic setup code that must be included within test suite. + * + * @public + * @see [CLI option](../#-file-filedirectoryglob) + * @param {string} file - Pathname of file to be loaded. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.addFile = function (file) { + this.files.push(file); + return this; + }; + + /** + * Sets reporter to `reporter`, defaults to "spec". + * + * @public + * @see [CLI option](../#-reporter-name-r-name) + * @see [Reporters](../#reporters) + * @param {String|Function} reporterName - Reporter name or constructor. + * @param {Object} [reporterOptions] - Options used to configure the reporter. + * @returns {Mocha} this + * @chainable + * @throws {Error} if requested reporter cannot be loaded + * @example + * + * // Use XUnit reporter and direct its output to file + * mocha.reporter('xunit', { output: '/path/to/testspec.xunit.xml' }); + */ + Mocha.prototype.reporter = function (reporterName, reporterOptions) { + if (typeof reporterName === 'function') { + this._reporter = reporterName; + } else { + reporterName = reporterName || 'spec'; + var reporter; + // Try to load a built-in reporter. + if (builtinReporters[reporterName]) { + reporter = builtinReporters[reporterName]; + } + // Try to load reporters from process.cwd() and node_modules + if (!reporter) { + let foundReporter; + try { + foundReporter = require.resolve(reporterName); + reporter = commonjsRequire(foundReporter); + } catch (err) { + if (foundReporter) { + throw createInvalidReporterError(err.message, foundReporter); + } + // Try to load reporters from a cwd-relative path + try { + reporter = commonjsRequire(path.resolve(reporterName)); + } catch (e) { + throw createInvalidReporterError(e.message, reporterName); + } + } + } + this._reporter = reporter; + } + this.options.reporterOption = reporterOptions; + // alias option name is used in built-in reporters xunit/tap/progress + this.options.reporterOptions = reporterOptions; + return this; + }; + + /** + * Sets test UI `name`, defaults to "bdd". + * + * @public + * @see [CLI option](../#-ui-name-u-name) + * @see [Interface DSLs](../#interfaces) + * @param {string|Function} [ui=bdd] - Interface name or class. + * @returns {Mocha} this + * @chainable + * @throws {Error} if requested interface cannot be loaded + */ + Mocha.prototype.ui = function (ui) { + var bindInterface; + if (typeof ui === 'function') { + bindInterface = ui; + } else { + ui = ui || 'bdd'; + bindInterface = exports.interfaces[ui]; + if (!bindInterface) { + try { + bindInterface = commonjsRequire(ui); + } catch (err) { + throw createInvalidInterfaceError(`invalid interface '${ui}'`, ui); + } + } + } + bindInterface(this.suite); + + this.suite.on(EVENT_FILE_PRE_REQUIRE, function (context) { + currentContext = context; + }); + + return this; + }; + + /** + * Loads `files` prior to execution. Does not support ES Modules. + * + * @description + * The implementation relies on Node's `require` to execute + * the test interface functions and will be subject to its cache. + * Supports only CommonJS modules. To load ES modules, use Mocha#loadFilesAsync. + * + * @private + * @see {@link Mocha#addFile} + * @see {@link Mocha#run} + * @see {@link Mocha#unloadFiles} + * @see {@link Mocha#loadFilesAsync} + * @param {Function} [fn] - Callback invoked upon completion. + */ + Mocha.prototype.loadFiles = function (fn) { + var self = this; + var suite = this.suite; + this.files.forEach(function (file) { + file = path.resolve(file); + suite.emit(EVENT_FILE_PRE_REQUIRE, commonjsGlobal, file, self); + suite.emit(EVENT_FILE_REQUIRE, commonjsRequire(file), file, self); + suite.emit(EVENT_FILE_POST_REQUIRE, commonjsGlobal, file, self); + }); + fn && fn(); + }; + + /** + * Loads `files` prior to execution. Supports Node ES Modules. + * + * @description + * The implementation relies on Node's `require` and `import` to execute + * the test interface functions and will be subject to its cache. + * Supports both CJS and ESM modules. + * + * @public + * @see {@link Mocha#addFile} + * @see {@link Mocha#run} + * @see {@link Mocha#unloadFiles} + * @param {Object} [options] - Settings object. + * @param {Function} [options.esmDecorator] - Function invoked on esm module name right before importing it. By default will passthrough as is. + * @returns {Promise} + * @example + * + * // loads ESM (and CJS) test files asynchronously, then runs root suite + * mocha.loadFilesAsync() + * .then(() => mocha.run(failures => process.exitCode = failures ? 1 : 0)) + * .catch(() => process.exitCode = 1); + */ + Mocha.prototype.loadFilesAsync = function ({esmDecorator} = {}) { + var self = this; + var suite = this.suite; + this.lazyLoadFiles(true); + + return esmUtils.loadFilesAsync( + this.files, + function (file) { + suite.emit(EVENT_FILE_PRE_REQUIRE, commonjsGlobal, file, self); + }, + function (file, resultModule) { + suite.emit(EVENT_FILE_REQUIRE, resultModule, file, self); + suite.emit(EVENT_FILE_POST_REQUIRE, commonjsGlobal, file, self); + }, + esmDecorator + ); + }; + + /** + * Removes a previously loaded file from Node's `require` cache. + * + * @private + * @static + * @see {@link Mocha#unloadFiles} + * @param {string} file - Pathname of file to be unloaded. + */ + Mocha.unloadFile = function (file) { + if (utils.isBrowser()) { + throw createUnsupportedError( + 'unloadFile() is only supported in a Node.js environment' + ); + } + return require$$18.unloadFile(file); + }; + + /** + * Unloads `files` from Node's `require` cache. + * + * @description + * This allows required files to be "freshly" reloaded, providing the ability + * to reuse a Mocha instance programmatically. + * Note: does not clear ESM module files from the cache + * + * Intended for consumers — not used internally + * + * @public + * @see {@link Mocha#run} + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.unloadFiles = function () { + if (this._state === mochaStates.DISPOSED) { + throw createMochaInstanceAlreadyDisposedError( + 'Mocha instance is already disposed, it cannot be used again.', + this._cleanReferencesAfterRun, + this + ); + } + + this.files.forEach(function (file) { + Mocha.unloadFile(file); + }); + this._state = mochaStates.INIT; + return this; + }; + + /** + * Sets `grep` filter after escaping RegExp special characters. + * + * @public + * @see {@link Mocha#grep} + * @param {string} str - Value to be converted to a regexp. + * @returns {Mocha} this + * @chainable + * @example + * + * // Select tests whose full title begins with `"foo"` followed by a period + * mocha.fgrep('foo.'); + */ + Mocha.prototype.fgrep = function (str) { + if (!str) { + return this; + } + return this.grep(new RegExp(escapeRe(str))); + }; + + /** + * @summary + * Sets `grep` filter used to select specific tests for execution. + * + * @description + * If `re` is a regexp-like string, it will be converted to regexp. + * The regexp is tested against the full title of each test (i.e., the + * name of the test preceded by titles of each its ancestral suites). + * As such, using an exact-match fixed pattern against the + * test name itself will not yield any matches. + *
    + * Previous filter value will be overwritten on each call! + * + * @public + * @see [CLI option](../#-grep-regexp-g-regexp) + * @see {@link Mocha#fgrep} + * @see {@link Mocha#invert} + * @param {RegExp|String} re - Regular expression used to select tests. + * @return {Mocha} this + * @chainable + * @example + * + * // Select tests whose full title contains `"match"`, ignoring case + * mocha.grep(/match/i); + * @example + * + * // Same as above but with regexp-like string argument + * mocha.grep('/match/i'); + * @example + * + * // ## Anti-example + * // Given embedded test `it('only-this-test')`... + * mocha.grep('/^only-this-test$/'); // NO! Use `.only()` to do this! + */ + Mocha.prototype.grep = function (re) { + if (utils.isString(re)) { + // extract args if it's regex-like, i.e: [string, pattern, flag] + var arg = re.match(/^\/(.*)\/([gimy]{0,4})$|.*/); + this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); + } else { + this.options.grep = re; + } + return this; + }; + + /** + * Inverts `grep` matches. + * + * @public + * @see {@link Mocha#grep} + * @return {Mocha} this + * @chainable + * @example + * + * // Select tests whose full title does *not* contain `"match"`, ignoring case + * mocha.grep(/match/i).invert(); + */ + Mocha.prototype.invert = function () { + this.options.invert = true; + return this; + }; + + /** + * Enables or disables checking for global variables leaked while running tests. + * + * @public + * @see [CLI option](../#-check-leaks) + * @param {boolean} [checkLeaks=true] - Whether to check for global variable leaks. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.checkLeaks = function (checkLeaks) { + this.options.checkLeaks = checkLeaks !== false; + return this; + }; + + /** + * Enables or disables whether or not to dispose after each test run. + * Disable this to ensure you can run the test suite multiple times. + * If disabled, be sure to dispose mocha when you're done to prevent memory leaks. + * @public + * @see {@link Mocha#dispose} + * @param {boolean} cleanReferencesAfterRun + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.cleanReferencesAfterRun = function (cleanReferencesAfterRun) { + this._cleanReferencesAfterRun = cleanReferencesAfterRun !== false; + return this; + }; + + /** + * Manually dispose this mocha instance. Mark this instance as `disposed` and unable to run more tests. + * It also removes function references to tests functions and hooks, so variables trapped in closures can be cleaned by the garbage collector. + * @public + */ + Mocha.prototype.dispose = function () { + if (this._state === mochaStates.RUNNING) { + throw createMochaInstanceAlreadyRunningError( + 'Cannot dispose while the mocha instance is still running tests.' + ); + } + this.unloadFiles(); + this._previousRunner && this._previousRunner.dispose(); + this.suite.dispose(); + this._state = mochaStates.DISPOSED; + }; + + /** + * Displays full stack trace upon test failure. + * + * @public + * @see [CLI option](../#-full-trace) + * @param {boolean} [fullTrace=true] - Whether to print full stacktrace upon failure. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.fullTrace = function (fullTrace) { + this.options.fullTrace = fullTrace !== false; + return this; + }; + + /** + * Specifies whitelist of variable names to be expected in global scope. + * + * @public + * @see [CLI option](../#-global-variable-name) + * @see {@link Mocha#checkLeaks} + * @param {String[]|String} global - Accepted global variable name(s). + * @return {Mocha} this + * @chainable + * @example + * + * // Specify variables to be expected in global scope + * mocha.global(['jQuery', 'MyLib']); + */ + Mocha.prototype.global = function (global) { + this.options.global = (this.options.global || []) + .concat(global) + .filter(Boolean) + .filter(function (elt, idx, arr) { + return arr.indexOf(elt) === idx; + }); + return this; + }; + // for backwards compatibility, 'globals' is an alias of 'global' + Mocha.prototype.globals = Mocha.prototype.global; + + /** + * Enables or disables TTY color output by screen-oriented reporters. + * + * @public + * @see [CLI option](../#-color-c-colors) + * @param {boolean} [color=true] - Whether to enable color output. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.color = function (color) { + this.options.color = color !== false; + return this; + }; + + /** + * Enables or disables reporter to use inline diffs (rather than +/-) + * in test failure output. + * + * @public + * @see [CLI option](../#-inline-diffs) + * @param {boolean} [inlineDiffs=true] - Whether to use inline diffs. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.inlineDiffs = function (inlineDiffs) { + this.options.inlineDiffs = inlineDiffs !== false; + return this; + }; + + /** + * Enables or disables reporter to include diff in test failure output. + * + * @public + * @see [CLI option](../#-diff) + * @param {boolean} [diff=true] - Whether to show diff on failure. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.diff = function (diff) { + this.options.diff = diff !== false; + return this; + }; + + /** + * @summary + * Sets timeout threshold value. + * + * @description + * A string argument can use shorthand (such as "2s") and will be converted. + * If the value is `0`, timeouts will be disabled. + * + * @public + * @see [CLI option](../#-timeout-ms-t-ms) + * @see [Timeouts](../#timeouts) + * @param {number|string} msecs - Timeout threshold value. + * @return {Mocha} this + * @chainable + * @example + * + * // Sets timeout to one second + * mocha.timeout(1000); + * @example + * + * // Same as above but using string argument + * mocha.timeout('1s'); + */ + Mocha.prototype.timeout = function (msecs) { + this.suite.timeout(msecs); + return this; + }; + + /** + * Sets the number of times to retry failed tests. + * + * @public + * @see [CLI option](../#-retries-n) + * @see [Retry Tests](../#retry-tests) + * @param {number} retry - Number of times to retry failed tests. + * @return {Mocha} this + * @chainable + * @example + * + * // Allow any failed test to retry one more time + * mocha.retries(1); + */ + Mocha.prototype.retries = function (retry) { + this.suite.retries(retry); + return this; + }; + + /** + * Sets slowness threshold value. + * + * @public + * @see [CLI option](../#-slow-ms-s-ms) + * @param {number} msecs - Slowness threshold value. + * @return {Mocha} this + * @chainable + * @example + * + * // Sets "slow" threshold to half a second + * mocha.slow(500); + * @example + * + * // Same as above but using string argument + * mocha.slow('0.5s'); + */ + Mocha.prototype.slow = function (msecs) { + this.suite.slow(msecs); + return this; + }; + + /** + * Forces all tests to either accept a `done` callback or return a promise. + * + * @public + * @see [CLI option](../#-async-only-a) + * @param {boolean} [asyncOnly=true] - Whether to force `done` callback or promise. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.asyncOnly = function (asyncOnly) { + this.options.asyncOnly = asyncOnly !== false; + return this; + }; + + /** + * Disables syntax highlighting (in browser). + * + * @public + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.noHighlighting = function () { + this.options.noHighlighting = true; + return this; + }; + + /** + * Enables or disables uncaught errors to propagate. + * + * @public + * @see [CLI option](../#-allow-uncaught) + * @param {boolean} [allowUncaught=true] - Whether to propagate uncaught errors. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.allowUncaught = function (allowUncaught) { + this.options.allowUncaught = allowUncaught !== false; + return this; + }; + + /** + * @summary + * Delays root suite execution. + * + * @description + * Used to perform async operations before any suites are run. + * + * @public + * @see [delayed root suite](../#delayed-root-suite) + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.delay = function delay() { + this.options.delay = true; + return this; + }; + + /** + * Enables or disables running tests in dry-run mode. + * + * @public + * @see [CLI option](../#-dry-run) + * @param {boolean} [dryRun=true] - Whether to activate dry-run mode. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.dryRun = function (dryRun) { + this.options.dryRun = dryRun !== false; + return this; + }; + + /** + * Fails test run if no tests encountered with exit-code 1. + * + * @public + * @see [CLI option](../#-fail-zero) + * @param {boolean} [failZero=true] - Whether to fail test run. + * @return {Mocha} this + * @chainable + */ + Mocha.prototype.failZero = function (failZero) { + this.options.failZero = failZero !== false; + return this; + }; + + /** + * Causes tests marked `only` to fail the suite. + * + * @public + * @see [CLI option](../#-forbid-only) + * @param {boolean} [forbidOnly=true] - Whether tests marked `only` fail the suite. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.forbidOnly = function (forbidOnly) { + this.options.forbidOnly = forbidOnly !== false; + return this; + }; + + /** + * Causes pending tests and tests marked `skip` to fail the suite. + * + * @public + * @see [CLI option](../#-forbid-pending) + * @param {boolean} [forbidPending=true] - Whether pending tests fail the suite. + * @returns {Mocha} this + * @chainable + */ + Mocha.prototype.forbidPending = function (forbidPending) { + this.options.forbidPending = forbidPending !== false; + return this; + }; + + /** + * Throws an error if mocha is in the wrong state to be able to transition to a "running" state. + * @private + */ + Mocha.prototype._guardRunningStateTransition = function () { + if (this._state === mochaStates.RUNNING) { + throw createMochaInstanceAlreadyRunningError( + 'Mocha instance is currently running tests, cannot start a next test run until this one is done', + this + ); + } + if ( + this._state === mochaStates.DISPOSED || + this._state === mochaStates.REFERENCES_CLEANED + ) { + throw createMochaInstanceAlreadyDisposedError( + 'Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', + this._cleanReferencesAfterRun, + this + ); + } + }; + + /** + * Mocha version as specified by "package.json". + * + * @name Mocha#version + * @type string + * @readonly + */ + Object.defineProperty(Mocha.prototype, 'version', { + value: require$$17.version, + configurable: false, + enumerable: true, + writable: false + }); + + /** + * Callback to be invoked when test execution is complete. + * + * @private + * @callback DoneCB + * @param {number} failures - Number of failures that occurred. + */ + + /** + * Runs root suite and invokes `fn()` when complete. + * + * @description + * To run tests multiple times (or to run tests in files that are + * already in the `require` cache), make sure to clear them from + * the cache first! + * + * @public + * @see {@link Mocha#unloadFiles} + * @see {@link Runner#run} + * @param {DoneCB} [fn] - Callback invoked when test execution completed. + * @returns {Runner} runner instance + * @example + * + * // exit with non-zero status if there were test failures + * mocha.run(failures => process.exitCode = failures ? 1 : 0); + */ + Mocha.prototype.run = function (fn) { + this._guardRunningStateTransition(); + this._state = mochaStates.RUNNING; + if (this._previousRunner) { + this._previousRunner.dispose(); + this.suite.reset(); + } + if (this.files.length && !this._lazyLoadFiles) { + this.loadFiles(); + } + var suite = this.suite; + var options = this.options; + options.files = this.files; + const runner = new this._runnerClass(suite, { + cleanReferencesAfterRun: this._cleanReferencesAfterRun, + delay: options.delay, + dryRun: options.dryRun, + failZero: options.failZero + }); + createStatsCollector(runner); + var reporter = new this._reporter(runner, options); + runner.checkLeaks = options.checkLeaks === true; + runner.fullStackTrace = options.fullTrace; + runner.asyncOnly = options.asyncOnly; + runner.allowUncaught = options.allowUncaught; + runner.forbidOnly = options.forbidOnly; + runner.forbidPending = options.forbidPending; + if (options.grep) { + runner.grep(options.grep, options.invert); + } + if (options.global) { + runner.globals(options.global); + } + if (options.color !== undefined) { + exports.reporters.Base.useColors = options.color; + } + exports.reporters.Base.inlineDiffs = options.inlineDiffs; + exports.reporters.Base.hideDiff = !options.diff; + + const done = failures => { + this._previousRunner = runner; + this._state = this._cleanReferencesAfterRun + ? mochaStates.REFERENCES_CLEANED + : mochaStates.INIT; + fn = fn || utils.noop; + if (typeof reporter.done === 'function') { + reporter.done(failures, fn); + } else { + fn(failures); + } + }; + + const runAsync = async runner => { + const context = + this.options.enableGlobalSetup && this.hasGlobalSetupFixtures() + ? await this.runGlobalSetup(runner) + : {}; + const failureCount = await runner.runAsync({ + files: this.files, + options + }); + if (this.options.enableGlobalTeardown && this.hasGlobalTeardownFixtures()) { + await this.runGlobalTeardown(runner, {context}); + } + return failureCount; + }; + + // no "catch" here is intentional. errors coming out of + // Runner#run are considered uncaught/unhandled and caught + // by the `process` event listeners. + // also: returning anything other than `runner` would be a breaking + // change + runAsync(runner).then(done); + + return runner; + }; + + /** + * Assigns hooks to the root suite + * @param {MochaRootHookObject} [hooks] - Hooks to assign to root suite + * @chainable + */ + Mocha.prototype.rootHooks = function rootHooks({ + beforeAll = [], + beforeEach = [], + afterAll = [], + afterEach = [] + } = {}) { + beforeAll = utils.castArray(beforeAll); + beforeEach = utils.castArray(beforeEach); + afterAll = utils.castArray(afterAll); + afterEach = utils.castArray(afterEach); + beforeAll.forEach(hook => { + this.suite.beforeAll(hook); + }); + beforeEach.forEach(hook => { + this.suite.beforeEach(hook); + }); + afterAll.forEach(hook => { + this.suite.afterAll(hook); + }); + afterEach.forEach(hook => { + this.suite.afterEach(hook); + }); + return this; + }; + + /** + * Toggles parallel mode. + * + * Must be run before calling {@link Mocha#run}. Changes the `Runner` class to + * use; also enables lazy file loading if not already done so. + * + * Warning: when passed `false` and lazy loading has been enabled _via any means_ (including calling `parallelMode(true)`), this method will _not_ disable lazy loading. Lazy loading is a prerequisite for parallel + * mode, but parallel mode is _not_ a prerequisite for lazy loading! + * @param {boolean} [enable] - If `true`, enable; otherwise disable. + * @throws If run in browser + * @throws If Mocha not in `INIT` state + * @returns {Mocha} + * @chainable + * @public + */ + Mocha.prototype.parallelMode = function parallelMode(enable = true) { + if (utils.isBrowser()) { + throw createUnsupportedError('parallel mode is only supported in Node.js'); + } + const parallel = Boolean(enable); + if ( + parallel === this.options.parallel && + this._lazyLoadFiles && + this._runnerClass !== exports.Runner + ) { + return this; + } + if (this._state !== mochaStates.INIT) { + throw createUnsupportedError( + 'cannot change parallel mode after having called run()' + ); + } + this.options.parallel = parallel; + + // swap Runner class + this._runnerClass = parallel + ? require$$18 + : exports.Runner; + + // lazyLoadFiles may have been set `true` otherwise (for ESM loading), + // so keep `true` if so. + return this.lazyLoadFiles(this._lazyLoadFiles || parallel); + }; + + /** + * Disables implicit call to {@link Mocha#loadFiles} in {@link Mocha#run}. This + * setting is used by watch mode, parallel mode, and for loading ESM files. + * @todo This should throw if we've already loaded files; such behavior + * necessitates adding a new state. + * @param {boolean} [enable] - If `true`, disable eager loading of files in + * {@link Mocha#run} + * @chainable + * @public + */ + Mocha.prototype.lazyLoadFiles = function lazyLoadFiles(enable) { + this._lazyLoadFiles = enable === true; + debug('set lazy load to %s', enable); + return this; + }; + + /** + * Configures one or more global setup fixtures. + * + * If given no parameters, _unsets_ any previously-set fixtures. + * @chainable + * @public + * @param {MochaGlobalFixture|MochaGlobalFixture[]} [setupFns] - Global setup fixture(s) + * @returns {Mocha} + */ + Mocha.prototype.globalSetup = function globalSetup(setupFns = []) { + setupFns = utils.castArray(setupFns); + this.options.globalSetup = setupFns; + debug('configured %d global setup functions', setupFns.length); + return this; + }; + + /** + * Configures one or more global teardown fixtures. + * + * If given no parameters, _unsets_ any previously-set fixtures. + * @chainable + * @public + * @param {MochaGlobalFixture|MochaGlobalFixture[]} [teardownFns] - Global teardown fixture(s) + * @returns {Mocha} + */ + Mocha.prototype.globalTeardown = function globalTeardown(teardownFns = []) { + teardownFns = utils.castArray(teardownFns); + this.options.globalTeardown = teardownFns; + debug('configured %d global teardown functions', teardownFns.length); + return this; + }; + + /** + * Run any global setup fixtures sequentially, if any. + * + * This is _automatically called_ by {@link Mocha#run} _unless_ the `runGlobalSetup` option is `false`; see {@link Mocha#enableGlobalSetup}. + * + * The context object this function resolves with should be consumed by {@link Mocha#runGlobalTeardown}. + * @param {object} [context] - Context object if already have one + * @public + * @returns {Promise} Context object + */ + Mocha.prototype.runGlobalSetup = async function runGlobalSetup(context = {}) { + const {globalSetup} = this.options; + if (globalSetup && globalSetup.length) { + debug('run(): global setup starting'); + await this._runGlobalFixtures(globalSetup, context); + debug('run(): global setup complete'); + } + return context; + }; + + /** + * Run any global teardown fixtures sequentially, if any. + * + * This is _automatically called_ by {@link Mocha#run} _unless_ the `runGlobalTeardown` option is `false`; see {@link Mocha#enableGlobalTeardown}. + * + * Should be called with context object returned by {@link Mocha#runGlobalSetup}, if applicable. + * @param {object} [context] - Context object if already have one + * @public + * @returns {Promise} Context object + */ + Mocha.prototype.runGlobalTeardown = async function runGlobalTeardown( + context = {} + ) { + const {globalTeardown} = this.options; + if (globalTeardown && globalTeardown.length) { + debug('run(): global teardown starting'); + await this._runGlobalFixtures(globalTeardown, context); + } + debug('run(): global teardown complete'); + return context; + }; + + /** + * Run global fixtures sequentially with context `context` + * @private + * @param {MochaGlobalFixture[]} [fixtureFns] - Fixtures to run + * @param {object} [context] - context object + * @returns {Promise} context object + */ + Mocha.prototype._runGlobalFixtures = async function _runGlobalFixtures( + fixtureFns = [], + context = {} + ) { + for await (const fixtureFn of fixtureFns) { + await fixtureFn.call(context); + } + return context; + }; + + /** + * Toggle execution of any global setup fixture(s) + * + * @chainable + * @public + * @param {boolean } [enabled=true] - If `false`, do not run global setup fixture + * @returns {Mocha} + */ + Mocha.prototype.enableGlobalSetup = function enableGlobalSetup(enabled = true) { + this.options.enableGlobalSetup = Boolean(enabled); + return this; + }; + + /** + * Toggle execution of any global teardown fixture(s) + * + * @chainable + * @public + * @param {boolean } [enabled=true] - If `false`, do not run global teardown fixture + * @returns {Mocha} + */ + Mocha.prototype.enableGlobalTeardown = function enableGlobalTeardown( + enabled = true + ) { + this.options.enableGlobalTeardown = Boolean(enabled); + return this; + }; + + /** + * Returns `true` if one or more global setup fixtures have been supplied. + * @public + * @returns {boolean} + */ + Mocha.prototype.hasGlobalSetupFixtures = function hasGlobalSetupFixtures() { + return Boolean(this.options.globalSetup.length); + }; + + /** + * Returns `true` if one or more global teardown fixtures have been supplied. + * @public + * @returns {boolean} + */ + Mocha.prototype.hasGlobalTeardownFixtures = + function hasGlobalTeardownFixtures() { + return Boolean(this.options.globalTeardown.length); + }; + + /** + * An alternative way to define root hooks that works with parallel runs. + * @typedef {Object} MochaRootHookObject + * @property {Function|Function[]} [beforeAll] - "Before all" hook(s) + * @property {Function|Function[]} [beforeEach] - "Before each" hook(s) + * @property {Function|Function[]} [afterAll] - "After all" hook(s) + * @property {Function|Function[]} [afterEach] - "After each" hook(s) + */ + + /** + * An function that returns a {@link MochaRootHookObject}, either sync or async. + @callback MochaRootHookFunction + * @returns {MochaRootHookObject|Promise} + */ + + /** + * A function that's invoked _once_ which is either sync or async. + * Can be a "teardown" or "setup". These will all share the same context. + * @callback MochaGlobalFixture + * @returns {void|Promise} + */ + + /** + * An object making up all necessary parts of a plugin loader and aggregator + * @typedef {Object} PluginDefinition + * @property {string} exportName - Named export to use + * @property {string} [optionName] - Option name for Mocha constructor (use `exportName` if omitted) + * @property {PluginValidator} [validate] - Validator function + * @property {PluginFinalizer} [finalize] - Finalizer/aggregator function + */ + + /** + * A (sync) function to assert a user-supplied plugin implementation is valid. + * + * Defined in a {@link PluginDefinition}. + + * @callback PluginValidator + * @param {*} value - Value to check + * @this {PluginDefinition} + * @returns {void} + */ + + /** + * A function to finalize plugins impls of a particular ilk + * @callback PluginFinalizer + * @param {Array<*>} impls - User-supplied implementations + * @returns {Promise<*>|*} + */ + }(mocha$1, mocha$1.exports)); + + /* eslint no-unused-vars: off */ + /* eslint-env commonjs */ + + /** + * Shim process.stdout. + */ + + process.stdout = browserStdout({label: false}); + + var parseQuery = parseQuery$1; + var highlightTags = highlightTags$1; + var Mocha = mocha$1.exports; + + /** + * Create a Mocha instance. + * + * @return {undefined} + */ + + var mocha = new Mocha({reporter: 'html'}); + + /** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + + var Date$1 = commonjsGlobal.Date; + var setTimeout$1 = commonjsGlobal.setTimeout; + commonjsGlobal.setInterval; + commonjsGlobal.clearTimeout; + commonjsGlobal.clearInterval; + + var uncaughtExceptionHandlers = []; + + var originalOnerrorHandler = commonjsGlobal.onerror; + + /** + * Remove uncaughtException listener. + * Revert to original onerror handler if previously defined. + */ + + process.removeListener = function (e, fn) { + if (e === 'uncaughtException') { + if (originalOnerrorHandler) { + commonjsGlobal.onerror = originalOnerrorHandler; + } else { + commonjsGlobal.onerror = function () {}; + } + var i = uncaughtExceptionHandlers.indexOf(fn); + if (i !== -1) { + uncaughtExceptionHandlers.splice(i, 1); + } + } + }; + + /** + * Implements listenerCount for 'uncaughtException'. + */ + + process.listenerCount = function (name) { + if (name === 'uncaughtException') { + return uncaughtExceptionHandlers.length; + } + return 0; + }; + + /** + * Implements uncaughtException listener. + */ + + process.on = function (e, fn) { + if (e === 'uncaughtException') { + commonjsGlobal.onerror = function (err, url, line) { + fn(new Error(err + ' (' + url + ':' + line + ')')); + return !mocha.options.allowUncaught; + }; + uncaughtExceptionHandlers.push(fn); + } + }; + + process.listeners = function (e) { + if (e === 'uncaughtException') { + return uncaughtExceptionHandlers; + } + return []; + }; + + // The BDD UI is registered by default, but no UI will be functional in the + // browser without an explicit call to the overridden `mocha.ui` (see below). + // Ensure that this default UI does not expose its methods to the global scope. + mocha.suite.removeAllListeners('pre-require'); + + var immediateQueue = []; + var immediateTimeout; + + function timeslice() { + var immediateStart = new Date$1().getTime(); + while (immediateQueue.length && new Date$1().getTime() - immediateStart < 100) { + immediateQueue.shift()(); + } + if (immediateQueue.length) { + immediateTimeout = setTimeout$1(timeslice, 0); + } else { + immediateTimeout = null; + } + } + + /** + * High-performance override of Runner.immediately. + */ + + Mocha.Runner.immediately = function (callback) { + immediateQueue.push(callback); + if (!immediateTimeout) { + immediateTimeout = setTimeout$1(timeslice, 0); + } + }; + + /** + * Function to allow assertion libraries to throw errors directly into mocha. + * This is useful when running tests in a browser because window.onerror will + * only receive the 'message' attribute of the Error. + */ + mocha.throwError = function (err) { + uncaughtExceptionHandlers.forEach(function (fn) { + fn(err); + }); + throw err; + }; + + /** + * Override ui to ensure that the ui functions are initialized. + * Normally this would happen in Mocha.prototype.loadFiles. + */ + + mocha.ui = function (ui) { + Mocha.prototype.ui.call(this, ui); + this.suite.emit('pre-require', commonjsGlobal, null, this); + return this; + }; + + /** + * Setup mocha with the given setting options. + */ + + mocha.setup = function (opts) { + if (typeof opts === 'string') { + opts = {ui: opts}; + } + if (opts.delay === true) { + this.delay(); + } + var self = this; + Object.keys(opts) + .filter(function (opt) { + return opt !== 'delay'; + }) + .forEach(function (opt) { + if (Object.prototype.hasOwnProperty.call(opts, opt)) { + self[opt](opts[opt]); + } + }); + return this; + }; + + /** + * Run mocha, returning the Runner. + */ + + mocha.run = function (fn) { + var options = mocha.options; + mocha.globals('location'); + + var query = parseQuery(commonjsGlobal.location.search || ''); + if (query.grep) { + mocha.grep(query.grep); + } + if (query.fgrep) { + mocha.fgrep(query.fgrep); + } + if (query.invert) { + mocha.invert(); + } + + return Mocha.prototype.run.call(mocha, function (err) { + // The DOM Document is not available in Web Workers. + var document = commonjsGlobal.document; + if ( + document && + document.getElementById('mocha') && + options.noHighlighting !== true + ) { + highlightTags('code'); + } + if (fn) { + fn(err); + } + }); + }; + + /** + * Expose the process shim. + * https://github.com/mochajs/mocha/pull/916 + */ + + Mocha.process = process; + + /** + * Expose mocha. + */ + commonjsGlobal.Mocha = Mocha; + commonjsGlobal.mocha = mocha; + + // for bundlers: enable `import {describe, it} from 'mocha'` + // `bdd` interface only + // prettier-ignore + [ + 'describe', 'context', 'it', 'specify', + 'xdescribe', 'xcontext', 'xit', 'xspecify', + 'before', 'beforeEach', 'afterEach', 'after' + ].forEach(function(key) { + mocha[key] = commonjsGlobal[key]; + }); + + var browserEntry = mocha; + + return browserEntry; + +})); +//# sourceMappingURL=mocha.js.map diff --git a/www/static/test/1.9.2/node_modules/mock-socket/dist/mock-socket.js b/www/static/test/1.9.2/node_modules/mock-socket/dist/mock-socket.js new file mode 100644 index 000000000..242d8086b --- /dev/null +++ b/www/static/test/1.9.2/node_modules/mock-socket/dist/mock-socket.js @@ -0,0 +1,2216 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.Mock = global.Mock || {}))); +}(this, (function (exports) { 'use strict'; + +var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +/** + * Check if we're required to add a port number. + * + * @see https://url.spec.whatwg.org/#default-port + * @param {Number|String} port Port number we need to check + * @param {String} protocol Protocol we need to check against. + * @returns {Boolean} Is it a default port for the given protocol + * @api private + */ +var requiresPort = function required(port, protocol) { + protocol = protocol.split(':')[0]; + port = +port; + + if (!port) { return false; } + + switch (protocol) { + case 'http': + case 'ws': + return port !== 80; + + case 'https': + case 'wss': + return port !== 443; + + case 'ftp': + return port !== 21; + + case 'gopher': + return port !== 70; + + case 'file': + return false; + } + + return port !== 0; +}; + +var has = Object.prototype.hasOwnProperty; +var undef; + +/** + * Decode a URI encoded string. + * + * @param {String} input The URI encoded string. + * @returns {String|Null} The decoded string. + * @api private + */ +function decode(input) { + try { + return decodeURIComponent(input.replace(/\+/g, ' ')); + } catch (e) { + return null; + } +} + +/** + * Attempts to encode a given input. + * + * @param {String} input The string that needs to be encoded. + * @returns {String|Null} The encoded string. + * @api private + */ +function encode(input) { + try { + return encodeURIComponent(input); + } catch (e) { + return null; + } +} + +/** + * Simple query string parser. + * + * @param {String} query The query string that needs to be parsed. + * @returns {Object} + * @api public + */ +function querystring(query) { + var parser = /([^=?#&]+)=?([^&]*)/g + , result = {} + , part; + + while (part = parser.exec(query)) { + var key = decode(part[1]) + , value = decode(part[2]); + + // + // Prevent overriding of existing properties. This ensures that build-in + // methods like `toString` or __proto__ are not overriden by malicious + // querystrings. + // + // In the case if failed decoding, we want to omit the key/value pairs + // from the result. + // + if (key === null || value === null || key in result) { continue; } + result[key] = value; + } + + return result; +} + +/** + * Transform a query string to an object. + * + * @param {Object} obj Object that should be transformed. + * @param {String} prefix Optional prefix. + * @returns {String} + * @api public + */ +function querystringify(obj, prefix) { + prefix = prefix || ''; + + var pairs = [] + , value + , key; + + // + // Optionally prefix with a '?' if needed + // + if ('string' !== typeof prefix) { prefix = '?'; } + + for (key in obj) { + if (has.call(obj, key)) { + value = obj[key]; + + // + // Edge cases where we actually want to encode the value to an empty + // string instead of the stringified value. + // + if (!value && (value === null || value === undef || isNaN(value))) { + value = ''; + } + + key = encode(key); + value = encode(value); + + // + // If we failed to encode the strings, we should bail out as we don't + // want to add invalid strings to the query. + // + if (key === null || value === null) { continue; } + pairs.push(key +'='+ value); + } + } + + return pairs.length ? prefix + pairs.join('&') : ''; +} + +// +// Expose the module. +// +var stringify = querystringify; +var parse = querystring; + +var querystringify_1 = { + stringify: stringify, + parse: parse +}; + +var CRHTLF = /[\n\r\t]/g; +var slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//; +var protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i; +var windowsDriveLetter = /^[a-zA-Z]:/; +var whitespace = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/; + +/** + * Trim a given string. + * + * @param {String} str String to trim. + * @public + */ +function trimLeft(str) { + return (str ? str : '').toString().replace(whitespace, ''); +} + +/** + * These are the parse rules for the URL parser, it informs the parser + * about: + * + * 0. The char it Needs to parse, if it's a string it should be done using + * indexOf, RegExp using exec and NaN means set as current value. + * 1. The property we should set when parsing this value. + * 2. Indication if it's backwards or forward parsing, when set as number it's + * the value of extra chars that should be split off. + * 3. Inherit from location if non existing in the parser. + * 4. `toLowerCase` the resulting value. + */ +var rules = [ + ['#', 'hash'], // Extract from the back. + ['?', 'query'], // Extract from the back. + function sanitize(address, url) { // Sanitize what is left of the address + return isSpecial(url.protocol) ? address.replace(/\\/g, '/') : address; + }, + ['/', 'pathname'], // Extract from the back. + ['@', 'auth', 1], // Extract from the front. + [NaN, 'host', undefined, 1, 1], // Set left over value. + [/:(\d*)$/, 'port', undefined, 1], // RegExp the back. + [NaN, 'hostname', undefined, 1, 1] // Set left over. +]; + +/** + * These properties should not be copied or inherited from. This is only needed + * for all non blob URL's as a blob URL does not include a hash, only the + * origin. + * + * @type {Object} + * @private + */ +var ignore = { hash: 1, query: 1 }; + +/** + * The location object differs when your code is loaded through a normal page, + * Worker or through a worker using a blob. And with the blobble begins the + * trouble as the location object will contain the URL of the blob, not the + * location of the page where our code is loaded in. The actual origin is + * encoded in the `pathname` so we can thankfully generate a good "default" + * location from it so we can generate proper relative URL's again. + * + * @param {Object|String} loc Optional default location object. + * @returns {Object} lolcation object. + * @public + */ +function lolcation(loc) { + var globalVar; + + if (typeof window !== 'undefined') { globalVar = window; } + else if (typeof commonjsGlobal !== 'undefined') { globalVar = commonjsGlobal; } + else if (typeof self !== 'undefined') { globalVar = self; } + else { globalVar = {}; } + + var location = globalVar.location || {}; + loc = loc || location; + + var finaldestination = {} + , type = typeof loc + , key; + + if ('blob:' === loc.protocol) { + finaldestination = new Url(unescape(loc.pathname), {}); + } else if ('string' === type) { + finaldestination = new Url(loc, {}); + for (key in ignore) { delete finaldestination[key]; } + } else if ('object' === type) { + for (key in loc) { + if (key in ignore) { continue; } + finaldestination[key] = loc[key]; + } + + if (finaldestination.slashes === undefined) { + finaldestination.slashes = slashes.test(loc.href); + } + } + + return finaldestination; +} + +/** + * Check whether a protocol scheme is special. + * + * @param {String} The protocol scheme of the URL + * @return {Boolean} `true` if the protocol scheme is special, else `false` + * @private + */ +function isSpecial(scheme) { + return ( + scheme === 'file:' || + scheme === 'ftp:' || + scheme === 'http:' || + scheme === 'https:' || + scheme === 'ws:' || + scheme === 'wss:' + ); +} + +/** + * @typedef ProtocolExtract + * @type Object + * @property {String} protocol Protocol matched in the URL, in lowercase. + * @property {Boolean} slashes `true` if protocol is followed by "//", else `false`. + * @property {String} rest Rest of the URL that is not part of the protocol. + */ + +/** + * Extract protocol information from a URL with/without double slash ("//"). + * + * @param {String} address URL we want to extract from. + * @param {Object} location + * @return {ProtocolExtract} Extracted information. + * @private + */ +function extractProtocol(address, location) { + address = trimLeft(address); + address = address.replace(CRHTLF, ''); + location = location || {}; + + var match = protocolre.exec(address); + var protocol = match[1] ? match[1].toLowerCase() : ''; + var forwardSlashes = !!match[2]; + var otherSlashes = !!match[3]; + var slashesCount = 0; + var rest; + + if (forwardSlashes) { + if (otherSlashes) { + rest = match[2] + match[3] + match[4]; + slashesCount = match[2].length + match[3].length; + } else { + rest = match[2] + match[4]; + slashesCount = match[2].length; + } + } else { + if (otherSlashes) { + rest = match[3] + match[4]; + slashesCount = match[3].length; + } else { + rest = match[4]; + } + } + + if (protocol === 'file:') { + if (slashesCount >= 2) { + rest = rest.slice(2); + } + } else if (isSpecial(protocol)) { + rest = match[4]; + } else if (protocol) { + if (forwardSlashes) { + rest = rest.slice(2); + } + } else if (slashesCount >= 2 && isSpecial(location.protocol)) { + rest = match[4]; + } + + return { + protocol: protocol, + slashes: forwardSlashes || isSpecial(protocol), + slashesCount: slashesCount, + rest: rest + }; +} + +/** + * Resolve a relative URL pathname against a base URL pathname. + * + * @param {String} relative Pathname of the relative URL. + * @param {String} base Pathname of the base URL. + * @return {String} Resolved pathname. + * @private + */ +function resolve(relative, base) { + if (relative === '') { return base; } + + var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/')) + , i = path.length + , last = path[i - 1] + , unshift = false + , up = 0; + + while (i--) { + if (path[i] === '.') { + path.splice(i, 1); + } else if (path[i] === '..') { + path.splice(i, 1); + up++; + } else if (up) { + if (i === 0) { unshift = true; } + path.splice(i, 1); + up--; + } + } + + if (unshift) { path.unshift(''); } + if (last === '.' || last === '..') { path.push(''); } + + return path.join('/'); +} + +/** + * The actual URL instance. Instead of returning an object we've opted-in to + * create an actual constructor as it's much more memory efficient and + * faster and it pleases my OCD. + * + * It is worth noting that we should not use `URL` as class name to prevent + * clashes with the global URL instance that got introduced in browsers. + * + * @constructor + * @param {String} address URL we want to parse. + * @param {Object|String} [location] Location defaults for relative paths. + * @param {Boolean|Function} [parser] Parser for the query string. + * @private + */ +function Url(address, location, parser) { + address = trimLeft(address); + address = address.replace(CRHTLF, ''); + + if (!(this instanceof Url)) { + return new Url(address, location, parser); + } + + var relative, extracted, parse, instruction, index, key + , instructions = rules.slice() + , type = typeof location + , url = this + , i = 0; + + // + // The following if statements allows this module two have compatibility with + // 2 different API: + // + // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments + // where the boolean indicates that the query string should also be parsed. + // + // 2. The `URL` interface of the browser which accepts a URL, object as + // arguments. The supplied object will be used as default values / fall-back + // for relative paths. + // + if ('object' !== type && 'string' !== type) { + parser = location; + location = null; + } + + if (parser && 'function' !== typeof parser) { parser = querystringify_1.parse; } + + location = lolcation(location); + + // + // Extract protocol information before running the instructions. + // + extracted = extractProtocol(address || '', location); + relative = !extracted.protocol && !extracted.slashes; + url.slashes = extracted.slashes || relative && location.slashes; + url.protocol = extracted.protocol || location.protocol || ''; + address = extracted.rest; + + // + // When the authority component is absent the URL starts with a path + // component. + // + if ( + extracted.protocol === 'file:' && ( + extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) || + (!extracted.slashes && + (extracted.protocol || + extracted.slashesCount < 2 || + !isSpecial(url.protocol))) + ) { + instructions[3] = [/(.*)/, 'pathname']; + } + + for (; i < instructions.length; i++) { + instruction = instructions[i]; + + if (typeof instruction === 'function') { + address = instruction(address, url); + continue; + } + + parse = instruction[0]; + key = instruction[1]; + + if (parse !== parse) { + url[key] = address; + } else if ('string' === typeof parse) { + index = parse === '@' + ? address.lastIndexOf(parse) + : address.indexOf(parse); + + if (~index) { + if ('number' === typeof instruction[2]) { + url[key] = address.slice(0, index); + address = address.slice(index + instruction[2]); + } else { + url[key] = address.slice(index); + address = address.slice(0, index); + } + } + } else if ((index = parse.exec(address))) { + url[key] = index[1]; + address = address.slice(0, index.index); + } + + url[key] = url[key] || ( + relative && instruction[3] ? location[key] || '' : '' + ); + + // + // Hostname, host and protocol should be lowercased so they can be used to + // create a proper `origin`. + // + if (instruction[4]) { url[key] = url[key].toLowerCase(); } + } + + // + // Also parse the supplied query string in to an object. If we're supplied + // with a custom parser as function use that instead of the default build-in + // parser. + // + if (parser) { url.query = parser(url.query); } + + // + // If the URL is relative, resolve the pathname against the base URL. + // + if ( + relative + && location.slashes + && url.pathname.charAt(0) !== '/' + && (url.pathname !== '' || location.pathname !== '') + ) { + url.pathname = resolve(url.pathname, location.pathname); + } + + // + // Default to a / for pathname if none exists. This normalizes the URL + // to always have a / + // + if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) { + url.pathname = '/' + url.pathname; + } + + // + // We should not add port numbers if they are already the default port number + // for a given protocol. As the host also contains the port number we're going + // override it with the hostname which contains no port number. + // + if (!requiresPort(url.port, url.protocol)) { + url.host = url.hostname; + url.port = ''; + } + + // + // Parse down the `auth` for the username and password. + // + url.username = url.password = ''; + + if (url.auth) { + index = url.auth.indexOf(':'); + + if (~index) { + url.username = url.auth.slice(0, index); + url.username = encodeURIComponent(decodeURIComponent(url.username)); + + url.password = url.auth.slice(index + 1); + url.password = encodeURIComponent(decodeURIComponent(url.password)); + } else { + url.username = encodeURIComponent(decodeURIComponent(url.auth)); + } + + url.auth = url.password ? url.username +':'+ url.password : url.username; + } + + url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host + ? url.protocol +'//'+ url.host + : 'null'; + + // + // The href is just the compiled result. + // + url.href = url.toString(); +} + +/** + * This is convenience method for changing properties in the URL instance to + * insure that they all propagate correctly. + * + * @param {String} part Property we need to adjust. + * @param {Mixed} value The newly assigned value. + * @param {Boolean|Function} fn When setting the query, it will be the function + * used to parse the query. + * When setting the protocol, double slash will be + * removed from the final url if it is true. + * @returns {URL} URL instance for chaining. + * @public + */ +function set(part, value, fn) { + var url = this; + + switch (part) { + case 'query': + if ('string' === typeof value && value.length) { + value = (fn || querystringify_1.parse)(value); + } + + url[part] = value; + break; + + case 'port': + url[part] = value; + + if (!requiresPort(value, url.protocol)) { + url.host = url.hostname; + url[part] = ''; + } else if (value) { + url.host = url.hostname +':'+ value; + } + + break; + + case 'hostname': + url[part] = value; + + if (url.port) { value += ':'+ url.port; } + url.host = value; + break; + + case 'host': + url[part] = value; + + if (/:\d+$/.test(value)) { + value = value.split(':'); + url.port = value.pop(); + url.hostname = value.join(':'); + } else { + url.hostname = value; + url.port = ''; + } + + break; + + case 'protocol': + url.protocol = value.toLowerCase(); + url.slashes = !fn; + break; + + case 'pathname': + case 'hash': + if (value) { + var char = part === 'pathname' ? '/' : '#'; + url[part] = value.charAt(0) !== char ? char + value : value; + } else { + url[part] = value; + } + break; + + case 'username': + case 'password': + url[part] = encodeURIComponent(value); + break; + + case 'auth': + var index = value.indexOf(':'); + + if (~index) { + url.username = value.slice(0, index); + url.username = encodeURIComponent(decodeURIComponent(url.username)); + + url.password = value.slice(index + 1); + url.password = encodeURIComponent(decodeURIComponent(url.password)); + } else { + url.username = encodeURIComponent(decodeURIComponent(value)); + } + } + + for (var i = 0; i < rules.length; i++) { + var ins = rules[i]; + + if (ins[4]) { url[ins[1]] = url[ins[1]].toLowerCase(); } + } + + url.auth = url.password ? url.username +':'+ url.password : url.username; + + url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host + ? url.protocol +'//'+ url.host + : 'null'; + + url.href = url.toString(); + + return url; +} + +/** + * Transform the properties back in to a valid and full URL string. + * + * @param {Function} stringify Optional query stringify function. + * @returns {String} Compiled version of the URL. + * @public + */ +function toString(stringify) { + if (!stringify || 'function' !== typeof stringify) { stringify = querystringify_1.stringify; } + + var query + , url = this + , host = url.host + , protocol = url.protocol; + + if (protocol && protocol.charAt(protocol.length - 1) !== ':') { protocol += ':'; } + + var result = + protocol + + ((url.protocol && url.slashes) || isSpecial(url.protocol) ? '//' : ''); + + if (url.username) { + result += url.username; + if (url.password) { result += ':'+ url.password; } + result += '@'; + } else if (url.password) { + result += ':'+ url.password; + result += '@'; + } else if ( + url.protocol !== 'file:' && + isSpecial(url.protocol) && + !host && + url.pathname !== '/' + ) { + // + // Add back the empty userinfo, otherwise the original invalid URL + // might be transformed into a valid one with `url.pathname` as host. + // + result += '@'; + } + + // + // Trailing colon is removed from `url.host` when it is parsed. If it still + // ends with a colon, then add back the trailing colon that was removed. This + // prevents an invalid URL from being transformed into a valid one. + // + if (host[host.length - 1] === ':') { host += ':'; } + result += host + url.pathname; + + query = 'object' === typeof url.query ? stringify(url.query) : url.query; + if (query) { result += '?' !== query.charAt(0) ? '?'+ query : query; } + + if (url.hash) { result += url.hash; } + + return result; +} + +Url.prototype = { set: set, toString: toString }; + +// +// Expose the URL parser and some additional properties that might be useful for +// others or testing. +// +Url.extractProtocol = extractProtocol; +Url.location = lolcation; +Url.trimLeft = trimLeft; +Url.qs = querystringify_1; + +var urlParse = Url; + +/* + * This delay allows the thread to finish assigning its on* methods + * before invoking the delay callback. This is purely a timing hack. + * http://geekabyte.blogspot.com/2014/01/javascript-effect-of-setting-settimeout.html + * + * @param {callback: function} the callback which will be invoked after the timeout + * @parma {context: object} the context in which to invoke the function + */ +function delay(callback, context) { + setTimeout(function (timeoutContext) { return callback.call(timeoutContext); }, 4, context); +} + +function log(method, message) { + /* eslint-disable no-console */ + if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') { + console[method].call(null, message); + } + /* eslint-enable no-console */ +} + +function reject(array, callback) { + if ( array === void 0 ) array = []; + + var results = []; + array.forEach(function (itemInArray) { + if (!callback(itemInArray)) { + results.push(itemInArray); + } + }); + + return results; +} + +function filter(array, callback) { + if ( array === void 0 ) array = []; + + var results = []; + array.forEach(function (itemInArray) { + if (callback(itemInArray)) { + results.push(itemInArray); + } + }); + + return results; +} + +/* + * EventTarget is an interface implemented by objects that can + * receive events and may have listeners for them. + * + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget + */ +var EventTarget = function EventTarget() { + this.listeners = {}; +}; + +/* + * Ties a listener function to an event type which can later be invoked via the + * dispatchEvent method. + * + * @param {string} type - the type of event (ie: 'open', 'message', etc.) + * @param {function} listener - callback function to invoke when an event is dispatched matching the type + * @param {boolean} useCapture - N/A TODO: implement useCapture functionality + */ +EventTarget.prototype.addEventListener = function addEventListener (type, listener /* , useCapture */) { + if (typeof listener === 'function') { + if (!Array.isArray(this.listeners[type])) { + this.listeners[type] = []; + } + + // Only add the same function once + if (filter(this.listeners[type], function (item) { return item === listener; }).length === 0) { + this.listeners[type].push(listener); + } + } +}; + +/* + * Removes the listener so it will no longer be invoked via the dispatchEvent method. + * + * @param {string} type - the type of event (ie: 'open', 'message', etc.) + * @param {function} listener - callback function to invoke when an event is dispatched matching the type + * @param {boolean} useCapture - N/A TODO: implement useCapture functionality + */ +EventTarget.prototype.removeEventListener = function removeEventListener (type, removingListener /* , useCapture */) { + var arrayOfListeners = this.listeners[type]; + this.listeners[type] = reject(arrayOfListeners, function (listener) { return listener === removingListener; }); +}; + +/* + * Invokes all listener functions that are listening to the given event.type property. Each + * listener will be passed the event as the first argument. + * + * @param {object} event - event object which will be passed to all listeners of the event.type property + */ +EventTarget.prototype.dispatchEvent = function dispatchEvent (event) { + var this$1 = this; + var customArguments = [], len = arguments.length - 1; + while ( len-- > 0 ) customArguments[ len ] = arguments[ len + 1 ]; + + var eventName = event.type; + var listeners = this.listeners[eventName]; + + if (!Array.isArray(listeners)) { + return false; + } + + listeners.forEach(function (listener) { + if (customArguments.length > 0) { + listener.apply(this$1, customArguments); + } else { + listener.call(this$1, event); + } + }); + + return true; +}; + +function trimQueryPartFromURL(url) { + var queryIndex = url.indexOf('?'); + return queryIndex >= 0 ? url.slice(0, queryIndex) : url; +} + +/* + * The network bridge is a way for the mock websocket object to 'communicate' with + * all available servers. This is a singleton object so it is important that you + * clean up urlMap whenever you are finished. + */ +var NetworkBridge = function NetworkBridge() { + this.urlMap = {}; +}; + +/* + * Attaches a websocket object to the urlMap hash so that it can find the server + * it is connected to and the server in turn can find it. + * + * @param {object} websocket - websocket object to add to the urlMap hash + * @param {string} url + */ +NetworkBridge.prototype.attachWebSocket = function attachWebSocket (websocket, url) { + var serverURL = trimQueryPartFromURL(url); + var connectionLookup = this.urlMap[serverURL]; + + if (connectionLookup && connectionLookup.server && connectionLookup.websockets.indexOf(websocket) === -1) { + connectionLookup.websockets.push(websocket); + return connectionLookup.server; + } +}; + +/* + * Attaches a websocket to a room + */ +NetworkBridge.prototype.addMembershipToRoom = function addMembershipToRoom (websocket, room) { + var connectionLookup = this.urlMap[trimQueryPartFromURL(websocket.url)]; + + if (connectionLookup && connectionLookup.server && connectionLookup.websockets.indexOf(websocket) !== -1) { + if (!connectionLookup.roomMemberships[room]) { + connectionLookup.roomMemberships[room] = []; + } + + connectionLookup.roomMemberships[room].push(websocket); + } +}; + +/* + * Attaches a server object to the urlMap hash so that it can find a websockets + * which are connected to it and so that websockets can in turn can find it. + * + * @param {object} server - server object to add to the urlMap hash + * @param {string} url + */ +NetworkBridge.prototype.attachServer = function attachServer (server, url) { + var serverUrl = trimQueryPartFromURL(url); + var connectionLookup = this.urlMap[serverUrl]; + + if (!connectionLookup) { + this.urlMap[serverUrl] = { + server: server, + websockets: [], + roomMemberships: {} + }; + + return server; + } +}; + +/* + * Finds the server which is 'running' on the given url. + * + * @param {string} url - the url to use to find which server is running on it + */ +NetworkBridge.prototype.serverLookup = function serverLookup (url) { + var serverURL = trimQueryPartFromURL(url); + var connectionLookup = this.urlMap[serverURL]; + + if (connectionLookup) { + return connectionLookup.server; + } +}; + +/* + * Finds all websockets which is 'listening' on the given url. + * + * @param {string} url - the url to use to find all websockets which are associated with it + * @param {string} room - if a room is provided, will only return sockets in this room + * @param {class} broadcaster - socket that is broadcasting and is to be excluded from the lookup + */ +NetworkBridge.prototype.websocketsLookup = function websocketsLookup (url, room, broadcaster) { + var serverURL = trimQueryPartFromURL(url); + var websockets; + var connectionLookup = this.urlMap[serverURL]; + + websockets = connectionLookup ? connectionLookup.websockets : []; + + if (room) { + var members = connectionLookup.roomMemberships[room]; + websockets = members || []; + } + + return broadcaster ? websockets.filter(function (websocket) { return websocket !== broadcaster; }) : websockets; +}; + +/* + * Removes the entry associated with the url. + * + * @param {string} url + */ +NetworkBridge.prototype.removeServer = function removeServer (url) { + delete this.urlMap[trimQueryPartFromURL(url)]; +}; + +/* + * Removes the individual websocket from the map of associated websockets. + * + * @param {object} websocket - websocket object to remove from the url map + * @param {string} url + */ +NetworkBridge.prototype.removeWebSocket = function removeWebSocket (websocket, url) { + var serverURL = trimQueryPartFromURL(url); + var connectionLookup = this.urlMap[serverURL]; + + if (connectionLookup) { + connectionLookup.websockets = reject(connectionLookup.websockets, function (socket) { return socket === websocket; }); + } +}; + +/* + * Removes a websocket from a room + */ +NetworkBridge.prototype.removeMembershipFromRoom = function removeMembershipFromRoom (websocket, room) { + var connectionLookup = this.urlMap[trimQueryPartFromURL(websocket.url)]; + var memberships = connectionLookup.roomMemberships[room]; + + if (connectionLookup && memberships !== null) { + connectionLookup.roomMemberships[room] = reject(memberships, function (socket) { return socket === websocket; }); + } +}; + +var networkBridge = new NetworkBridge(); // Note: this is a singleton + +/* + * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent + */ +var CLOSE_CODES = { + CLOSE_NORMAL: 1000, + CLOSE_GOING_AWAY: 1001, + CLOSE_PROTOCOL_ERROR: 1002, + CLOSE_UNSUPPORTED: 1003, + CLOSE_NO_STATUS: 1005, + CLOSE_ABNORMAL: 1006, + UNSUPPORTED_DATA: 1007, + POLICY_VIOLATION: 1008, + CLOSE_TOO_LARGE: 1009, + MISSING_EXTENSION: 1010, + INTERNAL_ERROR: 1011, + SERVICE_RESTART: 1012, + TRY_AGAIN_LATER: 1013, + TLS_HANDSHAKE: 1015 +}; + +var ERROR_PREFIX = { + CONSTRUCTOR_ERROR: "Failed to construct 'WebSocket':", + CLOSE_ERROR: "Failed to execute 'close' on 'WebSocket':", + EVENT: { + CONSTRUCT: "Failed to construct 'Event':", + MESSAGE: "Failed to construct 'MessageEvent':", + CLOSE: "Failed to construct 'CloseEvent':" + } +}; + +var EventPrototype = function EventPrototype () {}; + +EventPrototype.prototype.stopPropagation = function stopPropagation () {}; +EventPrototype.prototype.stopImmediatePropagation = function stopImmediatePropagation () {}; + +// if no arguments are passed then the type is set to "undefined" on +// chrome and safari. +EventPrototype.prototype.initEvent = function initEvent (type, bubbles, cancelable) { + if ( type === void 0 ) type = 'undefined'; + if ( bubbles === void 0 ) bubbles = false; + if ( cancelable === void 0 ) cancelable = false; + + this.type = "" + type; + this.bubbles = Boolean(bubbles); + this.cancelable = Boolean(cancelable); +}; + +var Event = (function (EventPrototype$$1) { + function Event(type, eventInitConfig) { + if ( eventInitConfig === void 0 ) eventInitConfig = {}; + + EventPrototype$$1.call(this); + + if (!type) { + throw new TypeError(((ERROR_PREFIX.EVENT_ERROR) + " 1 argument required, but only 0 present.")); + } + + if (typeof eventInitConfig !== 'object') { + throw new TypeError(((ERROR_PREFIX.EVENT_ERROR) + " parameter 2 ('eventInitDict') is not an object.")); + } + + var bubbles = eventInitConfig.bubbles; + var cancelable = eventInitConfig.cancelable; + + this.type = "" + type; + this.timeStamp = Date.now(); + this.target = null; + this.srcElement = null; + this.returnValue = true; + this.isTrusted = false; + this.eventPhase = 0; + this.defaultPrevented = false; + this.currentTarget = null; + this.cancelable = cancelable ? Boolean(cancelable) : false; + this.cancelBubble = false; + this.bubbles = bubbles ? Boolean(bubbles) : false; + } + + if ( EventPrototype$$1 ) Event.__proto__ = EventPrototype$$1; + Event.prototype = Object.create( EventPrototype$$1 && EventPrototype$$1.prototype ); + Event.prototype.constructor = Event; + + return Event; +}(EventPrototype)); + +var MessageEvent = (function (EventPrototype$$1) { + function MessageEvent(type, eventInitConfig) { + if ( eventInitConfig === void 0 ) eventInitConfig = {}; + + EventPrototype$$1.call(this); + + if (!type) { + throw new TypeError(((ERROR_PREFIX.EVENT.MESSAGE) + " 1 argument required, but only 0 present.")); + } + + if (typeof eventInitConfig !== 'object') { + throw new TypeError(((ERROR_PREFIX.EVENT.MESSAGE) + " parameter 2 ('eventInitDict') is not an object")); + } + + var bubbles = eventInitConfig.bubbles; + var cancelable = eventInitConfig.cancelable; + var data = eventInitConfig.data; + var origin = eventInitConfig.origin; + var lastEventId = eventInitConfig.lastEventId; + var ports = eventInitConfig.ports; + + this.type = "" + type; + this.timeStamp = Date.now(); + this.target = null; + this.srcElement = null; + this.returnValue = true; + this.isTrusted = false; + this.eventPhase = 0; + this.defaultPrevented = false; + this.currentTarget = null; + this.cancelable = cancelable ? Boolean(cancelable) : false; + this.canncelBubble = false; + this.bubbles = bubbles ? Boolean(bubbles) : false; + this.origin = "" + origin; + this.ports = typeof ports === 'undefined' ? null : ports; + this.data = typeof data === 'undefined' ? null : data; + this.lastEventId = "" + (lastEventId || ''); + } + + if ( EventPrototype$$1 ) MessageEvent.__proto__ = EventPrototype$$1; + MessageEvent.prototype = Object.create( EventPrototype$$1 && EventPrototype$$1.prototype ); + MessageEvent.prototype.constructor = MessageEvent; + + return MessageEvent; +}(EventPrototype)); + +var CloseEvent = (function (EventPrototype$$1) { + function CloseEvent(type, eventInitConfig) { + if ( eventInitConfig === void 0 ) eventInitConfig = {}; + + EventPrototype$$1.call(this); + + if (!type) { + throw new TypeError(((ERROR_PREFIX.EVENT.CLOSE) + " 1 argument required, but only 0 present.")); + } + + if (typeof eventInitConfig !== 'object') { + throw new TypeError(((ERROR_PREFIX.EVENT.CLOSE) + " parameter 2 ('eventInitDict') is not an object")); + } + + var bubbles = eventInitConfig.bubbles; + var cancelable = eventInitConfig.cancelable; + var code = eventInitConfig.code; + var reason = eventInitConfig.reason; + var wasClean = eventInitConfig.wasClean; + + this.type = "" + type; + this.timeStamp = Date.now(); + this.target = null; + this.srcElement = null; + this.returnValue = true; + this.isTrusted = false; + this.eventPhase = 0; + this.defaultPrevented = false; + this.currentTarget = null; + this.cancelable = cancelable ? Boolean(cancelable) : false; + this.cancelBubble = false; + this.bubbles = bubbles ? Boolean(bubbles) : false; + this.code = typeof code === 'number' ? parseInt(code, 10) : 0; + this.reason = "" + (reason || ''); + this.wasClean = wasClean ? Boolean(wasClean) : false; + } + + if ( EventPrototype$$1 ) CloseEvent.__proto__ = EventPrototype$$1; + CloseEvent.prototype = Object.create( EventPrototype$$1 && EventPrototype$$1.prototype ); + CloseEvent.prototype.constructor = CloseEvent; + + return CloseEvent; +}(EventPrototype)); + +/* + * Creates an Event object and extends it to allow full modification of + * its properties. + * + * @param {object} config - within config you will need to pass type and optionally target + */ +function createEvent(config) { + var type = config.type; + var target = config.target; + var eventObject = new Event(type); + + if (target) { + eventObject.target = target; + eventObject.srcElement = target; + eventObject.currentTarget = target; + } + + return eventObject; +} + +/* + * Creates a MessageEvent object and extends it to allow full modification of + * its properties. + * + * @param {object} config - within config: type, origin, data and optionally target + */ +function createMessageEvent(config) { + var type = config.type; + var origin = config.origin; + var data = config.data; + var target = config.target; + var messageEvent = new MessageEvent(type, { + data: data, + origin: origin + }); + + if (target) { + messageEvent.target = target; + messageEvent.srcElement = target; + messageEvent.currentTarget = target; + } + + return messageEvent; +} + +/* + * Creates a CloseEvent object and extends it to allow full modification of + * its properties. + * + * @param {object} config - within config: type and optionally target, code, and reason + */ +function createCloseEvent(config) { + var code = config.code; + var reason = config.reason; + var type = config.type; + var target = config.target; + var wasClean = config.wasClean; + + if (!wasClean) { + wasClean = code === CLOSE_CODES.CLOSE_NORMAL || code === CLOSE_CODES.CLOSE_NO_STATUS; + } + + var closeEvent = new CloseEvent(type, { + code: code, + reason: reason, + wasClean: wasClean + }); + + if (target) { + closeEvent.target = target; + closeEvent.srcElement = target; + closeEvent.currentTarget = target; + } + + return closeEvent; +} + +function closeWebSocketConnection(context, code, reason) { + context.readyState = WebSocket$1.CLOSING; + + var server = networkBridge.serverLookup(context.url); + var closeEvent = createCloseEvent({ + type: 'close', + target: context.target, + code: code, + reason: reason + }); + + delay(function () { + networkBridge.removeWebSocket(context, context.url); + + context.readyState = WebSocket$1.CLOSED; + context.dispatchEvent(closeEvent); + + if (server) { + server.dispatchEvent(closeEvent, server); + } + }, context); +} + +function failWebSocketConnection(context, code, reason) { + context.readyState = WebSocket$1.CLOSING; + + var server = networkBridge.serverLookup(context.url); + var closeEvent = createCloseEvent({ + type: 'close', + target: context.target, + code: code, + reason: reason, + wasClean: false + }); + + var errorEvent = createEvent({ + type: 'error', + target: context.target + }); + + delay(function () { + networkBridge.removeWebSocket(context, context.url); + + context.readyState = WebSocket$1.CLOSED; + context.dispatchEvent(errorEvent); + context.dispatchEvent(closeEvent); + + if (server) { + server.dispatchEvent(closeEvent, server); + } + }, context); +} + +function normalizeSendData(data) { + if (Object.prototype.toString.call(data) !== '[object Blob]' && !(data instanceof ArrayBuffer)) { + data = String(data); + } + + return data; +} + +var proxies = new WeakMap(); + +function proxyFactory(target) { + if (proxies.has(target)) { + return proxies.get(target); + } + + var proxy = new Proxy(target, { + get: function get(obj, prop) { + if (prop === 'close') { + return function close(options) { + if ( options === void 0 ) options = {}; + + var code = options.code || CLOSE_CODES.CLOSE_NORMAL; + var reason = options.reason || ''; + + closeWebSocketConnection(proxy, code, reason); + }; + } + + if (prop === 'send') { + return function send(data) { + data = normalizeSendData(data); + + target.dispatchEvent( + createMessageEvent({ + type: 'message', + data: data, + origin: this.url, + target: target + }) + ); + }; + } + + var toSocketName = function (type) { return (type === 'message' ? ("server::" + type) : type); }; + if (prop === 'on') { + return function onWrapper(type, cb) { + target.addEventListener(toSocketName(type), cb); + }; + } + if (prop === 'off') { + return function offWrapper(type, cb) { + target.removeEventListener(toSocketName(type), cb); + }; + } + + if (prop === 'target') { + return target; + } + + return obj[prop]; + } + }); + proxies.set(target, proxy); + + return proxy; +} + +function lengthInUtf8Bytes(str) { + // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence. + var m = encodeURIComponent(str).match(/%[89ABab]/g); + return str.length + (m ? m.length : 0); +} + +function urlVerification(url) { + var urlRecord = new urlParse(url); + var pathname = urlRecord.pathname; + var protocol = urlRecord.protocol; + var hash = urlRecord.hash; + + if (!url) { + throw new TypeError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + " 1 argument required, but only 0 present.")); + } + + if (!pathname) { + urlRecord.pathname = '/'; + } + + if (protocol === '') { + throw new SyntaxError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + " The URL '" + (urlRecord.toString()) + "' is invalid.")); + } + + if (protocol !== 'ws:' && protocol !== 'wss:') { + throw new SyntaxError( + ((ERROR_PREFIX.CONSTRUCTOR_ERROR) + " The URL's scheme must be either 'ws' or 'wss'. '" + protocol + "' is not allowed.") + ); + } + + if (hash !== '') { + /* eslint-disable max-len */ + throw new SyntaxError( + ((ERROR_PREFIX.CONSTRUCTOR_ERROR) + " The URL contains a fragment identifier ('" + hash + "'). Fragment identifiers are not allowed in WebSocket URLs.") + ); + /* eslint-enable max-len */ + } + + return urlRecord.toString(); +} + +function protocolVerification(protocols) { + if ( protocols === void 0 ) protocols = []; + + if (!Array.isArray(protocols) && typeof protocols !== 'string') { + throw new SyntaxError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + " The subprotocol '" + (protocols.toString()) + "' is invalid.")); + } + + if (typeof protocols === 'string') { + protocols = [protocols]; + } + + var uniq = protocols + .map(function (p) { return ({ count: 1, protocol: p }); }) + .reduce(function (a, b) { + a[b.protocol] = (a[b.protocol] || 0) + b.count; + return a; + }, {}); + + var duplicates = Object.keys(uniq).filter(function (a) { return uniq[a] > 1; }); + + if (duplicates.length > 0) { + throw new SyntaxError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + " The subprotocol '" + (duplicates[0]) + "' is duplicated.")); + } + + return protocols; +} + +/* + * The main websocket class which is designed to mimick the native WebSocket class as close + * as possible. + * + * https://html.spec.whatwg.org/multipage/web-sockets.html + */ +var WebSocket$1 = (function (EventTarget$$1) { + function WebSocket(url, protocols) { + EventTarget$$1.call(this); + + this._onopen = null; + this._onmessage = null; + this._onerror = null; + this._onclose = null; + + this.url = urlVerification(url); + protocols = protocolVerification(protocols); + this.protocol = protocols[0] || ''; + + this.binaryType = 'blob'; + this.readyState = WebSocket.CONNECTING; + + var client = proxyFactory(this); + var server = networkBridge.attachWebSocket(client, this.url); + + /* + * This delay is needed so that we dont trigger an event before the callbacks have been + * setup. For example: + * + * var socket = new WebSocket('ws://localhost'); + * + * If we dont have the delay then the event would be triggered right here and this is + * before the onopen had a chance to register itself. + * + * socket.onopen = () => { // this would never be called }; + * + * and with the delay the event gets triggered here after all of the callbacks have been + * registered :-) + */ + delay(function delayCallback() { + if (server) { + if ( + server.options.verifyClient && + typeof server.options.verifyClient === 'function' && + !server.options.verifyClient() + ) { + this.readyState = WebSocket.CLOSED; + + log( + 'error', + ("WebSocket connection to '" + (this.url) + "' failed: HTTP Authentication failed; no valid credentials available") + ); + + networkBridge.removeWebSocket(client, this.url); + this.dispatchEvent(createEvent({ type: 'error', target: this })); + this.dispatchEvent(createCloseEvent({ type: 'close', target: this, code: CLOSE_CODES.CLOSE_NORMAL })); + } else { + if (server.options.selectProtocol && typeof server.options.selectProtocol === 'function') { + var selectedProtocol = server.options.selectProtocol(protocols); + var isFilled = selectedProtocol !== ''; + var isRequested = protocols.indexOf(selectedProtocol) !== -1; + if (isFilled && !isRequested) { + this.readyState = WebSocket.CLOSED; + + log('error', ("WebSocket connection to '" + (this.url) + "' failed: Invalid Sub-Protocol")); + + networkBridge.removeWebSocket(client, this.url); + this.dispatchEvent(createEvent({ type: 'error', target: this })); + this.dispatchEvent(createCloseEvent({ type: 'close', target: this, code: CLOSE_CODES.CLOSE_NORMAL })); + return; + } + this.protocol = selectedProtocol; + } + this.readyState = WebSocket.OPEN; + this.dispatchEvent(createEvent({ type: 'open', target: this })); + server.dispatchEvent(createEvent({ type: 'connection' }), client); + } + } else { + this.readyState = WebSocket.CLOSED; + this.dispatchEvent(createEvent({ type: 'error', target: this })); + this.dispatchEvent(createCloseEvent({ type: 'close', target: this, code: CLOSE_CODES.CLOSE_NORMAL })); + + log('error', ("WebSocket connection to '" + (this.url) + "' failed")); + } + }, this); + } + + if ( EventTarget$$1 ) WebSocket.__proto__ = EventTarget$$1; + WebSocket.prototype = Object.create( EventTarget$$1 && EventTarget$$1.prototype ); + WebSocket.prototype.constructor = WebSocket; + + var prototypeAccessors = { onopen: {},onmessage: {},onclose: {},onerror: {} }; + + prototypeAccessors.onopen.get = function () { + return this._onopen; + }; + + prototypeAccessors.onmessage.get = function () { + return this._onmessage; + }; + + prototypeAccessors.onclose.get = function () { + return this._onclose; + }; + + prototypeAccessors.onerror.get = function () { + return this._onerror; + }; + + prototypeAccessors.onopen.set = function (listener) { + this.removeEventListener('open', this._onopen); + this._onopen = listener; + this.addEventListener('open', listener); + }; + + prototypeAccessors.onmessage.set = function (listener) { + this.removeEventListener('message', this._onmessage); + this._onmessage = listener; + this.addEventListener('message', listener); + }; + + prototypeAccessors.onclose.set = function (listener) { + this.removeEventListener('close', this._onclose); + this._onclose = listener; + this.addEventListener('close', listener); + }; + + prototypeAccessors.onerror.set = function (listener) { + this.removeEventListener('error', this._onerror); + this._onerror = listener; + this.addEventListener('error', listener); + }; + + WebSocket.prototype.send = function send (data) { + var this$1 = this; + + if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) { + throw new Error('WebSocket is already in CLOSING or CLOSED state'); + } + + // TODO: handle bufferedAmount + + var messageEvent = createMessageEvent({ + type: 'server::message', + origin: this.url, + data: normalizeSendData(data) + }); + + var server = networkBridge.serverLookup(this.url); + + if (server) { + delay(function () { + this$1.dispatchEvent(messageEvent, data); + }, server); + } + }; + + WebSocket.prototype.close = function close (code, reason) { + if (code !== undefined) { + if (typeof code !== 'number' || (code !== 1000 && (code < 3000 || code > 4999))) { + throw new TypeError( + ((ERROR_PREFIX.CLOSE_ERROR) + " The code must be either 1000, or between 3000 and 4999. " + code + " is neither.") + ); + } + } + + if (reason !== undefined) { + var length = lengthInUtf8Bytes(reason); + + if (length > 123) { + throw new SyntaxError(((ERROR_PREFIX.CLOSE_ERROR) + " The message must not be greater than 123 bytes.")); + } + } + + if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) { + return; + } + + var client = proxyFactory(this); + if (this.readyState === WebSocket.CONNECTING) { + failWebSocketConnection(client, code || CLOSE_CODES.CLOSE_ABNORMAL, reason); + } else { + closeWebSocketConnection(client, code || CLOSE_CODES.CLOSE_NO_STATUS, reason); + } + }; + + Object.defineProperties( WebSocket.prototype, prototypeAccessors ); + + return WebSocket; +}(EventTarget)); + +WebSocket$1.CONNECTING = 0; +WebSocket$1.prototype.CONNECTING = WebSocket$1.CONNECTING; +WebSocket$1.OPEN = 1; +WebSocket$1.prototype.OPEN = WebSocket$1.OPEN; +WebSocket$1.CLOSING = 2; +WebSocket$1.prototype.CLOSING = WebSocket$1.CLOSING; +WebSocket$1.CLOSED = 3; +WebSocket$1.prototype.CLOSED = WebSocket$1.CLOSED; + +/* + * The socket-io class is designed to mimick the real API as closely as possible. + * + * http://socket.io/docs/ + */ +var SocketIO$1 = (function (EventTarget$$1) { + function SocketIO(url, protocol) { + var this$1 = this; + if ( url === void 0 ) url = 'socket.io'; + if ( protocol === void 0 ) protocol = ''; + + EventTarget$$1.call(this); + + this.binaryType = 'blob'; + var urlRecord = new urlParse(url); + + if (!urlRecord.pathname) { + urlRecord.pathname = '/'; + } + + this.url = urlRecord.toString(); + this.readyState = SocketIO.CONNECTING; + this.protocol = ''; + this.target = this; + + if (typeof protocol === 'string' || (typeof protocol === 'object' && protocol !== null)) { + this.protocol = protocol; + } else if (Array.isArray(protocol) && protocol.length > 0) { + this.protocol = protocol[0]; + } + + var server = networkBridge.attachWebSocket(this, this.url); + + /* + * Delay triggering the connection events so they can be defined in time. + */ + delay(function delayCallback() { + if (server) { + this.readyState = SocketIO.OPEN; + server.dispatchEvent(createEvent({ type: 'connection' }), server, this); + server.dispatchEvent(createEvent({ type: 'connect' }), server, this); // alias + this.dispatchEvent(createEvent({ type: 'connect', target: this })); + } else { + this.readyState = SocketIO.CLOSED; + this.dispatchEvent(createEvent({ type: 'error', target: this })); + this.dispatchEvent( + createCloseEvent({ + type: 'close', + target: this, + code: CLOSE_CODES.CLOSE_NORMAL + }) + ); + + log('error', ("Socket.io connection to '" + (this.url) + "' failed")); + } + }, this); + + /** + Add an aliased event listener for close / disconnect + */ + this.addEventListener('close', function (event) { + this$1.dispatchEvent( + createCloseEvent({ + type: 'disconnect', + target: event.target, + code: event.code + }) + ); + }); + } + + if ( EventTarget$$1 ) SocketIO.__proto__ = EventTarget$$1; + SocketIO.prototype = Object.create( EventTarget$$1 && EventTarget$$1.prototype ); + SocketIO.prototype.constructor = SocketIO; + + var prototypeAccessors = { broadcast: {} }; + + /* + * Closes the SocketIO connection or connection attempt, if any. + * If the connection is already CLOSED, this method does nothing. + */ + SocketIO.prototype.close = function close () { + if (this.readyState !== SocketIO.OPEN) { + return undefined; + } + + var server = networkBridge.serverLookup(this.url); + networkBridge.removeWebSocket(this, this.url); + + this.readyState = SocketIO.CLOSED; + this.dispatchEvent( + createCloseEvent({ + type: 'close', + target: this, + code: CLOSE_CODES.CLOSE_NORMAL + }) + ); + + if (server) { + server.dispatchEvent( + createCloseEvent({ + type: 'disconnect', + target: this, + code: CLOSE_CODES.CLOSE_NORMAL + }), + server + ); + } + + return this; + }; + + /* + * Alias for Socket#close + * + * https://github.com/socketio/socket.io-client/blob/master/lib/socket.js#L383 + */ + SocketIO.prototype.disconnect = function disconnect () { + return this.close(); + }; + + /* + * Submits an event to the server with a payload + */ + SocketIO.prototype.emit = function emit (event) { + var data = [], len = arguments.length - 1; + while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ]; + + if (this.readyState !== SocketIO.OPEN) { + throw new Error('SocketIO is already in CLOSING or CLOSED state'); + } + + var messageEvent = createMessageEvent({ + type: event, + origin: this.url, + data: data + }); + + var server = networkBridge.serverLookup(this.url); + + if (server) { + server.dispatchEvent.apply(server, [ messageEvent ].concat( data )); + } + + return this; + }; + + /* + * Submits a 'message' event to the server. + * + * Should behave exactly like WebSocket#send + * + * https://github.com/socketio/socket.io-client/blob/master/lib/socket.js#L113 + */ + SocketIO.prototype.send = function send (data) { + this.emit('message', data); + return this; + }; + + /* + * For broadcasting events to other connected sockets. + * + * e.g. socket.broadcast.emit('hi!'); + * e.g. socket.broadcast.to('my-room').emit('hi!'); + */ + prototypeAccessors.broadcast.get = function () { + if (this.readyState !== SocketIO.OPEN) { + throw new Error('SocketIO is already in CLOSING or CLOSED state'); + } + + var self = this; + var server = networkBridge.serverLookup(this.url); + if (!server) { + throw new Error(("SocketIO can not find a server at the specified URL (" + (this.url) + ")")); + } + + return { + emit: function emit(event, data) { + server.emit(event, data, { websockets: networkBridge.websocketsLookup(self.url, null, self) }); + return self; + }, + to: function to(room) { + return server.to(room, self); + }, + in: function in$1(room) { + return server.in(room, self); + } + }; + }; + + /* + * For registering events to be received from the server + */ + SocketIO.prototype.on = function on (type, callback) { + this.addEventListener(type, callback); + return this; + }; + + /* + * Remove event listener + * + * https://github.com/component/emitter#emitteroffevent-fn + */ + SocketIO.prototype.off = function off (type, callback) { + this.removeEventListener(type, callback); + }; + + /* + * Check if listeners have already been added for an event + * + * https://github.com/component/emitter#emitterhaslistenersevent + */ + SocketIO.prototype.hasListeners = function hasListeners (type) { + var listeners = this.listeners[type]; + if (!Array.isArray(listeners)) { + return false; + } + return !!listeners.length; + }; + + /* + * Join a room on a server + * + * http://socket.io/docs/rooms-and-namespaces/#joining-and-leaving + */ + SocketIO.prototype.join = function join (room) { + networkBridge.addMembershipToRoom(this, room); + }; + + /* + * Get the websocket to leave the room + * + * http://socket.io/docs/rooms-and-namespaces/#joining-and-leaving + */ + SocketIO.prototype.leave = function leave (room) { + networkBridge.removeMembershipFromRoom(this, room); + }; + + SocketIO.prototype.to = function to (room) { + return this.broadcast.to(room); + }; + + SocketIO.prototype.in = function in$1 () { + return this.to.apply(null, arguments); + }; + + /* + * Invokes all listener functions that are listening to the given event.type property. Each + * listener will be passed the event as the first argument. + * + * @param {object} event - event object which will be passed to all listeners of the event.type property + */ + SocketIO.prototype.dispatchEvent = function dispatchEvent (event) { + var this$1 = this; + var customArguments = [], len = arguments.length - 1; + while ( len-- > 0 ) customArguments[ len ] = arguments[ len + 1 ]; + + var eventName = event.type; + var listeners = this.listeners[eventName]; + + if (!Array.isArray(listeners)) { + return false; + } + + listeners.forEach(function (listener) { + if (customArguments.length > 0) { + listener.apply(this$1, customArguments); + } else { + // Regular WebSockets expect a MessageEvent but Socketio.io just wants raw data + // payload instanceof MessageEvent works, but you can't isntance of NodeEvent + // for now we detect if the output has data defined on it + listener.call(this$1, event.data ? event.data : event); + } + }); + }; + + Object.defineProperties( SocketIO.prototype, prototypeAccessors ); + + return SocketIO; +}(EventTarget)); + +SocketIO$1.CONNECTING = 0; +SocketIO$1.OPEN = 1; +SocketIO$1.CLOSING = 2; +SocketIO$1.CLOSED = 3; + +/* + * Static constructor methods for the IO Socket + */ +var IO = function ioConstructor(url, protocol) { + return new SocketIO$1(url, protocol); +}; + +/* + * Alias the raw IO() constructor + */ +IO.connect = function ioConnect(url, protocol) { + /* eslint-disable new-cap */ + return IO(url, protocol); + /* eslint-enable new-cap */ +}; + +var dedupe = function (arr) { return arr.reduce(function (deduped, b) { + if (deduped.indexOf(b) > -1) { return deduped; } + return deduped.concat(b); + }, []); }; + +function retrieveGlobalObject() { + if (typeof window !== 'undefined') { + return window; + } + + return typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this; +} + +var defaultOptions = { + mock: true, + verifyClient: null, + selectProtocol: null +}; + +var Server$1 = (function (EventTarget$$1) { + function Server(url, options) { + if ( options === void 0 ) options = defaultOptions; + + EventTarget$$1.call(this); + var urlRecord = new urlParse(url); + + if (!urlRecord.pathname) { + urlRecord.pathname = '/'; + } + + this.url = urlRecord.toString(); + + this.originalWebSocket = null; + var server = networkBridge.attachServer(this, this.url); + + if (!server) { + this.dispatchEvent(createEvent({ type: 'error' })); + throw new Error('A mock server is already listening on this url'); + } + + this.options = Object.assign({}, defaultOptions, options); + + if (this.options.mock) { + this.mockWebsocket(); + } + } + + if ( EventTarget$$1 ) Server.__proto__ = EventTarget$$1; + Server.prototype = Object.create( EventTarget$$1 && EventTarget$$1.prototype ); + Server.prototype.constructor = Server; + + /* + * Attaches the mock websocket object to the global object + */ + Server.prototype.mockWebsocket = function mockWebsocket () { + var globalObj = retrieveGlobalObject(); + + this.originalWebSocket = globalObj.WebSocket; + globalObj.WebSocket = WebSocket$1; + }; + + /* + * Removes the mock websocket object from the global object + */ + Server.prototype.restoreWebsocket = function restoreWebsocket () { + var globalObj = retrieveGlobalObject(); + + if (this.originalWebSocket !== null) { + globalObj.WebSocket = this.originalWebSocket; + } + + this.originalWebSocket = null; + }; + + /** + * Removes itself from the urlMap so another server could add itself to the url. + * @param {function} callback - The callback is called when the server is stopped + */ + Server.prototype.stop = function stop (callback) { + if ( callback === void 0 ) callback = function () {}; + + if (this.options.mock) { + this.restoreWebsocket(); + } + + networkBridge.removeServer(this.url); + + if (typeof callback === 'function') { + callback(); + } + }; + + /* + * This is the main function for the mock server to subscribe to the on events. + * + * ie: mockServer.on('connection', function() { console.log('a mock client connected'); }); + * + * @param {string} type - The event key to subscribe to. Valid keys are: connection, message, and close. + * @param {function} callback - The callback which should be called when a certain event is fired. + */ + Server.prototype.on = function on (type, callback) { + this.addEventListener(type, callback); + }; + + /* + * Remove event listener + */ + Server.prototype.off = function off (type, callback) { + this.removeEventListener(type, callback); + }; + + /* + * Closes the connection and triggers the onclose method of all listening + * websockets. After that it removes itself from the urlMap so another server + * could add itself to the url. + * + * @param {object} options + */ + Server.prototype.close = function close (options) { + if ( options === void 0 ) options = {}; + + var code = options.code; + var reason = options.reason; + var wasClean = options.wasClean; + var listeners = networkBridge.websocketsLookup(this.url); + + // Remove server before notifications to prevent immediate reconnects from + // socket onclose handlers + networkBridge.removeServer(this.url); + + listeners.forEach(function (socket) { + socket.readyState = WebSocket$1.CLOSED; + socket.dispatchEvent( + createCloseEvent({ + type: 'close', + target: socket.target, + code: code || CLOSE_CODES.CLOSE_NORMAL, + reason: reason || '', + wasClean: wasClean + }) + ); + }); + + this.dispatchEvent(createCloseEvent({ type: 'close' }), this); + }; + + /* + * Sends a generic message event to all mock clients. + */ + Server.prototype.emit = function emit (event, data, options) { + var this$1 = this; + if ( options === void 0 ) options = {}; + + var websockets = options.websockets; + + if (!websockets) { + websockets = networkBridge.websocketsLookup(this.url); + } + + var normalizedData; + if (typeof options !== 'object' || arguments.length > 3) { + data = Array.prototype.slice.call(arguments, 1, arguments.length); + normalizedData = data.map(function (item) { return normalizeSendData(item); }); + } else { + normalizedData = normalizeSendData(data); + } + + websockets.forEach(function (socket) { + var messageData = socket instanceof SocketIO$1 ? data : normalizedData; + if (Array.isArray(messageData)) { + socket.dispatchEvent.apply( + socket, [ createMessageEvent({ + type: event, + data: messageData, + origin: this$1.url, + target: socket.target + }) ].concat( messageData ) + ); + } else { + socket.dispatchEvent( + createMessageEvent({ + type: event, + data: messageData, + origin: this$1.url, + target: socket.target + }) + ); + } + }); + }; + + /* + * Returns an array of websockets which are listening to this server + * TOOD: this should return a set and not be a method + */ + Server.prototype.clients = function clients () { + return networkBridge.websocketsLookup(this.url); + }; + + /* + * Prepares a method to submit an event to members of the room + * + * e.g. server.to('my-room').emit('hi!'); + */ + Server.prototype.to = function to (room, broadcaster, broadcastList) { + var this$1 = this; + if ( broadcastList === void 0 ) broadcastList = []; + + var self = this; + var websockets = dedupe(broadcastList.concat(networkBridge.websocketsLookup(this.url, room, broadcaster))); + + return { + to: function (chainedRoom, chainedBroadcaster) { return this$1.to.call(this$1, chainedRoom, chainedBroadcaster, websockets); }, + emit: function emit(event, data) { + self.emit(event, data, { websockets: websockets }); + } + }; + }; + + /* + * Alias for Server.to + */ + Server.prototype.in = function in$1 () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + return this.to.apply(null, args); + }; + + /* + * Simulate an event from the server to the clients. Useful for + * simulating errors. + */ + Server.prototype.simulate = function simulate (event) { + var listeners = networkBridge.websocketsLookup(this.url); + + if (event === 'error') { + listeners.forEach(function (socket) { + socket.readyState = WebSocket$1.CLOSED; + socket.dispatchEvent(createEvent({ type: 'error', target: socket.target })); + }); + } + }; + + return Server; +}(EventTarget)); + +/* + * Alternative constructor to support namespaces in socket.io + * + * http://socket.io/docs/rooms-and-namespaces/#custom-namespaces + */ +Server$1.of = function of(url) { + return new Server$1(url); +}; + +var Server = Server$1; +var WebSocket = WebSocket$1; +var SocketIO$$1 = IO; + +exports.Server = Server; +exports.WebSocket = WebSocket; +exports.SocketIO = SocketIO$$1; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/www/static/test/1.9.2/node_modules/sinon/pkg/sinon.js b/www/static/test/1.9.2/node_modules/sinon/pkg/sinon.js new file mode 100644 index 000000000..e27c70216 --- /dev/null +++ b/www/static/test/1.9.2/node_modules/sinon/pkg/sinon.js @@ -0,0 +1,16184 @@ +/* Sinon.JS 9.2.4, 2021-01-23, @license BSD-3 */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.sinon = f()}})(function(){var define,module,exports;return (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= 0) { + return args[callArgAt]; + } + + var argumentList; + + if (callArgAt === useLeftMostCallback) { + argumentList = args; + } + + if (callArgAt === useRightMostCallback) { + argumentList = reverse(slice(args)); + } + + var callArgProp = behavior.callArgProp; + + for (var i = 0, l = argumentList.length; i < l; ++i) { + if (!callArgProp && typeof argumentList[i] === "function") { + return argumentList[i]; + } + + if (callArgProp && argumentList[i] && typeof argumentList[i][callArgProp] === "function") { + return argumentList[i][callArgProp]; + } + } + + return null; +} + +function getCallbackError(behavior, func, args) { + if (behavior.callArgAt < 0) { + var msg; + + if (behavior.callArgProp) { + msg = + functionName(behavior.stub) + + " expected to yield to '" + + valueToString(behavior.callArgProp) + + "', but no object with such a property was passed."; + } else { + msg = functionName(behavior.stub) + " expected to yield, but no callback was passed."; + } + + if (args.length > 0) { + msg += " Received [" + join(args, ", ") + "]"; + } + + return msg; + } + + return "argument at index " + behavior.callArgAt + " is not a function: " + func; +} + +function ensureArgs(name, behavior, args) { + // map function name to internal property + // callsArg => callArgAt + var property = name.replace(/sArg/, "ArgAt"); + var index = behavior[property]; + + if (index >= args.length) { + throw new TypeError( + name + " failed: " + (index + 1) + " arguments required but only " + args.length + " present" + ); + } +} + +function callCallback(behavior, args) { + if (typeof behavior.callArgAt === "number") { + ensureArgs("callsArg", behavior, args); + var func = getCallback(behavior, args); + + if (typeof func !== "function") { + throw new TypeError(getCallbackError(behavior, func, args)); + } + + if (behavior.callbackAsync) { + nextTick(function() { + func.apply(behavior.callbackContext, behavior.callbackArguments); + }); + } else { + return func.apply(behavior.callbackContext, behavior.callbackArguments); + } + } + + return undefined; +} + +var proto = { + create: function create(stub) { + var behavior = extend({}, proto); + delete behavior.create; + delete behavior.addBehavior; + delete behavior.createBehavior; + behavior.stub = stub; + + if (stub.defaultBehavior && stub.defaultBehavior.promiseLibrary) { + behavior.promiseLibrary = stub.defaultBehavior.promiseLibrary; + } + + return behavior; + }, + + isPresent: function isPresent() { + return ( + typeof this.callArgAt === "number" || + this.exception || + this.exceptionCreator || + typeof this.returnArgAt === "number" || + this.returnThis || + typeof this.resolveArgAt === "number" || + this.resolveThis || + typeof this.throwArgAt === "number" || + this.fakeFn || + this.returnValueDefined + ); + }, + + /*eslint complexity: ["error", 20]*/ + invoke: function invoke(context, args) { + /* + * callCallback (conditionally) calls ensureArgs + * + * Note: callCallback intentionally happens before + * everything else and cannot be moved lower + */ + var returnValue = callCallback(this, args); + + if (this.exception) { + throw this.exception; + } else if (this.exceptionCreator) { + this.exception = this.exceptionCreator(); + this.exceptionCreator = undefined; + throw this.exception; + } else if (typeof this.returnArgAt === "number") { + ensureArgs("returnsArg", this, args); + return args[this.returnArgAt]; + } else if (this.returnThis) { + return context; + } else if (typeof this.throwArgAt === "number") { + ensureArgs("throwsArg", this, args); + throw args[this.throwArgAt]; + } else if (this.fakeFn) { + return this.fakeFn.apply(context, args); + } else if (typeof this.resolveArgAt === "number") { + ensureArgs("resolvesArg", this, args); + return (this.promiseLibrary || Promise).resolve(args[this.resolveArgAt]); + } else if (this.resolveThis) { + return (this.promiseLibrary || Promise).resolve(context); + } else if (this.resolve) { + return (this.promiseLibrary || Promise).resolve(this.returnValue); + } else if (this.reject) { + return (this.promiseLibrary || Promise).reject(this.returnValue); + } else if (this.callsThrough) { + var wrappedMethod = this.effectiveWrappedMethod(); + + return wrappedMethod.apply(context, args); + } else if (this.callsThroughWithNew) { + // Get the original method (assumed to be a constructor in this case) + var WrappedClass = this.effectiveWrappedMethod(); + // Turn the arguments object into a normal array + var argsArray = slice(args); + // Call the constructor + var F = WrappedClass.bind.apply(WrappedClass, concat([null], argsArray)); + return new F(); + } else if (typeof this.returnValue !== "undefined") { + return this.returnValue; + } else if (typeof this.callArgAt === "number") { + return returnValue; + } + + return this.returnValue; + }, + + effectiveWrappedMethod: function effectiveWrappedMethod() { + for (var stubb = this.stub; stubb; stubb = stubb.parent) { + if (stubb.wrappedMethod) { + return stubb.wrappedMethod; + } + } + throw new Error("Unable to find wrapped method"); + }, + + onCall: function onCall(index) { + return this.stub.onCall(index); + }, + + onFirstCall: function onFirstCall() { + return this.stub.onFirstCall(); + }, + + onSecondCall: function onSecondCall() { + return this.stub.onSecondCall(); + }, + + onThirdCall: function onThirdCall() { + return this.stub.onThirdCall(); + }, + + withArgs: function withArgs(/* arguments */) { + throw new Error( + 'Defining a stub by invoking "stub.onCall(...).withArgs(...)" ' + + 'is not supported. Use "stub.withArgs(...).onCall(...)" ' + + "to define sequential behavior for calls with certain arguments." + ); + } +}; + +function createBehavior(behaviorMethod) { + return function() { + this.defaultBehavior = this.defaultBehavior || proto.create(this); + this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments); + return this; + }; +} + +function addBehavior(stub, name, fn) { + proto[name] = function() { + fn.apply(this, concat([this], slice(arguments))); + return this.stub || this; + }; + + stub[name] = createBehavior(name); +} + +proto.addBehavior = addBehavior; +proto.createBehavior = createBehavior; + +var asyncBehaviors = exportAsyncBehaviors(proto); + +module.exports = extend.nonEnum({}, proto, asyncBehaviors); + +},{"./util/core/export-async-behaviors":22,"./util/core/extend":23,"./util/core/next-tick":31,"@sinonjs/commons":44}],4:[function(require,module,exports){ +"use strict"; + +var walk = require("./util/core/walk"); +var getPropertyDescriptor = require("./util/core/get-property-descriptor"); +var hasOwnProperty = require("@sinonjs/commons").prototypes.object.hasOwnProperty; +var push = require("@sinonjs/commons").prototypes.array.push; + +function collectMethod(methods, object, prop, propOwner) { + if (typeof getPropertyDescriptor(propOwner, prop).value === "function" && hasOwnProperty(object, prop)) { + push(methods, object[prop]); + } +} + +// This function returns an array of all the own methods on the passed object +function collectOwnMethods(object) { + var methods = []; + + walk(object, collectMethod.bind(null, methods, object)); + + return methods; +} + +module.exports = collectOwnMethods; + +},{"./util/core/get-property-descriptor":27,"./util/core/walk":35,"@sinonjs/commons":44}],5:[function(require,module,exports){ +"use strict"; + +var supportsColor = require("supports-color"); + +function colorize(str, color) { + if (supportsColor.stdout === false) { + return str; + } + + return "\x1b[" + color + "m" + str + "\x1b[0m"; +} + +exports.red = function(str) { + return colorize(str, 31); +}; + +exports.green = function(str) { + return colorize(str, 32); +}; + +exports.cyan = function(str) { + return colorize(str, 96); +}; + +exports.white = function(str) { + return colorize(str, 39); +}; + +exports.bold = function(str) { + return colorize(str, 1); +}; + +},{"supports-color":103}],6:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var Sandbox = require("./sandbox"); + +var forEach = arrayProto.forEach; +var push = arrayProto.push; + +function prepareSandboxFromConfig(config) { + var sandbox = new Sandbox(); + + if (config.useFakeServer) { + if (typeof config.useFakeServer === "object") { + sandbox.serverPrototype = config.useFakeServer; + } + + sandbox.useFakeServer(); + } + + if (config.useFakeTimers) { + if (typeof config.useFakeTimers === "object") { + sandbox.useFakeTimers(config.useFakeTimers); + } else { + sandbox.useFakeTimers(); + } + } + + return sandbox; +} + +function exposeValue(sandbox, config, key, value) { + if (!value) { + return; + } + + if (config.injectInto && !(key in config.injectInto)) { + config.injectInto[key] = value; + push(sandbox.injectedKeys, key); + } else { + push(sandbox.args, value); + } +} + +function createSandbox(config) { + if (!config) { + return new Sandbox(); + } + + var configuredSandbox = prepareSandboxFromConfig(config); + configuredSandbox.args = configuredSandbox.args || []; + configuredSandbox.injectedKeys = []; + configuredSandbox.injectInto = config.injectInto; + var exposed = configuredSandbox.inject({}); + + if (config.properties) { + forEach(config.properties, function(prop) { + var value = exposed[prop] || (prop === "sandbox" && configuredSandbox); + exposeValue(configuredSandbox, config, prop, value); + }); + } else { + exposeValue(configuredSandbox, config, "sandbox"); + } + + return configuredSandbox; +} + +module.exports = createSandbox; + +},{"./sandbox":16,"@sinonjs/commons":44}],7:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var isPropertyConfigurable = require("./util/core/is-property-configurable"); +var exportAsyncBehaviors = require("./util/core/export-async-behaviors"); +var extend = require("./util/core/extend"); + +var slice = arrayProto.slice; + +var useLeftMostCallback = -1; +var useRightMostCallback = -2; + +function throwsException(fake, error, message) { + if (typeof error === "function") { + fake.exceptionCreator = error; + } else if (typeof error === "string") { + fake.exceptionCreator = function() { + var newException = new Error(message || ""); + newException.name = error; + return newException; + }; + } else if (!error) { + fake.exceptionCreator = function() { + return new Error("Error"); + }; + } else { + fake.exception = error; + } +} + +var defaultBehaviors = { + callsFake: function callsFake(fake, fn) { + fake.fakeFn = fn; + }, + + callsArg: function callsArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = []; + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + callsArgOn: function callsArgOn(fake, index, context) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = []; + fake.callbackContext = context; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + callsArgWith: function callsArgWith(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = slice(arguments, 2); + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + callsArgOnWith: function callsArgWith(fake, index, context) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = slice(arguments, 3); + fake.callbackContext = context; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + usingPromise: function usingPromise(fake, promiseLibrary) { + fake.promiseLibrary = promiseLibrary; + }, + + yields: function(fake) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 1); + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + yieldsRight: function(fake) { + fake.callArgAt = useRightMostCallback; + fake.callbackArguments = slice(arguments, 1); + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + yieldsOn: function(fake, context) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 2); + fake.callbackContext = context; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + yieldsTo: function(fake, prop) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 2); + fake.callbackContext = undefined; + fake.callArgProp = prop; + fake.callbackAsync = false; + }, + + yieldsToOn: function(fake, prop, context) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 3); + fake.callbackContext = context; + fake.callArgProp = prop; + fake.callbackAsync = false; + }, + + throws: throwsException, + throwsException: throwsException, + + returns: function returns(fake, value) { + fake.returnValue = value; + fake.resolve = false; + fake.reject = false; + fake.returnValueDefined = true; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + returnsArg: function returnsArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.returnArgAt = index; + }, + + throwsArg: function throwsArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.throwArgAt = index; + }, + + returnsThis: function returnsThis(fake) { + fake.returnThis = true; + }, + + resolves: function resolves(fake, value) { + fake.returnValue = value; + fake.resolve = true; + fake.resolveThis = false; + fake.reject = false; + fake.returnValueDefined = true; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + resolvesArg: function resolvesArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + fake.resolveArgAt = index; + fake.returnValue = undefined; + fake.resolve = true; + fake.resolveThis = false; + fake.reject = false; + fake.returnValueDefined = false; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + rejects: function rejects(fake, error, message) { + var reason; + if (typeof error === "string") { + reason = new Error(message || ""); + reason.name = error; + } else if (!error) { + reason = new Error("Error"); + } else { + reason = error; + } + fake.returnValue = reason; + fake.resolve = false; + fake.resolveThis = false; + fake.reject = true; + fake.returnValueDefined = true; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + + return fake; + }, + + resolvesThis: function resolvesThis(fake) { + fake.returnValue = undefined; + fake.resolve = false; + fake.resolveThis = true; + fake.reject = false; + fake.returnValueDefined = false; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + callThrough: function callThrough(fake) { + fake.callsThrough = true; + }, + + callThroughWithNew: function callThroughWithNew(fake) { + fake.callsThroughWithNew = true; + }, + + get: function get(fake, getterFunction) { + var rootStub = fake.stub || fake; + + Object.defineProperty(rootStub.rootObj, rootStub.propName, { + get: getterFunction, + configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName) + }); + + return fake; + }, + + set: function set(fake, setterFunction) { + var rootStub = fake.stub || fake; + + Object.defineProperty( + rootStub.rootObj, + rootStub.propName, + // eslint-disable-next-line accessor-pairs + { + set: setterFunction, + configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName) + } + ); + + return fake; + }, + + value: function value(fake, newVal) { + var rootStub = fake.stub || fake; + + Object.defineProperty(rootStub.rootObj, rootStub.propName, { + value: newVal, + enumerable: true, + configurable: rootStub.shadowsPropOnPrototype || isPropertyConfigurable(rootStub.rootObj, rootStub.propName) + }); + + return fake; + } +}; + +var asyncBehaviors = exportAsyncBehaviors(defaultBehaviors); + +module.exports = extend({}, defaultBehaviors, asyncBehaviors); + +},{"./util/core/export-async-behaviors":22,"./util/core/extend":23,"./util/core/is-property-configurable":30,"@sinonjs/commons":44}],8:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var createProxy = require("./proxy"); +var nextTick = require("./util/core/next-tick"); + +var slice = arrayProto.slice; + +function getError(value) { + return value instanceof Error ? value : new Error(value); +} + +var uuid = 0; +function wrapFunc(f) { + var proxy; + var fakeInstance = function() { + var firstArg, lastArg; + + if (arguments.length > 0) { + firstArg = arguments[0]; + lastArg = arguments[arguments.length - 1]; + } + + var callback = lastArg && typeof lastArg === "function" ? lastArg : undefined; + + proxy.firstArg = firstArg; + proxy.lastArg = lastArg; + proxy.callback = callback; + + return f && f.apply(this, arguments); + }; + proxy = createProxy(fakeInstance, f || fakeInstance); + + proxy.displayName = "fake"; + proxy.id = "fake#" + uuid++; + + return proxy; +} + +function fakeClass() { + var promiseLib = null; + if (typeof Promise === "function") { + promiseLib = Promise; + } + + function fake(f) { + if (arguments.length > 0 && typeof f !== "function") { + throw new TypeError("Expected f argument to be a Function"); + } + + return wrapFunc(f); + } + + fake.returns = function returns(value) { + function f() { + return value; + } + + return wrapFunc(f); + }; + + fake.throws = function throws(value) { + function f() { + throw getError(value); + } + + return wrapFunc(f); + }; + + fake.resolves = function resolves(value) { + function f() { + return promiseLib.resolve(value); + } + + return wrapFunc(f); + }; + + fake.rejects = function rejects(value) { + function f() { + return promiseLib.reject(getError(value)); + } + + return wrapFunc(f); + }; + + fake.usingPromise = function usingPromise(promiseLibrary) { + promiseLib = promiseLibrary; + return fake; + }; + + function yieldInternal(async, values) { + function f() { + var callback = arguments[arguments.length - 1]; + if (typeof callback !== "function") { + throw new TypeError("Expected last argument to be a function"); + } + if (async) { + nextTick(function() { + callback.apply(null, values); + }); + } else { + callback.apply(null, values); + } + } + + return wrapFunc(f); + } + + fake.yields = function yields() { + return yieldInternal(false, slice(arguments)); + }; + + fake.yieldsAsync = function yieldsAsync() { + return yieldInternal(true, slice(arguments)); + }; + + return fake; +} + +module.exports = fakeClass(); + +},{"./proxy":14,"./util/core/next-tick":31,"@sinonjs/commons":44}],9:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var proxyInvoke = require("./proxy-invoke"); +var proxyCallToString = require("./proxy-call").toString; +var timesInWords = require("./util/core/times-in-words"); +var extend = require("./util/core/extend"); +var match = require("@sinonjs/samsam").createMatcher; +var stub = require("./stub"); +var assert = require("./assert"); +var deepEqual = require("@sinonjs/samsam").deepEqual; +var format = require("./util/core/format"); +var valueToString = require("@sinonjs/commons").valueToString; + +var every = arrayProto.every; +var forEach = arrayProto.forEach; +var push = arrayProto.push; +var slice = arrayProto.slice; + +function callCountInWords(callCount) { + if (callCount === 0) { + return "never called"; + } + + return "called " + timesInWords(callCount); +} + +function expectedCallCountInWords(expectation) { + var min = expectation.minCalls; + var max = expectation.maxCalls; + + if (typeof min === "number" && typeof max === "number") { + var str = timesInWords(min); + + if (min !== max) { + str = "at least " + str + " and at most " + timesInWords(max); + } + + return str; + } + + if (typeof min === "number") { + return "at least " + timesInWords(min); + } + + return "at most " + timesInWords(max); +} + +function receivedMinCalls(expectation) { + var hasMinLimit = typeof expectation.minCalls === "number"; + return !hasMinLimit || expectation.callCount >= expectation.minCalls; +} + +function receivedMaxCalls(expectation) { + if (typeof expectation.maxCalls !== "number") { + return false; + } + + return expectation.callCount === expectation.maxCalls; +} + +function verifyMatcher(possibleMatcher, arg) { + var isMatcher = match.isMatcher(possibleMatcher); + + return (isMatcher && possibleMatcher.test(arg)) || true; +} + +var mockExpectation = { + minCalls: 1, + maxCalls: 1, + + create: function create(methodName) { + var expectation = extend.nonEnum(stub(), mockExpectation); + delete expectation.create; + expectation.method = methodName; + + return expectation; + }, + + invoke: function invoke(func, thisValue, args) { + this.verifyCallAllowed(thisValue, args); + + return proxyInvoke.apply(this, arguments); + }, + + atLeast: function atLeast(num) { + if (typeof num !== "number") { + throw new TypeError("'" + valueToString(num) + "' is not number"); + } + + if (!this.limitsSet) { + this.maxCalls = null; + this.limitsSet = true; + } + + this.minCalls = num; + + return this; + }, + + atMost: function atMost(num) { + if (typeof num !== "number") { + throw new TypeError("'" + valueToString(num) + "' is not number"); + } + + if (!this.limitsSet) { + this.minCalls = null; + this.limitsSet = true; + } + + this.maxCalls = num; + + return this; + }, + + never: function never() { + return this.exactly(0); + }, + + once: function once() { + return this.exactly(1); + }, + + twice: function twice() { + return this.exactly(2); + }, + + thrice: function thrice() { + return this.exactly(3); + }, + + exactly: function exactly(num) { + if (typeof num !== "number") { + throw new TypeError("'" + valueToString(num) + "' is not a number"); + } + + this.atLeast(num); + return this.atMost(num); + }, + + met: function met() { + return !this.failed && receivedMinCalls(this); + }, + + verifyCallAllowed: function verifyCallAllowed(thisValue, args) { + var expectedArguments = this.expectedArguments; + + if (receivedMaxCalls(this)) { + this.failed = true; + mockExpectation.fail(this.method + " already called " + timesInWords(this.maxCalls)); + } + + if ("expectedThis" in this && this.expectedThis !== thisValue) { + mockExpectation.fail( + this.method + + " called with " + + valueToString(thisValue) + + " as thisValue, expected " + + valueToString(this.expectedThis) + ); + } + + if (!("expectedArguments" in this)) { + return; + } + + if (!args) { + mockExpectation.fail(this.method + " received no arguments, expected " + format(expectedArguments)); + } + + if (args.length < expectedArguments.length) { + mockExpectation.fail( + this.method + + " received too few arguments (" + + format(args) + + "), expected " + + format(expectedArguments) + ); + } + + if (this.expectsExactArgCount && args.length !== expectedArguments.length) { + mockExpectation.fail( + this.method + + " received too many arguments (" + + format(args) + + "), expected " + + format(expectedArguments) + ); + } + + forEach( + expectedArguments, + function(expectedArgument, i) { + if (!verifyMatcher(expectedArgument, args[i])) { + mockExpectation.fail( + this.method + + " received wrong arguments " + + format(args) + + ", didn't match " + + String(expectedArguments) + ); + } + + if (!deepEqual(args[i], expectedArgument)) { + mockExpectation.fail( + this.method + + " received wrong arguments " + + format(args) + + ", expected " + + format(expectedArguments) + ); + } + }, + this + ); + }, + + allowsCall: function allowsCall(thisValue, args) { + var expectedArguments = this.expectedArguments; + + if (this.met() && receivedMaxCalls(this)) { + return false; + } + + if ("expectedThis" in this && this.expectedThis !== thisValue) { + return false; + } + + if (!("expectedArguments" in this)) { + return true; + } + + // eslint-disable-next-line no-underscore-dangle + var _args = args || []; + + if (_args.length < expectedArguments.length) { + return false; + } + + if (this.expectsExactArgCount && _args.length !== expectedArguments.length) { + return false; + } + + return every(expectedArguments, function(expectedArgument, i) { + if (!verifyMatcher(expectedArgument, _args[i])) { + return false; + } + + if (!deepEqual(_args[i], expectedArgument)) { + return false; + } + + return true; + }); + }, + + withArgs: function withArgs() { + this.expectedArguments = slice(arguments); + return this; + }, + + withExactArgs: function withExactArgs() { + this.withArgs.apply(this, arguments); + this.expectsExactArgCount = true; + return this; + }, + + on: function on(thisValue) { + this.expectedThis = thisValue; + return this; + }, + + toString: function() { + var args = slice(this.expectedArguments || []); + + if (!this.expectsExactArgCount) { + push(args, "[...]"); + } + + var callStr = proxyCallToString.call({ + proxy: this.method || "anonymous mock expectation", + args: args + }); + + var message = callStr.replace(", [...", "[, ...") + " " + expectedCallCountInWords(this); + + if (this.met()) { + return "Expectation met: " + message; + } + + return "Expected " + message + " (" + callCountInWords(this.callCount) + ")"; + }, + + verify: function verify() { + if (!this.met()) { + mockExpectation.fail(String(this)); + } else { + mockExpectation.pass(String(this)); + } + + return true; + }, + + pass: function pass(message) { + assert.pass(message); + }, + + fail: function fail(message) { + var exception = new Error(message); + exception.name = "ExpectationError"; + + throw exception; + } +}; + +module.exports = mockExpectation; + +},{"./assert":2,"./proxy-call":12,"./proxy-invoke":13,"./stub":19,"./util/core/extend":23,"./util/core/format":24,"./util/core/times-in-words":32,"@sinonjs/commons":44,"@sinonjs/samsam":82}],10:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var mockExpectation = require("./mock-expectation"); +var proxyCallToString = require("./proxy-call").toString; +var extend = require("./util/core/extend"); +var deepEqual = require("@sinonjs/samsam").deepEqual; +var wrapMethod = require("./util/core/wrap-method"); +var usePromiseLibrary = require("./util/core/use-promise-library"); + +var concat = arrayProto.concat; +var filter = arrayProto.filter; +var forEach = arrayProto.forEach; +var every = arrayProto.every; +var join = arrayProto.join; +var push = arrayProto.push; +var slice = arrayProto.slice; +var unshift = arrayProto.unshift; + +function mock(object) { + if (!object || typeof object === "string") { + return mockExpectation.create(object ? object : "Anonymous mock"); + } + + return mock.create(object); +} + +function each(collection, callback) { + var col = collection || []; + + forEach(col, callback); +} + +function arrayEquals(arr1, arr2, compareLength) { + if (compareLength && arr1.length !== arr2.length) { + return false; + } + + return every(arr1, function(element, i) { + return deepEqual(arr2[i], element); + }); +} + +extend(mock, { + create: function create(object) { + if (!object) { + throw new TypeError("object is null"); + } + + var mockObject = extend.nonEnum({}, mock, { object: object }); + delete mockObject.create; + + return mockObject; + }, + + expects: function expects(method) { + if (!method) { + throw new TypeError("method is falsy"); + } + + if (!this.expectations) { + this.expectations = {}; + this.proxies = []; + this.failures = []; + } + + if (!this.expectations[method]) { + this.expectations[method] = []; + var mockObject = this; + + wrapMethod(this.object, method, function() { + return mockObject.invokeMethod(method, this, arguments); + }); + + push(this.proxies, method); + } + + var expectation = mockExpectation.create(method); + expectation.wrappedMethod = this.object[method].wrappedMethod; + push(this.expectations[method], expectation); + usePromiseLibrary(this.promiseLibrary, expectation); + + return expectation; + }, + + restore: function restore() { + var object = this.object; + + each(this.proxies, function(proxy) { + if (typeof object[proxy].restore === "function") { + object[proxy].restore(); + } + }); + }, + + verify: function verify() { + var expectations = this.expectations || {}; + var messages = this.failures ? slice(this.failures) : []; + var met = []; + + each(this.proxies, function(proxy) { + each(expectations[proxy], function(expectation) { + if (!expectation.met()) { + push(messages, String(expectation)); + } else { + push(met, String(expectation)); + } + }); + }); + + this.restore(); + + if (messages.length > 0) { + mockExpectation.fail(join(concat(messages, met), "\n")); + } else if (met.length > 0) { + mockExpectation.pass(join(concat(messages, met), "\n")); + } + + return true; + }, + + usingPromise: function usingPromise(promiseLibrary) { + this.promiseLibrary = promiseLibrary; + + return this; + }, + + invokeMethod: function invokeMethod(method, thisValue, args) { + /* if we cannot find any matching files we will explicitly call mockExpection#fail with error messages */ + /* eslint consistent-return: "off" */ + var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : []; + var currentArgs = args || []; + var available; + + var expectationsWithMatchingArgs = filter(expectations, function(expectation) { + var expectedArgs = expectation.expectedArguments || []; + + return arrayEquals(expectedArgs, currentArgs, expectation.expectsExactArgCount); + }); + + var expectationsToApply = filter(expectationsWithMatchingArgs, function(expectation) { + return !expectation.met() && expectation.allowsCall(thisValue, args); + }); + + if (expectationsToApply.length > 0) { + return expectationsToApply[0].apply(thisValue, args); + } + + var messages = []; + var exhausted = 0; + + forEach(expectationsWithMatchingArgs, function(expectation) { + if (expectation.allowsCall(thisValue, args)) { + available = available || expectation; + } else { + exhausted += 1; + } + }); + + if (available && exhausted === 0) { + return available.apply(thisValue, args); + } + + forEach(expectations, function(expectation) { + push(messages, " " + String(expectation)); + }); + + unshift( + messages, + "Unexpected call: " + + proxyCallToString.call({ + proxy: method, + args: args + }) + ); + + var err = new Error(); + if (!err.stack) { + // PhantomJS does not serialize the stack trace until the error has been thrown + try { + throw err; + } catch (e) { + /* empty */ + } + } + push( + this.failures, + "Unexpected call: " + + proxyCallToString.call({ + proxy: method, + args: args, + stack: err.stack + }) + ); + + mockExpectation.fail(join(messages, "\n")); + } +}); + +module.exports = mock; + +},{"./mock-expectation":9,"./proxy-call":12,"./util/core/extend":23,"./util/core/use-promise-library":33,"./util/core/wrap-method":36,"@sinonjs/commons":44,"@sinonjs/samsam":82}],11:[function(require,module,exports){ +"use strict"; + +var push = require("@sinonjs/commons").prototypes.array.push; + +exports.incrementCallCount = function incrementCallCount(proxy) { + proxy.called = true; + proxy.callCount += 1; + proxy.notCalled = false; + proxy.calledOnce = proxy.callCount === 1; + proxy.calledTwice = proxy.callCount === 2; + proxy.calledThrice = proxy.callCount === 3; +}; + +exports.createCallProperties = function createCallProperties(proxy) { + proxy.firstCall = proxy.getCall(0); + proxy.secondCall = proxy.getCall(1); + proxy.thirdCall = proxy.getCall(2); + proxy.lastCall = proxy.getCall(proxy.callCount - 1); +}; + +exports.delegateToCalls = function delegateToCalls( + proxy, + method, + matchAny, + actual, + returnsValues, + notCalled, + totalCallCount +) { + proxy[method] = function() { + if (!this.called) { + if (notCalled) { + return notCalled.apply(this, arguments); + } + return false; + } + + if (totalCallCount !== undefined && this.callCount !== totalCallCount) { + return false; + } + + var currentCall; + var matches = 0; + var returnValues = []; + + for (var i = 0, l = this.callCount; i < l; i += 1) { + currentCall = this.getCall(i); + var returnValue = currentCall[actual || method].apply(currentCall, arguments); + push(returnValues, returnValue); + if (returnValue) { + matches += 1; + + if (matchAny) { + return true; + } + } + } + + if (returnsValues) { + return returnValues; + } + return matches === this.callCount; + }; +}; + +},{"@sinonjs/commons":44}],12:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var match = require("@sinonjs/samsam").createMatcher; +var deepEqual = require("@sinonjs/samsam").deepEqual; +var functionName = require("@sinonjs/commons").functionName; +var sinonFormat = require("./util/core/format"); +var valueToString = require("@sinonjs/commons").valueToString; + +var concat = arrayProto.concat; +var filter = arrayProto.filter; +var join = arrayProto.join; +var map = arrayProto.map; +var reduce = arrayProto.reduce; +var slice = arrayProto.slice; + +function throwYieldError(proxy, text, args) { + var msg = functionName(proxy) + text; + if (args.length) { + msg += " Received [" + join(slice(args), ", ") + "]"; + } + throw new Error(msg); +} + +var callProto = { + calledOn: function calledOn(thisValue) { + if (match.isMatcher(thisValue)) { + return thisValue.test(this.thisValue); + } + return this.thisValue === thisValue; + }, + + calledWith: function calledWith() { + var self = this; + var calledWithArgs = slice(arguments); + + if (calledWithArgs.length > self.args.length) { + return false; + } + + return reduce( + calledWithArgs, + function(prev, arg, i) { + return prev && deepEqual(self.args[i], arg); + }, + true + ); + }, + + calledWithMatch: function calledWithMatch() { + var self = this; + var calledWithMatchArgs = slice(arguments); + + if (calledWithMatchArgs.length > self.args.length) { + return false; + } + + return reduce( + calledWithMatchArgs, + function(prev, expectation, i) { + var actual = self.args[i]; + + return prev && match(expectation).test(actual); + }, + true + ); + }, + + calledWithExactly: function calledWithExactly() { + return arguments.length === this.args.length && this.calledWith.apply(this, arguments); + }, + + notCalledWith: function notCalledWith() { + return !this.calledWith.apply(this, arguments); + }, + + notCalledWithMatch: function notCalledWithMatch() { + return !this.calledWithMatch.apply(this, arguments); + }, + + returned: function returned(value) { + return deepEqual(this.returnValue, value); + }, + + threw: function threw(error) { + if (typeof error === "undefined" || !this.exception) { + return Boolean(this.exception); + } + + return this.exception === error || this.exception.name === error; + }, + + calledWithNew: function calledWithNew() { + return this.proxy.prototype && this.thisValue instanceof this.proxy; + }, + + calledBefore: function(other) { + return this.callId < other.callId; + }, + + calledAfter: function(other) { + return this.callId > other.callId; + }, + + calledImmediatelyBefore: function(other) { + return this.callId === other.callId - 1; + }, + + calledImmediatelyAfter: function(other) { + return this.callId === other.callId + 1; + }, + + callArg: function(pos) { + this.ensureArgIsAFunction(pos); + return this.args[pos](); + }, + + callArgOn: function(pos, thisValue) { + this.ensureArgIsAFunction(pos); + return this.args[pos].apply(thisValue); + }, + + callArgWith: function(pos) { + return this.callArgOnWith.apply(this, concat([pos, null], slice(arguments, 1))); + }, + + callArgOnWith: function(pos, thisValue) { + this.ensureArgIsAFunction(pos); + var args = slice(arguments, 2); + return this.args[pos].apply(thisValue, args); + }, + + throwArg: function(pos) { + if (pos > this.args.length) { + throw new TypeError("Not enough arguments: " + pos + " required but only " + this.args.length + " present"); + } + + throw this.args[pos]; + }, + + yield: function() { + return this.yieldOn.apply(this, concat([null], slice(arguments, 0))); + }, + + yieldOn: function(thisValue) { + var args = slice(this.args); + var yieldFn = filter(args, function(arg) { + return typeof arg === "function"; + })[0]; + + if (!yieldFn) { + throwYieldError(this.proxy, " cannot yield since no callback was passed.", args); + } + + return yieldFn.apply(thisValue, slice(arguments, 1)); + }, + + yieldTo: function(prop) { + return this.yieldToOn.apply(this, concat([prop, null], slice(arguments, 1))); + }, + + yieldToOn: function(prop, thisValue) { + var args = slice(this.args); + var yieldArg = filter(args, function(arg) { + return arg && typeof arg[prop] === "function"; + })[0]; + var yieldFn = yieldArg && yieldArg[prop]; + + if (!yieldFn) { + throwYieldError( + this.proxy, + " cannot yield to '" + valueToString(prop) + "' since no callback was passed.", + args + ); + } + + return yieldFn.apply(thisValue, slice(arguments, 2)); + }, + + toString: function() { + var callStr = this.proxy ? String(this.proxy) + "(" : ""; + var formattedArgs; + + if (!this.args) { + return ":("; + } + + formattedArgs = map(this.args, function(arg) { + return sinonFormat(arg); + }); + + callStr = callStr + join(formattedArgs, ", ") + ")"; + + if (typeof this.returnValue !== "undefined") { + callStr += " => " + sinonFormat(this.returnValue); + } + + if (this.exception) { + callStr += " !" + this.exception.name; + + if (this.exception.message) { + callStr += "(" + this.exception.message + ")"; + } + } + if (this.stack) { + // Omit the error message and the two top stack frames in sinon itself: + callStr += (this.stack.split("\n")[3] || "unknown").replace(/^\s*(?:at\s+|@)?/, " at "); + } + + return callStr; + }, + + ensureArgIsAFunction: function(pos) { + if (typeof this.args[pos] !== "function") { + throw new TypeError( + "Expected argument at position " + pos + " to be a Function, but was " + typeof this.args[pos] + ); + } + } +}; +Object.defineProperty(callProto, "stack", { + enumerable: true, + configurable: true, + get: function() { + return (this.errorWithCallStack && this.errorWithCallStack.stack) || ""; + } +}); + +callProto.invokeCallback = callProto.yield; + +function createProxyCall(proxy, thisValue, args, returnValue, exception, id, errorWithCallStack) { + if (typeof id !== "number") { + throw new TypeError("Call id is not a number"); + } + + var firstArg, lastArg; + + if (args.length > 0) { + firstArg = args[0]; + lastArg = args[args.length - 1]; + } + + var proxyCall = Object.create(callProto); + var callback = lastArg && typeof lastArg === "function" ? lastArg : undefined; + + proxyCall.proxy = proxy; + proxyCall.thisValue = thisValue; + proxyCall.args = args; + proxyCall.firstArg = firstArg; + proxyCall.lastArg = lastArg; + proxyCall.callback = callback; + proxyCall.returnValue = returnValue; + proxyCall.exception = exception; + proxyCall.callId = id; + proxyCall.errorWithCallStack = errorWithCallStack; + + return proxyCall; +} +createProxyCall.toString = callProto.toString; // used by mocks + +module.exports = createProxyCall; + +},{"./util/core/format":24,"@sinonjs/commons":44,"@sinonjs/samsam":82}],13:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var proxyCallUtil = require("./proxy-call-util"); + +var push = arrayProto.push; +var forEach = arrayProto.forEach; +var concat = arrayProto.concat; +var ErrorConstructor = Error.prototype.constructor; +var bind = Function.prototype.bind; + +var callId = 0; + +module.exports = function invoke(func, thisValue, args) { + var matchings = this.matchingFakes(args); + var currentCallId = callId++; + var exception, returnValue; + + proxyCallUtil.incrementCallCount(this); + push(this.thisValues, thisValue); + push(this.args, args); + push(this.callIds, currentCallId); + forEach(matchings, function(matching) { + proxyCallUtil.incrementCallCount(matching); + push(matching.thisValues, thisValue); + push(matching.args, args); + push(matching.callIds, currentCallId); + }); + + // Make call properties available from within the spied function: + proxyCallUtil.createCallProperties(this); + forEach(matchings, proxyCallUtil.createCallProperties); + + try { + this.invoking = true; + + var thisCall = this.getCall(this.callCount - 1); + + if (thisCall.calledWithNew()) { + // Call through with `new` + returnValue = new (bind.apply(this.func || func, concat([thisValue], args)))(); + + if (typeof returnValue !== "object") { + returnValue = thisValue; + } + } else { + returnValue = (this.func || func).apply(thisValue, args); + } + } catch (e) { + exception = e; + } finally { + delete this.invoking; + } + + push(this.exceptions, exception); + push(this.returnValues, returnValue); + forEach(matchings, function(matching) { + push(matching.exceptions, exception); + push(matching.returnValues, returnValue); + }); + + var err = new ErrorConstructor(); + // 1. Please do not get stack at this point. It may be so very slow, and not actually used + // 2. PhantomJS does not serialize the stack trace until the error has been thrown: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack + try { + throw err; + } catch (e) { + /* empty */ + } + push(this.errorsWithCallStack, err); + forEach(matchings, function(matching) { + push(matching.errorsWithCallStack, err); + }); + + // Make return value and exception available in the calls: + proxyCallUtil.createCallProperties(this); + forEach(matchings, proxyCallUtil.createCallProperties); + + if (exception !== undefined) { + throw exception; + } + + return returnValue; +}; + +},{"./proxy-call-util":11,"@sinonjs/commons":44}],14:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var extend = require("./util/core/extend"); +var functionToString = require("./util/core/function-to-string"); +var proxyCall = require("./proxy-call"); +var proxyCallUtil = require("./proxy-call-util"); +var proxyInvoke = require("./proxy-invoke"); +var sinonFormat = require("./util/core/format"); + +var push = arrayProto.push; +var forEach = arrayProto.forEach; +var slice = arrayProto.slice; + +var emptyFakes = Object.freeze([]); + +// Public API +var proxyApi = { + toString: functionToString, + + named: function named(name) { + this.displayName = name; + var nameDescriptor = Object.getOwnPropertyDescriptor(this, "name"); + if (nameDescriptor && nameDescriptor.configurable) { + // IE 11 functions don't have a name. + // Safari 9 has names that are not configurable. + nameDescriptor.value = name; + Object.defineProperty(this, "name", nameDescriptor); + } + return this; + }, + + invoke: proxyInvoke, + + /* + * Hook for derived implementation to return fake instances matching the + * given arguments. + */ + matchingFakes: function(/*args, strict*/) { + return emptyFakes; + }, + + getCall: function getCall(index) { + var i = index; + if (i < 0) { + // Negative indices means counting backwards from the last call + i += this.callCount; + } + if (i < 0 || i >= this.callCount) { + return null; + } + + return proxyCall( + this, + this.thisValues[i], + this.args[i], + this.returnValues[i], + this.exceptions[i], + this.callIds[i], + this.errorsWithCallStack[i] + ); + }, + + getCalls: function() { + var calls = []; + var i; + + for (i = 0; i < this.callCount; i++) { + push(calls, this.getCall(i)); + } + + return calls; + }, + + calledBefore: function calledBefore(proxy) { + if (!this.called) { + return false; + } + + if (!proxy.called) { + return true; + } + + return this.callIds[0] < proxy.callIds[proxy.callIds.length - 1]; + }, + + calledAfter: function calledAfter(proxy) { + if (!this.called || !proxy.called) { + return false; + } + + return this.callIds[this.callCount - 1] > proxy.callIds[0]; + }, + + calledImmediatelyBefore: function calledImmediatelyBefore(proxy) { + if (!this.called || !proxy.called) { + return false; + } + + return this.callIds[this.callCount - 1] === proxy.callIds[proxy.callCount - 1] - 1; + }, + + calledImmediatelyAfter: function calledImmediatelyAfter(proxy) { + if (!this.called || !proxy.called) { + return false; + } + + return this.callIds[this.callCount - 1] === proxy.callIds[proxy.callCount - 1] + 1; + }, + + formatters: require("./spy-formatters"), + printf: function(format) { + var spyInstance = this; + var args = slice(arguments, 1); + var formatter; + + return (format || "").replace(/%(.)/g, function(match, specifyer) { + formatter = proxyApi.formatters[specifyer]; + + if (typeof formatter === "function") { + return String(formatter(spyInstance, args)); + } else if (!isNaN(parseInt(specifyer, 10))) { + return sinonFormat(args[specifyer - 1]); + } + + return "%" + specifyer; + }); + }, + + resetHistory: function() { + if (this.invoking) { + var err = new Error( + "Cannot reset Sinon function while invoking it. " + + "Move the call to .resetHistory outside of the callback." + ); + err.name = "InvalidResetException"; + throw err; + } + + this.called = false; + this.notCalled = true; + this.calledOnce = false; + this.calledTwice = false; + this.calledThrice = false; + this.callCount = 0; + this.firstCall = null; + this.secondCall = null; + this.thirdCall = null; + this.lastCall = null; + this.args = []; + this.firstArg = null; + this.lastArg = null; + this.returnValues = []; + this.thisValues = []; + this.exceptions = []; + this.callIds = []; + this.errorsWithCallStack = []; + + if (this.fakes) { + forEach(this.fakes, function(fake) { + fake.resetHistory(); + }); + } + + return this; + } +}; + +var delegateToCalls = proxyCallUtil.delegateToCalls; +delegateToCalls(proxyApi, "calledOn", true); +delegateToCalls(proxyApi, "alwaysCalledOn", false, "calledOn"); +delegateToCalls(proxyApi, "calledWith", true); +delegateToCalls(proxyApi, "calledOnceWith", true, "calledWith", false, undefined, 1); +delegateToCalls(proxyApi, "calledWithMatch", true); +delegateToCalls(proxyApi, "alwaysCalledWith", false, "calledWith"); +delegateToCalls(proxyApi, "alwaysCalledWithMatch", false, "calledWithMatch"); +delegateToCalls(proxyApi, "calledWithExactly", true); +delegateToCalls(proxyApi, "calledOnceWithExactly", true, "calledWithExactly", false, undefined, 1); +delegateToCalls(proxyApi, "calledOnceWithMatch", true, "calledWithMatch", false, undefined, 1); +delegateToCalls(proxyApi, "alwaysCalledWithExactly", false, "calledWithExactly"); +delegateToCalls(proxyApi, "neverCalledWith", false, "notCalledWith", false, function() { + return true; +}); +delegateToCalls(proxyApi, "neverCalledWithMatch", false, "notCalledWithMatch", false, function() { + return true; +}); +delegateToCalls(proxyApi, "threw", true); +delegateToCalls(proxyApi, "alwaysThrew", false, "threw"); +delegateToCalls(proxyApi, "returned", true); +delegateToCalls(proxyApi, "alwaysReturned", false, "returned"); +delegateToCalls(proxyApi, "calledWithNew", true); +delegateToCalls(proxyApi, "alwaysCalledWithNew", false, "calledWithNew"); + +function createProxy(func, originalFunc) { + var proxy = wrapFunction(func, originalFunc); + + // Inherit function properties: + extend(proxy, func); + + proxy.prototype = func.prototype; + + extend.nonEnum(proxy, proxyApi); + + return proxy; +} + +function wrapFunction(func, originalFunc) { + var arity = originalFunc.length; + var p; + // Do not change this to use an eval. Projects that depend on sinon block the use of eval. + // ref: https://github.com/sinonjs/sinon/issues/710 + switch (arity) { + /*eslint-disable no-unused-vars, max-len*/ + case 0: + p = function proxy() { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 1: + p = function proxy(a) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 2: + p = function proxy(a, b) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 3: + p = function proxy(a, b, c) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 4: + p = function proxy(a, b, c, d) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 5: + p = function proxy(a, b, c, d, e) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 6: + p = function proxy(a, b, c, d, e, f) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 7: + p = function proxy(a, b, c, d, e, f, g) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 8: + p = function proxy(a, b, c, d, e, f, g, h) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 9: + p = function proxy(a, b, c, d, e, f, g, h, i) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 10: + p = function proxy(a, b, c, d, e, f, g, h, i, j) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 11: + p = function proxy(a, b, c, d, e, f, g, h, i, j, k) { + return p.invoke(func, this, slice(arguments)); + }; + break; + case 12: + p = function proxy(a, b, c, d, e, f, g, h, i, j, k, l) { + return p.invoke(func, this, slice(arguments)); + }; + break; + default: + p = function proxy() { + return p.invoke(func, this, slice(arguments)); + }; + break; + /*eslint-enable*/ + } + var nameDescriptor = Object.getOwnPropertyDescriptor(originalFunc, "name"); + if (nameDescriptor && nameDescriptor.configurable) { + // IE 11 functions don't have a name. + // Safari 9 has names that are not configurable. + Object.defineProperty(p, "name", nameDescriptor); + } + extend.nonEnum(p, { + isSinonProxy: true, + + called: false, + notCalled: true, + calledOnce: false, + calledTwice: false, + calledThrice: false, + callCount: 0, + firstCall: null, + firstArg: null, + secondCall: null, + thirdCall: null, + lastCall: null, + lastArg: null, + args: [], + returnValues: [], + thisValues: [], + exceptions: [], + callIds: [], + errorsWithCallStack: [] + }); + return p; +} + +module.exports = createProxy; + +},{"./proxy-call":12,"./proxy-call-util":11,"./proxy-invoke":13,"./spy-formatters":17,"./util/core/extend":23,"./util/core/format":24,"./util/core/function-to-string":25,"@sinonjs/commons":44}],15:[function(require,module,exports){ +"use strict"; + +var walkObject = require("./util/core/walk-object"); + +function filter(object, property) { + return object[property].restore && object[property].restore.sinon; +} + +function restore(object, property) { + object[property].restore(); +} + +function restoreObject(object) { + return walkObject(restore, object, filter); +} + +module.exports = restoreObject; + +},{"./util/core/walk-object":34}],16:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var collectOwnMethods = require("./collect-own-methods"); +var getPropertyDescriptor = require("./util/core/get-property-descriptor"); +var isPropertyConfigurable = require("./util/core/is-property-configurable"); +var match = require("@sinonjs/samsam").createMatcher; +var sinonAssert = require("./assert"); +var sinonClock = require("./util/fake-timers"); +var sinonMock = require("./mock"); +var sinonSpy = require("./spy"); +var sinonStub = require("./stub"); +var sinonFake = require("./fake"); +var valueToString = require("@sinonjs/commons").valueToString; +var fakeServer = require("nise").fakeServer; +var fakeXhr = require("nise").fakeXhr; +var usePromiseLibrary = require("./util/core/use-promise-library"); + +var filter = arrayProto.filter; +var forEach = arrayProto.forEach; +var push = arrayProto.push; +var reverse = arrayProto.reverse; + +function applyOnEach(fakes, method) { + var matchingFakes = filter(fakes, function(fake) { + return typeof fake[method] === "function"; + }); + + forEach(matchingFakes, function(fake) { + fake[method](); + }); +} + +function Sandbox() { + var sandbox = this; + var collection = []; + var fakeRestorers = []; + var promiseLib; + + sandbox.assert = sinonAssert.createAssertObject(); + + sandbox.serverPrototype = fakeServer; + + // this is for testing only + sandbox.getFakes = function getFakes() { + return collection; + }; + + // this is for testing only + sandbox.getRestorers = function() { + return fakeRestorers; + }; + + sandbox.createStubInstance = function createStubInstance() { + var stubbed = sinonStub.createStubInstance.apply(null, arguments); + + var ownMethods = collectOwnMethods(stubbed); + + forEach(ownMethods, function(method) { + push(collection, method); + }); + + usePromiseLibrary(promiseLib, ownMethods); + + return stubbed; + }; + + sandbox.inject = function inject(obj) { + obj.spy = function() { + return sandbox.spy.apply(null, arguments); + }; + + obj.stub = function() { + return sandbox.stub.apply(null, arguments); + }; + + obj.mock = function() { + return sandbox.mock.apply(null, arguments); + }; + + obj.createStubInstance = function() { + return sandbox.createStubInstance.apply(sandbox, arguments); + }; + + obj.fake = function() { + return sandbox.fake.apply(null, arguments); + }; + + obj.replace = function() { + return sandbox.replace.apply(null, arguments); + }; + + obj.replaceSetter = function() { + return sandbox.replaceSetter.apply(null, arguments); + }; + + obj.replaceGetter = function() { + return sandbox.replaceGetter.apply(null, arguments); + }; + + if (sandbox.clock) { + obj.clock = sandbox.clock; + } + + if (sandbox.server) { + obj.server = sandbox.server; + obj.requests = sandbox.server.requests; + } + + obj.match = match; + + return obj; + }; + + sandbox.mock = function mock() { + var m = sinonMock.apply(null, arguments); + + push(collection, m); + usePromiseLibrary(promiseLib, m); + + return m; + }; + + sandbox.reset = function reset() { + applyOnEach(collection, "reset"); + applyOnEach(collection, "resetHistory"); + }; + + sandbox.resetBehavior = function resetBehavior() { + applyOnEach(collection, "resetBehavior"); + }; + + sandbox.resetHistory = function resetHistory() { + function privateResetHistory(f) { + var method = f.resetHistory || f.reset; + if (method) { + method.call(f); + } + } + + forEach(collection, function(fake) { + if (typeof fake === "function") { + privateResetHistory(fake); + return; + } + + var methods = []; + if (fake.get) { + push(methods, fake.get); + } + + if (fake.set) { + push(methods, fake.set); + } + + forEach(methods, privateResetHistory); + }); + }; + + sandbox.restore = function restore() { + if (arguments.length) { + throw new Error("sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()"); + } + + reverse(collection); + applyOnEach(collection, "restore"); + collection = []; + + forEach(fakeRestorers, function(restorer) { + restorer(); + }); + fakeRestorers = []; + + sandbox.restoreContext(); + }; + + sandbox.restoreContext = function restoreContext() { + var injectedKeys = sandbox.injectedKeys; + var injectInto = sandbox.injectInto; + + if (!injectedKeys) { + return; + } + + forEach(injectedKeys, function(injectedKey) { + delete injectInto[injectedKey]; + }); + + injectedKeys = []; + }; + + function getFakeRestorer(object, property) { + var descriptor = getPropertyDescriptor(object, property); + + function restorer() { + if (descriptor.isOwn) { + Object.defineProperty(object, property, descriptor); + } else { + delete object[property]; + } + } + restorer.object = object; + restorer.property = property; + return restorer; + } + + function verifyNotReplaced(object, property) { + forEach(fakeRestorers, function(fakeRestorer) { + if (fakeRestorer.object === object && fakeRestorer.property === property) { + throw new TypeError("Attempted to replace " + property + " which is already replaced"); + } + }); + } + + sandbox.replace = function replace(object, property, replacement) { + var descriptor = getPropertyDescriptor(object, property); + + if (typeof descriptor === "undefined") { + throw new TypeError("Cannot replace non-existent property " + valueToString(property)); + } + + if (typeof replacement === "undefined") { + throw new TypeError("Expected replacement argument to be defined"); + } + + if (typeof descriptor.get === "function") { + throw new Error("Use sandbox.replaceGetter for replacing getters"); + } + + if (typeof descriptor.set === "function") { + throw new Error("Use sandbox.replaceSetter for replacing setters"); + } + + if (typeof object[property] !== typeof replacement) { + throw new TypeError("Cannot replace " + typeof object[property] + " with " + typeof replacement); + } + + verifyNotReplaced(object, property); + + // store a function for restoring the replaced property + push(fakeRestorers, getFakeRestorer(object, property)); + + object[property] = replacement; + + return replacement; + }; + + sandbox.replaceGetter = function replaceGetter(object, property, replacement) { + var descriptor = getPropertyDescriptor(object, property); + + if (typeof descriptor === "undefined") { + throw new TypeError("Cannot replace non-existent property " + valueToString(property)); + } + + if (typeof replacement !== "function") { + throw new TypeError("Expected replacement argument to be a function"); + } + + if (typeof descriptor.get !== "function") { + throw new Error("`object.property` is not a getter"); + } + + verifyNotReplaced(object, property); + + // store a function for restoring the replaced property + push(fakeRestorers, getFakeRestorer(object, property)); + + Object.defineProperty(object, property, { + get: replacement, + configurable: isPropertyConfigurable(object, property) + }); + + return replacement; + }; + + sandbox.replaceSetter = function replaceSetter(object, property, replacement) { + var descriptor = getPropertyDescriptor(object, property); + + if (typeof descriptor === "undefined") { + throw new TypeError("Cannot replace non-existent property " + valueToString(property)); + } + + if (typeof replacement !== "function") { + throw new TypeError("Expected replacement argument to be a function"); + } + + if (typeof descriptor.set !== "function") { + throw new Error("`object.property` is not a setter"); + } + + verifyNotReplaced(object, property); + + // store a function for restoring the replaced property + push(fakeRestorers, getFakeRestorer(object, property)); + + // eslint-disable-next-line accessor-pairs + Object.defineProperty(object, property, { + set: replacement, + configurable: isPropertyConfigurable(object, property) + }); + + return replacement; + }; + + function commonPostInitSetup(args, spy) { + var object = args[0]; + var property = args[1]; + + var isSpyingOnEntireObject = typeof property === "undefined" && typeof object === "object"; + + if (isSpyingOnEntireObject) { + var ownMethods = collectOwnMethods(spy); + + forEach(ownMethods, function(method) { + push(collection, method); + }); + + usePromiseLibrary(promiseLib, ownMethods); + } else { + push(collection, spy); + usePromiseLibrary(promiseLib, spy); + } + + return spy; + } + + sandbox.spy = function spy() { + var createdSpy = sinonSpy.apply(sinonSpy, arguments); + return commonPostInitSetup(arguments, createdSpy); + }; + + sandbox.stub = function stub() { + var createdStub = sinonStub.apply(sinonStub, arguments); + return commonPostInitSetup(arguments, createdStub); + }; + + // eslint-disable-next-line no-unused-vars + sandbox.fake = function fake(f) { + var s = sinonFake.apply(sinonFake, arguments); + + push(collection, s); + + return s; + }; + + forEach(Object.keys(sinonFake), function(key) { + var fakeBehavior = sinonFake[key]; + if (typeof fakeBehavior === "function") { + sandbox.fake[key] = function() { + var s = fakeBehavior.apply(fakeBehavior, arguments); + + push(collection, s); + + return s; + }; + } + }); + + sandbox.useFakeTimers = function useFakeTimers(args) { + var clock = sinonClock.useFakeTimers.call(null, args); + + sandbox.clock = clock; + push(collection, clock); + + return clock; + }; + + sandbox.verify = function verify() { + applyOnEach(collection, "verify"); + }; + + sandbox.verifyAndRestore = function verifyAndRestore() { + var exception; + + try { + sandbox.verify(); + } catch (e) { + exception = e; + } + + sandbox.restore(); + + if (exception) { + throw exception; + } + }; + + sandbox.useFakeServer = function useFakeServer() { + var proto = sandbox.serverPrototype || fakeServer; + + if (!proto || !proto.create) { + return null; + } + + sandbox.server = proto.create(); + push(collection, sandbox.server); + + return sandbox.server; + }; + + sandbox.useFakeXMLHttpRequest = function useFakeXMLHttpRequest() { + var xhr = fakeXhr.useFakeXMLHttpRequest(); + push(collection, xhr); + return xhr; + }; + + sandbox.usingPromise = function usingPromise(promiseLibrary) { + promiseLib = promiseLibrary; + collection.promiseLibrary = promiseLibrary; + + return sandbox; + }; +} + +Sandbox.prototype.match = match; + +module.exports = Sandbox; + +},{"./assert":2,"./collect-own-methods":4,"./fake":8,"./mock":10,"./spy":18,"./stub":19,"./util/core/get-property-descriptor":27,"./util/core/is-property-configurable":30,"./util/core/use-promise-library":33,"./util/fake-timers":37,"@sinonjs/commons":44,"@sinonjs/samsam":82,"nise":101}],17:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var color = require("./color"); +var match = require("@sinonjs/samsam").createMatcher; +var timesInWords = require("./util/core/times-in-words"); +var sinonFormat = require("./util/core/format"); +var jsDiff = require("diff"); + +var join = arrayProto.join; +var map = arrayProto.map; +var push = arrayProto.push; +var slice = arrayProto.slice; + +function colorSinonMatchText(matcher, calledArg, calledArgMessage) { + var calledArgumentMessage = calledArgMessage; + if (!matcher.test(calledArg)) { + matcher.message = color.red(matcher.message); + if (calledArgumentMessage) { + calledArgumentMessage = color.green(calledArgumentMessage); + } + } + return calledArgumentMessage + " " + matcher.message; +} + +function colorDiffText(diff) { + var objects = map(diff, function(part) { + var text = part.value; + if (part.added) { + text = color.green(text); + } else if (part.removed) { + text = color.red(text); + } + if (diff.length === 2) { + text += " "; // format simple diffs + } + return text; + }); + return join(objects, ""); +} + +function quoteStringValue(value) { + if (typeof value === "string") { + return JSON.stringify(value); + } + return value; +} + +module.exports = { + c: function(spyInstance) { + return timesInWords(spyInstance.callCount); + }, + + n: function(spyInstance) { + // eslint-disable-next-line @sinonjs/no-prototype-methods/no-prototype-methods + return spyInstance.toString(); + }, + + D: function(spyInstance, args) { + var message = ""; + + for (var i = 0, l = spyInstance.callCount; i < l; ++i) { + // describe multiple calls + if (l > 1) { + message += "\nCall " + (i + 1) + ":"; + } + var calledArgs = spyInstance.getCall(i).args; + var expectedArgs = slice(args); + + for (var j = 0; j < calledArgs.length || j < expectedArgs.length; ++j) { + if (calledArgs[j]) { + calledArgs[j] = quoteStringValue(calledArgs[j]); + } + + if (expectedArgs[j]) { + expectedArgs[j] = quoteStringValue(expectedArgs[j]); + } + + message += "\n"; + + var calledArgMessage = j < calledArgs.length ? sinonFormat(calledArgs[j]) : ""; + if (match.isMatcher(expectedArgs[j])) { + message += colorSinonMatchText(expectedArgs[j], calledArgs[j], calledArgMessage); + } else { + var expectedArgMessage = j < expectedArgs.length ? sinonFormat(expectedArgs[j]) : ""; + var diff = jsDiff.diffJson(calledArgMessage, expectedArgMessage); + message += colorDiffText(diff); + } + } + } + + return message; + }, + + C: function(spyInstance) { + var calls = []; + + for (var i = 0, l = spyInstance.callCount; i < l; ++i) { + // eslint-disable-next-line @sinonjs/no-prototype-methods/no-prototype-methods + var stringifiedCall = " " + spyInstance.getCall(i).toString(); + if (/\n/.test(calls[i - 1])) { + stringifiedCall = "\n" + stringifiedCall; + } + push(calls, stringifiedCall); + } + + return calls.length > 0 ? "\n" + join(calls, "\n") : ""; + }, + + t: function(spyInstance) { + var objects = []; + + for (var i = 0, l = spyInstance.callCount; i < l; ++i) { + push(objects, sinonFormat(spyInstance.thisValues[i])); + } + + return join(objects, ", "); + }, + + "*": function(spyInstance, args) { + return join( + map(args, function(arg) { + return sinonFormat(arg); + }), + ", " + ); + } +}; + +},{"./color":5,"./util/core/format":24,"./util/core/times-in-words":32,"@sinonjs/commons":44,"@sinonjs/samsam":82,"diff":86}],18:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var createProxy = require("./proxy"); +var extend = require("./util/core/extend"); +var functionName = require("@sinonjs/commons").functionName; +var getPropertyDescriptor = require("./util/core/get-property-descriptor"); +var deepEqual = require("@sinonjs/samsam").deepEqual; +var isEsModule = require("./util/core/is-es-module"); +var proxyCallUtil = require("./proxy-call-util"); +var walkObject = require("./util/core/walk-object"); +var wrapMethod = require("./util/core/wrap-method"); +var valueToString = require("@sinonjs/commons").valueToString; + +/* cache references to library methods so that they also can be stubbed without problems */ +var forEach = arrayProto.forEach; +var pop = arrayProto.pop; +var push = arrayProto.push; +var slice = arrayProto.slice; +var filter = Array.prototype.filter; + +var uuid = 0; + +function matches(fake, args, strict) { + var margs = fake.matchingArguments; + if (margs.length <= args.length && deepEqual(slice(args, 0, margs.length), margs)) { + return !strict || margs.length === args.length; + } + return false; +} + +// Public API +var spyApi = { + withArgs: function() { + var args = slice(arguments); + var matching = pop(this.matchingFakes(args, true)); + if (matching) { + return matching; + } + + var original = this; + var fake = this.instantiateFake(); + fake.matchingArguments = args; + fake.parent = this; + push(this.fakes, fake); + + fake.withArgs = function() { + return original.withArgs.apply(original, arguments); + }; + + forEach(original.args, function(arg, i) { + if (!matches(fake, arg)) { + return; + } + + proxyCallUtil.incrementCallCount(fake); + push(fake.thisValues, original.thisValues[i]); + push(fake.args, arg); + push(fake.returnValues, original.returnValues[i]); + push(fake.exceptions, original.exceptions[i]); + push(fake.callIds, original.callIds[i]); + }); + + proxyCallUtil.createCallProperties(fake); + + return fake; + }, + + // Override proxy default implementation + matchingFakes: function(args, strict) { + return filter.call(this.fakes, function(fake) { + return matches(fake, args, strict); + }); + } +}; + +/* eslint-disable @sinonjs/no-prototype-methods/no-prototype-methods */ +var delegateToCalls = proxyCallUtil.delegateToCalls; +delegateToCalls(spyApi, "callArg", false, "callArgWith", true, function() { + throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); +}); +spyApi.callArgWith = spyApi.callArg; +delegateToCalls(spyApi, "callArgOn", false, "callArgOnWith", true, function() { + throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); +}); +spyApi.callArgOnWith = spyApi.callArgOn; +delegateToCalls(spyApi, "throwArg", false, "throwArg", false, function() { + throw new Error(this.toString() + " cannot throw arg since it was not yet invoked."); +}); +delegateToCalls(spyApi, "yield", false, "yield", true, function() { + throw new Error(this.toString() + " cannot yield since it was not yet invoked."); +}); +// "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode. +spyApi.invokeCallback = spyApi.yield; +delegateToCalls(spyApi, "yieldOn", false, "yieldOn", true, function() { + throw new Error(this.toString() + " cannot yield since it was not yet invoked."); +}); +delegateToCalls(spyApi, "yieldTo", false, "yieldTo", true, function(property) { + throw new Error( + this.toString() + " cannot yield to '" + valueToString(property) + "' since it was not yet invoked." + ); +}); +delegateToCalls(spyApi, "yieldToOn", false, "yieldToOn", true, function(property) { + throw new Error( + this.toString() + " cannot yield to '" + valueToString(property) + "' since it was not yet invoked." + ); +}); + +function createSpy(func) { + var name; + var funk = func; + + if (typeof funk !== "function") { + funk = function() { + return; + }; + } else { + name = functionName(funk); + } + + var proxy = createProxy(funk, funk); + + // Inherit spy API: + extend.nonEnum(proxy, spyApi); + extend.nonEnum(proxy, { + displayName: name || "spy", + fakes: [], + instantiateFake: createSpy, + id: "spy#" + uuid++ + }); + return proxy; +} + +function spy(object, property, types) { + var descriptor, methodDesc; + + if (isEsModule(object)) { + throw new TypeError("ES Modules cannot be spied"); + } + + if (!property && typeof object === "function") { + return createSpy(object); + } + + if (!property && typeof object === "object") { + return walkObject(spy, object); + } + + if (!object && !property) { + return createSpy(function() { + return; + }); + } + + if (!types) { + return wrapMethod(object, property, createSpy(object[property])); + } + + descriptor = {}; + methodDesc = getPropertyDescriptor(object, property); + + forEach(types, function(type) { + descriptor[type] = createSpy(methodDesc[type]); + }); + + return wrapMethod(object, property, descriptor); +} + +extend(spy, spyApi); +module.exports = spy; + +},{"./proxy":14,"./proxy-call-util":11,"./util/core/extend":23,"./util/core/get-property-descriptor":27,"./util/core/is-es-module":28,"./util/core/walk-object":34,"./util/core/wrap-method":36,"@sinonjs/commons":44,"@sinonjs/samsam":82}],19:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var behavior = require("./behavior"); +var behaviors = require("./default-behaviors"); +var createProxy = require("./proxy"); +var functionName = require("@sinonjs/commons").functionName; +var hasOwnProperty = require("@sinonjs/commons").prototypes.object.hasOwnProperty; +var isNonExistentProperty = require("./util/core/is-non-existent-property"); +var spy = require("./spy"); +var extend = require("./util/core/extend"); +var getPropertyDescriptor = require("./util/core/get-property-descriptor"); +var isEsModule = require("./util/core/is-es-module"); +var wrapMethod = require("./util/core/wrap-method"); +var throwOnFalsyObject = require("./throw-on-falsy-object"); +var valueToString = require("@sinonjs/commons").valueToString; +var walkObject = require("./util/core/walk-object"); + +var forEach = arrayProto.forEach; +var pop = arrayProto.pop; +var slice = arrayProto.slice; +var sort = arrayProto.sort; + +var uuid = 0; + +function createStub(originalFunc) { + var proxy; + + function functionStub() { + var args = slice(arguments); + var matchings = proxy.matchingFakes(args); + + var fnStub = + pop( + sort(matchings, function(a, b) { + return a.matchingArguments.length - b.matchingArguments.length; + }) + ) || proxy; + return getCurrentBehavior(fnStub).invoke(this, arguments); + } + + proxy = createProxy(functionStub, originalFunc || functionStub); + // Inherit spy API: + extend.nonEnum(proxy, spy); + // Inherit stub API: + extend.nonEnum(proxy, stub); + + var name = originalFunc ? functionName(originalFunc) : null; + extend.nonEnum(proxy, { + fakes: [], + instantiateFake: createStub, + displayName: name || "stub", + defaultBehavior: null, + behaviors: [], + id: "stub#" + uuid++ + }); + + return proxy; +} + +function stub(object, property) { + if (arguments.length > 2) { + throw new TypeError("stub(obj, 'meth', fn) has been removed, see documentation"); + } + + if (isEsModule(object)) { + throw new TypeError("ES Modules cannot be stubbed"); + } + + throwOnFalsyObject.apply(null, arguments); + + if (isNonExistentProperty(object, property)) { + throw new TypeError("Cannot stub non-existent property " + valueToString(property)); + } + + var actualDescriptor = getPropertyDescriptor(object, property); + var isObjectOrFunction = typeof object === "object" || typeof object === "function"; + var isStubbingEntireObject = typeof property === "undefined" && isObjectOrFunction; + var isCreatingNewStub = !object && typeof property === "undefined"; + var isStubbingNonFuncProperty = + isObjectOrFunction && + typeof property !== "undefined" && + (typeof actualDescriptor === "undefined" || typeof actualDescriptor.value !== "function"); + + if (isStubbingEntireObject) { + return walkObject(stub, object); + } + + if (isCreatingNewStub) { + return createStub(); + } + + var func = typeof actualDescriptor.value === "function" ? actualDescriptor.value : null; + var s = createStub(func); + + extend.nonEnum(s, { + rootObj: object, + propName: property, + shadowsPropOnPrototype: !actualDescriptor.isOwn, + restore: function restore() { + if (actualDescriptor !== undefined && actualDescriptor.isOwn) { + Object.defineProperty(object, property, actualDescriptor); + return; + } + + delete object[property]; + } + }); + + return isStubbingNonFuncProperty ? s : wrapMethod(object, property, s); +} + +stub.createStubInstance = function(constructor, overrides) { + if (typeof constructor !== "function") { + throw new TypeError("The constructor should be a function."); + } + + var stubbedObject = stub(Object.create(constructor.prototype)); + + forEach(Object.keys(overrides || {}), function(propertyName) { + if (propertyName in stubbedObject) { + var value = overrides[propertyName]; + if (value && value.createStubInstance) { + stubbedObject[propertyName] = value; + } else { + stubbedObject[propertyName].returns(value); + } + } else { + throw new Error("Cannot stub " + propertyName + ". Property does not exist!"); + } + }); + return stubbedObject; +}; + +/*eslint-disable no-use-before-define*/ +function getParentBehaviour(stubInstance) { + return stubInstance.parent && getCurrentBehavior(stubInstance.parent); +} + +function getDefaultBehavior(stubInstance) { + return stubInstance.defaultBehavior || getParentBehaviour(stubInstance) || behavior.create(stubInstance); +} + +function getCurrentBehavior(stubInstance) { + var currentBehavior = stubInstance.behaviors[stubInstance.callCount - 1]; + return currentBehavior && currentBehavior.isPresent() ? currentBehavior : getDefaultBehavior(stubInstance); +} +/*eslint-enable no-use-before-define*/ + +var proto = { + resetBehavior: function() { + this.defaultBehavior = null; + this.behaviors = []; + + delete this.returnValue; + delete this.returnArgAt; + delete this.throwArgAt; + delete this.resolveArgAt; + delete this.fakeFn; + this.returnThis = false; + this.resolveThis = false; + + forEach(this.fakes, function(fake) { + fake.resetBehavior(); + }); + }, + + reset: function() { + this.resetHistory(); + this.resetBehavior(); + }, + + onCall: function onCall(index) { + if (!this.behaviors[index]) { + this.behaviors[index] = behavior.create(this); + } + + return this.behaviors[index]; + }, + + onFirstCall: function onFirstCall() { + return this.onCall(0); + }, + + onSecondCall: function onSecondCall() { + return this.onCall(1); + }, + + onThirdCall: function onThirdCall() { + return this.onCall(2); + }, + + withArgs: function withArgs() { + var fake = spy.withArgs.apply(this, arguments); + if (this.defaultBehavior && this.defaultBehavior.promiseLibrary) { + fake.defaultBehavior = fake.defaultBehavior || behavior.create(fake); + fake.defaultBehavior.promiseLibrary = this.defaultBehavior.promiseLibrary; + } + return fake; + } +}; + +forEach(Object.keys(behavior), function(method) { + if ( + hasOwnProperty(behavior, method) && + !hasOwnProperty(proto, method) && + method !== "create" && + method !== "invoke" + ) { + proto[method] = behavior.createBehavior(method); + } +}); + +forEach(Object.keys(behaviors), function(method) { + if (hasOwnProperty(behaviors, method) && !hasOwnProperty(proto, method)) { + behavior.addBehavior(stub, method, behaviors[method]); + } +}); + +extend(stub, proto); +module.exports = stub; + +},{"./behavior":3,"./default-behaviors":7,"./proxy":14,"./spy":18,"./throw-on-falsy-object":20,"./util/core/extend":23,"./util/core/get-property-descriptor":27,"./util/core/is-es-module":28,"./util/core/is-non-existent-property":29,"./util/core/walk-object":34,"./util/core/wrap-method":36,"@sinonjs/commons":44}],20:[function(require,module,exports){ +"use strict"; +var valueToString = require("@sinonjs/commons").valueToString; + +function throwOnFalsyObject(object, property) { + if (property && !object) { + var type = object === null ? "null" : "undefined"; + throw new Error("Trying to stub property '" + valueToString(property) + "' of " + type); + } +} + +module.exports = throwOnFalsyObject; + +},{"@sinonjs/commons":44}],21:[function(require,module,exports){ +"use strict"; + +module.exports = { + injectInto: null, + properties: [ + "spy", + "stub", + "mock", + "clock", + "server", + "requests", + "fake", + "replace", + "replaceSetter", + "replaceGetter", + "createStubInstance" + ], + useFakeTimers: true, + useFakeServer: true +}; + +},{}],22:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var reduce = arrayProto.reduce; + +module.exports = function exportAsyncBehaviors(behaviorMethods) { + return reduce( + Object.keys(behaviorMethods), + function(acc, method) { + // need to avoid creating another async versions of the newly added async methods + if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) { + acc[method + "Async"] = function() { + var result = behaviorMethods[method].apply(this, arguments); + this.callbackAsync = true; + return result; + }; + } + return acc; + }, + {} + ); +}; + +},{"@sinonjs/commons":44}],23:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var hasOwnProperty = require("@sinonjs/commons").prototypes.object.hasOwnProperty; + +var join = arrayProto.join; +var push = arrayProto.push; +var slice = arrayProto.slice; + +// Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug +var hasDontEnumBug = (function() { + var obj = { + constructor: function() { + return "0"; + }, + toString: function() { + return "1"; + }, + valueOf: function() { + return "2"; + }, + toLocaleString: function() { + return "3"; + }, + prototype: function() { + return "4"; + }, + isPrototypeOf: function() { + return "5"; + }, + propertyIsEnumerable: function() { + return "6"; + }, + hasOwnProperty: function() { + return "7"; + }, + length: function() { + return "8"; + }, + unique: function() { + return "9"; + } + }; + + var result = []; + for (var prop in obj) { + if (hasOwnProperty(obj, prop)) { + push(result, obj[prop]()); + } + } + return join(result, "") !== "0123456789"; +})(); + +function extendCommon(target, sources, doCopy) { + var source, i, prop; + + for (i = 0; i < sources.length; i++) { + source = sources[i]; + + for (prop in source) { + if (hasOwnProperty(source, prop)) { + doCopy(target, source, prop); + } + } + + // Make sure we copy (own) toString method even when in JScript with DontEnum bug + // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug + if (hasDontEnumBug && hasOwnProperty(source, "toString") && source.toString !== target.toString) { + target.toString = source.toString; + } + } + + return target; +} + +/** Public: Extend target in place with all (own) properties, except 'name' when [[writable]] is false, + * from sources in-order. Thus, last source will override properties in previous sources. + * + * @arg {Object} target - The Object to extend + * @arg {Object[]} sources - Objects to copy properties from. + * + * @returns {Object} the extended target + */ +module.exports = function extend(target /*, sources */) { + var sources = slice(arguments, 1); + + return extendCommon(target, sources, function copyValue(dest, source, prop) { + var destOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(dest, prop); + var sourceOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(source, prop); + + if (prop === "name" && !destOwnPropertyDescriptor.writable) { + return; + } + + Object.defineProperty(dest, prop, { + configurable: sourceOwnPropertyDescriptor.configurable, + enumerable: sourceOwnPropertyDescriptor.enumerable, + writable: sourceOwnPropertyDescriptor.writable, + value: sourceOwnPropertyDescriptor.value + }); + }); +}; + +/** Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will + * override properties in previous sources. Define the properties as non enumerable. + * + * @arg {Object} target - The Object to extend + * @arg {Object[]} sources - Objects to copy properties from. + * + * @returns {Object} the extended target + */ +module.exports.nonEnum = function extendNonEnum(target /*, sources */) { + var sources = slice(arguments, 1); + + return extendCommon(target, sources, function copyProperty(dest, source, prop) { + Object.defineProperty(dest, prop, { + value: source[prop], + enumerable: false, + configurable: true, + writable: true + }); + }); +}; + +},{"@sinonjs/commons":44}],24:[function(require,module,exports){ +"use strict"; + +var inspect = require("util").inspect; +var customFormatter; + +function format() { + if (customFormatter) { + return customFormatter.apply(null, arguments); + } + + return inspect.apply(inspect, arguments); +} + +format.setFormatter = function(aCustomFormatter) { + if (typeof aCustomFormatter !== "function") { + throw new Error("format.setFormatter must be called with a function"); + } + + customFormatter = aCustomFormatter; +}; + +module.exports = format; + +},{"util":107}],25:[function(require,module,exports){ +"use strict"; + +module.exports = function toString() { + var i, prop, thisValue; + if (this.getCall && this.callCount) { + i = this.callCount; + + while (i--) { + thisValue = this.getCall(i).thisValue; + + // eslint-disable-next-line guard-for-in + for (prop in thisValue) { + try { + if (thisValue[prop] === this) { + return prop; + } + } catch (e) { + // no-op - accessing props can throw an error, nothing to do here + } + } + } + } + + return this.displayName || "sinon fake"; +}; + +},{}],26:[function(require,module,exports){ +"use strict"; + +/* istanbul ignore next : not testing that setTimeout works */ +function nextTick(callback) { + setTimeout(callback, 0); +} + +module.exports = function getNextTick(process, setImmediate) { + if (typeof process === "object" && typeof process.nextTick === "function") { + return process.nextTick; + } + + if (typeof setImmediate === "function") { + return setImmediate; + } + + return nextTick; +}; + +},{}],27:[function(require,module,exports){ +"use strict"; + +module.exports = function getPropertyDescriptor(object, property) { + var proto = object; + var descriptor; + var isOwn = Boolean(object && Object.getOwnPropertyDescriptor(object, property)); + + while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) { + proto = Object.getPrototypeOf(proto); + } + + if (descriptor) { + descriptor.isOwn = isOwn; + } + + return descriptor; +}; + +},{}],28:[function(require,module,exports){ +"use strict"; + +/** + * Verify if an object is a ECMAScript Module + * + * As the exports from a module is immutable we cannot alter the exports + * using spies or stubs. Let the consumer know this to avoid bug reports + * on weird error messages. + * + * @param {Object} object The object to examine + * + * @returns {Boolean} true when the object is a module + */ +module.exports = function(object) { + return ( + object && typeof Symbol !== "undefined" && object[Symbol.toStringTag] === "Module" && Object.isSealed(object) + ); +}; + +},{}],29:[function(require,module,exports){ +"use strict"; + +/** + * @param {*} object + * @param {String} property + * @returns whether a prop exists in the prototype chain + */ +function isNonExistentProperty(object, property) { + return object && typeof property !== "undefined" && !(property in object); +} + +module.exports = isNonExistentProperty; + +},{}],30:[function(require,module,exports){ +"use strict"; + +var getPropertyDescriptor = require("./get-property-descriptor"); + +function isPropertyConfigurable(obj, propName) { + var propertyDescriptor = getPropertyDescriptor(obj, propName); + + return propertyDescriptor ? propertyDescriptor.configurable : true; +} + +module.exports = isPropertyConfigurable; + +},{"./get-property-descriptor":27}],31:[function(require,module,exports){ +"use strict"; + +var globalObject = require("@sinonjs/commons").global; +var getNextTick = require("./get-next-tick"); + +module.exports = getNextTick(globalObject.process, globalObject.setImmediate); + +},{"./get-next-tick":26,"@sinonjs/commons":44}],32:[function(require,module,exports){ +"use strict"; + +var array = [null, "once", "twice", "thrice"]; + +module.exports = function timesInWords(count) { + return array[count] || (count || 0) + " times"; +}; + +},{}],33:[function(require,module,exports){ +"use strict"; + +var forEach = Array.prototype.forEach; + +function usePromiseLibrary(library, fakes) { + if (typeof library === "undefined") { + return; + } + + if (Array.isArray(fakes)) { + forEach.call(fakes, usePromiseLibrary.bind(null, library)); + + return; + } + + if (typeof fakes.usingPromise === "function") { + fakes.usingPromise(library); + } +} + +module.exports = usePromiseLibrary; + +},{}],34:[function(require,module,exports){ +"use strict"; + +var functionName = require("@sinonjs/commons").functionName; + +var getPropertyDescriptor = require("./get-property-descriptor"); +var walk = require("./walk"); + +function walkObject(predicate, object, filter) { + var called = false; + var name = functionName(predicate); + + if (!object) { + throw new Error("Trying to " + name + " object but received " + String(object)); + } + + walk(object, function(prop, propOwner) { + // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object + // is not Object.prototype + if ( + propOwner !== Object.prototype && + prop !== "constructor" && + typeof getPropertyDescriptor(propOwner, prop).value === "function" + ) { + if (filter) { + if (filter(object, prop)) { + called = true; + predicate(object, prop); + } + } else { + called = true; + predicate(object, prop); + } + } + }); + + if (!called) { + throw new Error("Expected to " + name + " methods on object but found none"); + } + + return object; +} + +module.exports = walkObject; + +},{"./get-property-descriptor":27,"./walk":35,"@sinonjs/commons":44}],35:[function(require,module,exports){ +"use strict"; + +var forEach = require("@sinonjs/commons").prototypes.array.forEach; + +function walkInternal(obj, iterator, context, originalObj, seen) { + var proto, prop; + + if (typeof Object.getOwnPropertyNames !== "function") { + // We explicitly want to enumerate through all of the prototype's properties + // in this case, therefore we deliberately leave out an own property check. + /* eslint-disable-next-line guard-for-in */ + for (prop in obj) { + iterator.call(context, obj[prop], prop, obj); + } + + return; + } + + forEach(Object.getOwnPropertyNames(obj), function(k) { + if (seen[k] !== true) { + seen[k] = true; + var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === "function" ? originalObj : obj; + iterator.call(context, k, target); + } + }); + + proto = Object.getPrototypeOf(obj); + if (proto) { + walkInternal(proto, iterator, context, originalObj, seen); + } +} + +/* Walks the prototype chain of an object and iterates over every own property + * name encountered. The iterator is called in the same fashion that Array.prototype.forEach + * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional + * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will + * default to using a simple for..in loop. + * + * obj - The object to walk the prototype chain for. + * iterator - The function to be called on each pass of the walk. + * context - (Optional) When given, the iterator will be called with this object as the receiver. + */ +module.exports = function walk(obj, iterator, context) { + return walkInternal(obj, iterator, context, obj, {}); +}; + +},{"@sinonjs/commons":44}],36:[function(require,module,exports){ +"use strict"; + +var getPropertyDescriptor = require("./get-property-descriptor"); +var extend = require("./extend"); +var hasOwnProperty = require("@sinonjs/commons").prototypes.object.hasOwnProperty; +var valueToString = require("@sinonjs/commons").valueToString; + +function isFunction(obj) { + return typeof obj === "function" || Boolean(obj && obj.constructor && obj.call && obj.apply); +} + +function mirrorProperties(target, source) { + for (var prop in source) { + if (!hasOwnProperty(target, prop)) { + target[prop] = source[prop]; + } + } +} + +// Cheap way to detect if we have ES5 support. +var hasES5Support = "keys" in Object; + +module.exports = function wrapMethod(object, property, method) { + if (!object) { + throw new TypeError("Should wrap property of object"); + } + + if (typeof method !== "function" && typeof method !== "object") { + throw new TypeError("Method wrapper should be a function or a property descriptor"); + } + + function checkWrappedMethod(wrappedMethod) { + var error; + + if (!isFunction(wrappedMethod)) { + error = new TypeError( + "Attempted to wrap " + typeof wrappedMethod + " property " + valueToString(property) + " as function" + ); + } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) { + error = new TypeError("Attempted to wrap " + valueToString(property) + " which is already wrapped"); + } else if (wrappedMethod.calledBefore) { + var verb = wrappedMethod.returns ? "stubbed" : "spied on"; + error = new TypeError("Attempted to wrap " + valueToString(property) + " which is already " + verb); + } + + if (error) { + if (wrappedMethod && wrappedMethod.stackTraceError) { + error.stack += "\n--------------\n" + wrappedMethod.stackTraceError.stack; + } + throw error; + } + } + + var error, wrappedMethod, i, wrappedMethodDesc; + + function simplePropertyAssignment() { + wrappedMethod = object[property]; + checkWrappedMethod(wrappedMethod); + object[property] = method; + method.displayName = property; + } + + // Firefox has a problem when using hasOwn.call on objects from other frames. + /* eslint-disable-next-line @sinonjs/no-prototype-methods/no-prototype-methods */ + var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwnProperty(object, property); + + if (hasES5Support) { + var methodDesc = typeof method === "function" ? { value: method } : method; + wrappedMethodDesc = getPropertyDescriptor(object, property); + + if (!wrappedMethodDesc) { + error = new TypeError( + "Attempted to wrap " + typeof wrappedMethod + " property " + property + " as function" + ); + } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) { + error = new TypeError("Attempted to wrap " + property + " which is already wrapped"); + } + if (error) { + if (wrappedMethodDesc && wrappedMethodDesc.stackTraceError) { + error.stack += "\n--------------\n" + wrappedMethodDesc.stackTraceError.stack; + } + throw error; + } + + var types = Object.keys(methodDesc); + for (i = 0; i < types.length; i++) { + wrappedMethod = wrappedMethodDesc[types[i]]; + checkWrappedMethod(wrappedMethod); + } + + mirrorProperties(methodDesc, wrappedMethodDesc); + for (i = 0; i < types.length; i++) { + mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]); + } + Object.defineProperty(object, property, methodDesc); + + // catch failing assignment + // this is the converse of the check in `.restore` below + if (typeof method === "function" && object[property] !== method) { + // correct any wrongdoings caused by the defineProperty call above, + // such as adding new items (if object was a Storage object) + delete object[property]; + simplePropertyAssignment(); + } + } else { + simplePropertyAssignment(); + } + + extend.nonEnum(method, { + displayName: property, + + wrappedMethod: wrappedMethod, + + // Set up an Error object for a stack trace which can be used later to find what line of + // code the original method was created on. + stackTraceError: new Error("Stack Trace for original"), + + restore: function() { + // For prototype properties try to reset by delete first. + // If this fails (ex: localStorage on mobile safari) then force a reset + // via direct assignment. + if (!owned) { + // In some cases `delete` may throw an error + try { + delete object[property]; + } catch (e) {} // eslint-disable-line no-empty + // For native code functions `delete` fails without throwing an error + // on Chrome < 43, PhantomJS, etc. + } else if (hasES5Support) { + Object.defineProperty(object, property, wrappedMethodDesc); + } + + if (hasES5Support) { + var descriptor = getPropertyDescriptor(object, property); + if (descriptor && descriptor.value === method) { + object[property] = wrappedMethod; + } + } else { + // Use strict equality comparison to check failures then force a reset + // via direct assignment. + if (object[property] === method) { + object[property] = wrappedMethod; + } + } + } + }); + + method.restore.sinon = true; + + if (!hasES5Support) { + mirrorProperties(method, wrappedMethod); + } + + return method; +}; + +},{"./extend":23,"./get-property-descriptor":27,"@sinonjs/commons":44}],37:[function(require,module,exports){ +"use strict"; + +var extend = require("./core/extend"); +var FakeTimers = require("@sinonjs/fake-timers"); +var globalObject = require("@sinonjs/commons").global; + +function createClock(config, globalCtx) { + var FakeTimersCtx = FakeTimers; + if (globalCtx !== null && typeof globalCtx === "object") { + FakeTimersCtx = FakeTimers.withGlobal(globalCtx); + } + var clock = FakeTimersCtx.install(config); + clock.restore = clock.uninstall; + return clock; +} + +function addIfDefined(obj, globalPropName) { + var globalProp = globalObject[globalPropName]; + if (typeof globalProp !== "undefined") { + obj[globalPropName] = globalProp; + } +} + +/** + * @param {number|Date|Object} dateOrConfig The unix epoch value to install with (default 0) + * @returns {Object} Returns a lolex clock instance + */ +exports.useFakeTimers = function(dateOrConfig) { + var hasArguments = typeof dateOrConfig !== "undefined"; + var argumentIsDateLike = + (typeof dateOrConfig === "number" || dateOrConfig instanceof Date) && arguments.length === 1; + var argumentIsObject = dateOrConfig !== null && typeof dateOrConfig === "object" && arguments.length === 1; + + if (!hasArguments) { + return createClock({ + now: 0 + }); + } + + if (argumentIsDateLike) { + return createClock({ + now: dateOrConfig + }); + } + + if (argumentIsObject) { + var config = extend.nonEnum({}, dateOrConfig); + var globalCtx = config.global; + delete config.global; + return createClock(config, globalCtx); + } + + throw new TypeError("useFakeTimers expected epoch or config object. See https://github.com/sinonjs/sinon"); +}; + +exports.clock = { + create: function(now) { + return FakeTimers.createClock(now); + } +}; + +var timers = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval, + Date: Date +}; +addIfDefined(timers, "setImmediate"); +addIfDefined(timers, "clearImmediate"); + +exports.timers = timers; + +},{"./core/extend":23,"@sinonjs/commons":44,"@sinonjs/fake-timers":56}],38:[function(require,module,exports){ +"use strict"; + +var every = require("./prototypes/array").every; + +/** + * @private + */ +function hasCallsLeft(callMap, spy) { + if (callMap[spy.id] === undefined) { + callMap[spy.id] = 0; + } + + return callMap[spy.id] < spy.callCount; +} + +/** + * @private + */ +function checkAdjacentCalls(callMap, spy, index, spies) { + var calledBeforeNext = true; + + if (index !== spies.length - 1) { + calledBeforeNext = spy.calledBefore(spies[index + 1]); + } + + if (hasCallsLeft(callMap, spy) && calledBeforeNext) { + callMap[spy.id] += 1; + return true; + } + + return false; +} + +/** + * A Sinon proxy object (fake, spy, stub) + * + * @typedef {object} SinonProxy + * @property {Function} calledBefore - A method that determines if this proxy was called before another one + * @property {string} id - Some id + * @property {number} callCount - Number of times this proxy has been called + */ + +/** + * Returns true when the spies have been called in the order they were supplied in + * + * @param {SinonProxy[] | SinonProxy} spies An array of proxies, or several proxies as arguments + * @returns {boolean} true when spies are called in order, false otherwise + */ +function calledInOrder(spies) { + var callMap = {}; + // eslint-disable-next-line no-underscore-dangle + var _spies = arguments.length > 1 ? arguments : spies; + + return every(_spies, checkAdjacentCalls.bind(null, callMap)); +} + +module.exports = calledInOrder; + +},{"./prototypes/array":46}],39:[function(require,module,exports){ +"use strict"; + +var functionName = require("./function-name"); + +/** + * Returns a display name for a value from a constructor + * + * @param {object} value A value to examine + * @returns {(string|null)} A string or null + */ +function className(value) { + return ( + (value.constructor && value.constructor.name) || + // The next branch is for IE11 support only: + // Because the name property is not set on the prototype + // of the Function object, we finally try to grab the + // name from its definition. This will never be reached + // in node, so we are not able to test this properly. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + (typeof value.constructor === "function" && + /* istanbul ignore next */ + functionName(value.constructor)) || + null + ); +} + +module.exports = className; + +},{"./function-name":42}],40:[function(require,module,exports){ +/* eslint-disable no-console */ +"use strict"; + +/** + * Returns a function that will invoke the supplied function and print a + * deprecation warning to the console each time it is called. + * + * @param {Function} func + * @param {string} msg + * @returns {Function} + */ +exports.wrap = function(func, msg) { + var wrapped = function() { + exports.printWarning(msg); + return func.apply(this, arguments); + }; + if (func.prototype) { + wrapped.prototype = func.prototype; + } + return wrapped; +}; + +/** + * Returns a string which can be supplied to `wrap()` to notify the user that a + * particular part of the sinon API has been deprecated. + * + * @param {string} packageName + * @param {string} funcName + * @returns {string} + */ +exports.defaultMsg = function(packageName, funcName) { + return ( + packageName + + "." + + funcName + + " is deprecated and will be removed from the public API in a future version of " + + packageName + + "." + ); +}; + +/** + * Prints a warning on the console, when it exists + * + * @param {string} msg + * @returns {undefined} + */ +exports.printWarning = function(msg) { + /* istanbul ignore next */ + if (typeof process === "object" && process.emitWarning) { + // Emit Warnings in Node + process.emitWarning(msg); + } else if (console.info) { + console.info(msg); + } else { + console.log(msg); + } +}; + +},{}],41:[function(require,module,exports){ +"use strict"; + +/** + * Returns true when fn returns true for all members of obj. + * This is an every implementation that works for all iterables + * + * @param {object} obj + * @param {Function} fn + * @returns {boolean} + */ +module.exports = function every(obj, fn) { + var pass = true; + + try { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + obj.forEach(function() { + if (!fn.apply(this, arguments)) { + // Throwing an error is the only way to break `forEach` + throw new Error(); + } + }); + } catch (e) { + pass = false; + } + + return pass; +}; + +},{}],42:[function(require,module,exports){ +"use strict"; + +/** + * Returns a display name for a function + * + * @param {Function} func + * @returns {string} + */ +module.exports = function functionName(func) { + if (!func) { + return ""; + } + + try { + return ( + func.displayName || + func.name || + // Use function decomposition as a last resort to get function + // name. Does not rely on function decomposition to work - if it + // doesn't debugging will be slightly less informative + // (i.e. toString will say 'spy' rather than 'myFunc'). + (String(func).match(/function ([^\s(]+)/) || [])[1] + ); + } catch (e) { + // Stringify may fail and we might get an exception, as a last-last + // resort fall back to empty string. + return ""; + } +}; + +},{}],43:[function(require,module,exports){ +"use strict"; + +/** + * A reference to the global object + * + * @type {object} globalObject + */ +var globalObject; + +/* istanbul ignore else */ +if (typeof global !== "undefined") { + // Node + globalObject = global; +} else if (typeof window !== "undefined") { + // Browser + globalObject = window; +} else { + // WebWorker + globalObject = self; +} + +module.exports = globalObject; + +},{}],44:[function(require,module,exports){ +"use strict"; + +module.exports = { + global: require("./global"), + calledInOrder: require("./called-in-order"), + className: require("./class-name"), + deprecated: require("./deprecated"), + every: require("./every"), + functionName: require("./function-name"), + orderByFirstCall: require("./order-by-first-call"), + prototypes: require("./prototypes"), + typeOf: require("./type-of"), + valueToString: require("./value-to-string") +}; + +},{"./called-in-order":38,"./class-name":39,"./deprecated":40,"./every":41,"./function-name":42,"./global":43,"./order-by-first-call":45,"./prototypes":49,"./type-of":54,"./value-to-string":55}],45:[function(require,module,exports){ +"use strict"; + +var sort = require("./prototypes/array").sort; +var slice = require("./prototypes/array").slice; + +/** + * @private + */ +function comparator(a, b) { + // uuid, won't ever be equal + var aCall = a.getCall(0); + var bCall = b.getCall(0); + var aId = (aCall && aCall.callId) || -1; + var bId = (bCall && bCall.callId) || -1; + + return aId < bId ? -1 : 1; +} + +/** + * A Sinon proxy object (fake, spy, stub) + * + * @typedef {object} SinonProxy + * @property {Function} getCall - A method that can return the first call + */ + +/** + * Sorts an array of SinonProxy instances (fake, spy, stub) by their first call + * + * @param {SinonProxy[] | SinonProxy} spies + * @returns {SinonProxy[]} + */ +function orderByFirstCall(spies) { + return sort(slice(spies), comparator); +} + +module.exports = orderByFirstCall; + +},{"./prototypes/array":46}],46:[function(require,module,exports){ +"use strict"; + +var copyPrototype = require("./copy-prototype"); + +module.exports = copyPrototype(Array.prototype); + +},{"./copy-prototype":47}],47:[function(require,module,exports){ +"use strict"; + +var call = Function.call; + +module.exports = function copyPrototypeMethods(prototype) { + /* eslint-disable local-rules/no-prototype-methods */ + return Object.getOwnPropertyNames(prototype).reduce(function(result, name) { + // ignore size because it throws from Map + if ( + name !== "size" && + name !== "caller" && + name !== "callee" && + name !== "arguments" && + typeof prototype[name] === "function" + ) { + result[name] = call.bind(prototype[name]); + } + + return result; + }, Object.create(null)); +}; + +},{}],48:[function(require,module,exports){ +"use strict"; + +var copyPrototype = require("./copy-prototype"); + +module.exports = copyPrototype(Function.prototype); + +},{"./copy-prototype":47}],49:[function(require,module,exports){ +"use strict"; + +module.exports = { + array: require("./array"), + function: require("./function"), + map: require("./map"), + object: require("./object"), + set: require("./set"), + string: require("./string") +}; + +},{"./array":46,"./function":48,"./map":50,"./object":51,"./set":52,"./string":53}],50:[function(require,module,exports){ +"use strict"; + +var copyPrototype = require("./copy-prototype"); + +module.exports = copyPrototype(Map.prototype); + +},{"./copy-prototype":47}],51:[function(require,module,exports){ +"use strict"; + +var copyPrototype = require("./copy-prototype"); + +module.exports = copyPrototype(Object.prototype); + +},{"./copy-prototype":47}],52:[function(require,module,exports){ +"use strict"; + +var copyPrototype = require("./copy-prototype"); + +module.exports = copyPrototype(Set.prototype); + +},{"./copy-prototype":47}],53:[function(require,module,exports){ +"use strict"; + +var copyPrototype = require("./copy-prototype"); + +module.exports = copyPrototype(String.prototype); + +},{"./copy-prototype":47}],54:[function(require,module,exports){ +"use strict"; + +var type = require("type-detect"); + +/** + * Returns the lower-case result of running type from type-detect on the value + * + * @param {*} value + * @returns {string} + */ +module.exports = function typeOf(value) { + return type(value).toLowerCase(); +}; + +},{"type-detect":104}],55:[function(require,module,exports){ +"use strict"; + +/** + * Returns a string representation of the value + * + * @param {*} value + * @returns {string} + */ +function valueToString(value) { + if (value && value.toString) { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + return value.toString(); + } + return String(value); +} + +module.exports = valueToString; + +},{}],56:[function(require,module,exports){ +"use strict"; + +var globalObject = require("@sinonjs/commons").global; + +// eslint-disable-next-line complexity +function withGlobal(_global) { + var userAgent = _global.navigator && _global.navigator.userAgent; + var isRunningInIE = userAgent && userAgent.indexOf("MSIE ") > -1; + var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint + var NOOP = function() { + return undefined; + }; + var NOOP_ARRAY = function() { + return []; + }; + var timeoutResult = _global.setTimeout(NOOP, 0); + var addTimerReturnsObject = typeof timeoutResult === "object"; + var hrtimePresent = + _global.process && typeof _global.process.hrtime === "function"; + var hrtimeBigintPresent = + hrtimePresent && typeof _global.process.hrtime.bigint === "function"; + var nextTickPresent = + _global.process && typeof _global.process.nextTick === "function"; + var utilPromisify = _global.process && require("util").promisify; + var performancePresent = + _global.performance && typeof _global.performance.now === "function"; + var hasPerformancePrototype = + _global.Performance && + (typeof _global.Performance).match(/^(function|object)$/); + var queueMicrotaskPresent = _global.hasOwnProperty("queueMicrotask"); + var requestAnimationFramePresent = + _global.requestAnimationFrame && + typeof _global.requestAnimationFrame === "function"; + var cancelAnimationFramePresent = + _global.cancelAnimationFrame && + typeof _global.cancelAnimationFrame === "function"; + var requestIdleCallbackPresent = + _global.requestIdleCallback && + typeof _global.requestIdleCallback === "function"; + var cancelIdleCallbackPresent = + _global.cancelIdleCallback && + typeof _global.cancelIdleCallback === "function"; + var setImmediatePresent = + _global.setImmediate && typeof _global.setImmediate === "function"; + + // Make properties writable in IE, as per + // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html + /* eslint-disable no-self-assign */ + if (isRunningInIE) { + _global.setTimeout = _global.setTimeout; + _global.clearTimeout = _global.clearTimeout; + _global.setInterval = _global.setInterval; + _global.clearInterval = _global.clearInterval; + _global.Date = _global.Date; + } + + // setImmediate is not a standard function + // avoid adding the prop to the window object if not present + if (setImmediatePresent) { + _global.setImmediate = _global.setImmediate; + _global.clearImmediate = _global.clearImmediate; + } + /* eslint-enable no-self-assign */ + + _global.clearTimeout(timeoutResult); + + var NativeDate = _global.Date; + var uniqueTimerId = 1; + + function isNumberFinite(num) { + if (Number.isFinite) { + return Number.isFinite(num); + } + + if (typeof num !== "number") { + return false; + } + + return isFinite(num); + } + + /** + * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into + * number of milliseconds. This is used to support human-readable strings passed + * to clock.tick() + */ + function parseTime(str) { + if (!str) { + return 0; + } + + var strings = str.split(":"); + var l = strings.length; + var i = l; + var ms = 0; + var parsed; + + if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { + throw new Error( + "tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits" + ); + } + + while (i--) { + parsed = parseInt(strings[i], 10); + + if (parsed >= 60) { + throw new Error("Invalid time " + str); + } + + ms += parsed * Math.pow(60, l - i - 1); + } + + return ms * 1000; + } + + /** + * Get the decimal part of the millisecond value as nanoseconds + * + * @param {Number} msFloat the number of milliseconds + * @returns {Number} an integer number of nanoseconds in the range [0,1e6) + * + * Example: nanoRemainer(123.456789) -> 456789 + */ + function nanoRemainder(msFloat) { + var modulo = 1e6; + var remainder = (msFloat * 1e6) % modulo; + var positiveRemainder = remainder < 0 ? remainder + modulo : remainder; + + return Math.floor(positiveRemainder); + } + + /** + * Used to grok the `now` parameter to createClock. + * @param epoch {Date|number} the system time + */ + function getEpoch(epoch) { + if (!epoch) { + return 0; + } + if (typeof epoch.getTime === "function") { + return epoch.getTime(); + } + if (typeof epoch === "number") { + return epoch; + } + throw new TypeError("now should be milliseconds since UNIX epoch"); + } + + function inRange(from, to, timer) { + return timer && timer.callAt >= from && timer.callAt <= to; + } + + function mirrorDateProperties(target, source) { + var prop; + for (prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + + // set special now implementation + if (source.now) { + target.now = function now() { + return target.clock.now; + }; + } else { + delete target.now; + } + + // set special toSource implementation + if (source.toSource) { + target.toSource = function toSource() { + return source.toSource(); + }; + } else { + delete target.toSource; + } + + // set special toString implementation + target.toString = function toString() { + return source.toString(); + }; + + target.prototype = source.prototype; + target.parse = source.parse; + target.UTC = source.UTC; + target.prototype.toUTCString = source.prototype.toUTCString; + + return target; + } + + function createDate() { + function ClockDate(year, month, date, hour, minute, second, ms) { + // the Date constructor called as a function, ref Ecma-262 Edition 5.1, section 15.9.2. + // This remains so in the 10th edition of 2019 as well. + if (!(this instanceof ClockDate)) { + return new NativeDate(ClockDate.clock.now).toString(); + } + + // if Date is called as a constructor with 'new' keyword + // Defensive and verbose to avoid potential harm in passing + // explicit undefined when user does not pass argument + switch (arguments.length) { + case 0: + return new NativeDate(ClockDate.clock.now); + case 1: + return new NativeDate(year); + case 2: + return new NativeDate(year, month); + case 3: + return new NativeDate(year, month, date); + case 4: + return new NativeDate(year, month, date, hour); + case 5: + return new NativeDate(year, month, date, hour, minute); + case 6: + return new NativeDate( + year, + month, + date, + hour, + minute, + second + ); + default: + return new NativeDate( + year, + month, + date, + hour, + minute, + second, + ms + ); + } + } + + return mirrorDateProperties(ClockDate, NativeDate); + } + + function enqueueJob(clock, job) { + // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob + if (!clock.jobs) { + clock.jobs = []; + } + clock.jobs.push(job); + } + + function runJobs(clock) { + // runs all microtick-deferred tasks - ecma262/#sec-runjobs + if (!clock.jobs) { + return; + } + for (var i = 0; i < clock.jobs.length; i++) { + var job = clock.jobs[i]; + job.func.apply(null, job.args); + if (clock.loopLimit && i > clock.loopLimit) { + throw new Error( + "Aborting after running " + + clock.loopLimit + + " timers, assuming an infinite loop!" + ); + } + } + clock.jobs = []; + } + + function addTimer(clock, timer) { + if (timer.func === undefined) { + throw new Error("Callback must be provided to timer calls"); + } + + timer.type = timer.immediate ? "Immediate" : "Timeout"; + + if (timer.hasOwnProperty("delay")) { + if (!isNumberFinite(timer.delay)) { + timer.delay = 0; + } + timer.delay = timer.delay > maxTimeout ? 1 : timer.delay; + timer.delay = Math.max(0, timer.delay); + } + + if (timer.hasOwnProperty("interval")) { + timer.type = "Interval"; + timer.interval = timer.interval > maxTimeout ? 1 : timer.interval; + } + + if (timer.hasOwnProperty("animation")) { + timer.type = "AnimationFrame"; + timer.animation = true; + } + + if (!clock.timers) { + clock.timers = {}; + } + + timer.id = uniqueTimerId++; + timer.createdAt = clock.now; + timer.callAt = + clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0)); + + clock.timers[timer.id] = timer; + + if (addTimerReturnsObject) { + var res = { + id: timer.id, + ref: function() { + return res; + }, + unref: function() { + return res; + }, + refresh: function() { + return res; + } + }; + return res; + } + + return timer.id; + } + + /* eslint consistent-return: "off" */ + function compareTimers(a, b) { + // Sort first by absolute timing + if (a.callAt < b.callAt) { + return -1; + } + if (a.callAt > b.callAt) { + return 1; + } + + // Sort next by immediate, immediate timers take precedence + if (a.immediate && !b.immediate) { + return -1; + } + if (!a.immediate && b.immediate) { + return 1; + } + + // Sort next by creation time, earlier-created timers take precedence + if (a.createdAt < b.createdAt) { + return -1; + } + if (a.createdAt > b.createdAt) { + return 1; + } + + // Sort next by id, lower-id timers take precedence + if (a.id < b.id) { + return -1; + } + if (a.id > b.id) { + return 1; + } + + // As timer ids are unique, no fallback `0` is necessary + } + + function firstTimerInRange(clock, from, to) { + var timers = clock.timers; + var timer = null; + var id, isInRange; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + isInRange = inRange(from, to, timers[id]); + + if ( + isInRange && + (!timer || compareTimers(timer, timers[id]) === 1) + ) { + timer = timers[id]; + } + } + } + + return timer; + } + + function firstTimer(clock) { + var timers = clock.timers; + var timer = null; + var id; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + if (!timer || compareTimers(timer, timers[id]) === 1) { + timer = timers[id]; + } + } + } + + return timer; + } + + function lastTimer(clock) { + var timers = clock.timers; + var timer = null; + var id; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + if (!timer || compareTimers(timer, timers[id]) === -1) { + timer = timers[id]; + } + } + } + + return timer; + } + + function callTimer(clock, timer) { + if (typeof timer.interval === "number") { + clock.timers[timer.id].callAt += timer.interval; + } else { + delete clock.timers[timer.id]; + } + + if (typeof timer.func === "function") { + timer.func.apply(null, timer.args); + } else { + /* eslint no-eval: "off" */ + eval(timer.func); + } + } + + function clearTimer(clock, timerId, ttype) { + if (!timerId) { + // null appears to be allowed in most browsers, and appears to be + // relied upon by some libraries, like Bootstrap carousel + return; + } + + if (!clock.timers) { + clock.timers = {}; + } + + // in Node, timerId is an object with .ref()/.unref(), and + // its .id field is the actual timer id. + var id = typeof timerId === "object" ? timerId.id : timerId; + + if (clock.timers.hasOwnProperty(id)) { + // check that the ID matches a timer of the correct type + var timer = clock.timers[id]; + if (timer.type === ttype) { + delete clock.timers[id]; + } else { + var clear = + ttype === "AnimationFrame" + ? "cancelAnimationFrame" + : "clear" + ttype; + var schedule = + timer.type === "AnimationFrame" + ? "requestAnimationFrame" + : "set" + timer.type; + throw new Error( + "Cannot clear timer: timer created with " + + schedule + + "() but cleared with " + + clear + + "()" + ); + } + } + } + + function uninstall(clock, target, config) { + var method, i, l; + var installedHrTime = "_hrtime"; + var installedNextTick = "_nextTick"; + + for (i = 0, l = clock.methods.length; i < l; i++) { + method = clock.methods[i]; + if (method === "hrtime" && target.process) { + target.process.hrtime = clock[installedHrTime]; + } else if (method === "nextTick" && target.process) { + target.process.nextTick = clock[installedNextTick]; + } else if (method === "performance") { + var originalPerfDescriptor = Object.getOwnPropertyDescriptor( + clock, + "_" + method + ); + if ( + originalPerfDescriptor && + originalPerfDescriptor.get && + !originalPerfDescriptor.set + ) { + Object.defineProperty( + target, + method, + originalPerfDescriptor + ); + } else if (originalPerfDescriptor.configurable) { + target[method] = clock["_" + method]; + } + } else { + if (target[method] && target[method].hadOwnProperty) { + target[method] = clock["_" + method]; + if ( + method === "clearInterval" && + config.shouldAdvanceTime === true + ) { + target[method](clock.attachedInterval); + } + } else { + try { + delete target[method]; + } catch (ignore) { + /* eslint no-empty: "off" */ + } + } + } + } + + // Prevent multiple executions which will completely remove these props + clock.methods = []; + + // return pending timers, to enable checking what timers remained on uninstall + if (!clock.timers) { + return []; + } + return Object.keys(clock.timers).map(function mapper(key) { + return clock.timers[key]; + }); + } + + function hijackMethod(target, method, clock) { + var prop; + clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call( + target, + method + ); + clock["_" + method] = target[method]; + + if (method === "Date") { + var date = mirrorDateProperties(clock[method], target[method]); + target[method] = date; + } else if (method === "performance") { + var originalPerfDescriptor = Object.getOwnPropertyDescriptor( + target, + method + ); + // JSDOM has a read only performance field so we have to save/copy it differently + if ( + originalPerfDescriptor && + originalPerfDescriptor.get && + !originalPerfDescriptor.set + ) { + Object.defineProperty( + clock, + "_" + method, + originalPerfDescriptor + ); + + var perfDescriptor = Object.getOwnPropertyDescriptor( + clock, + method + ); + Object.defineProperty(target, method, perfDescriptor); + } else { + target[method] = clock[method]; + } + } else { + target[method] = function() { + return clock[method].apply(clock, arguments); + }; + + for (prop in clock[method]) { + if (clock[method].hasOwnProperty(prop)) { + target[method][prop] = clock[method][prop]; + } + } + } + + target[method].clock = clock; + } + + function doIntervalTick(clock, advanceTimeDelta) { + clock.tick(advanceTimeDelta); + } + + var timers = { + setTimeout: _global.setTimeout, + clearTimeout: _global.clearTimeout, + setInterval: _global.setInterval, + clearInterval: _global.clearInterval, + Date: _global.Date + }; + + if (setImmediatePresent) { + timers.setImmediate = _global.setImmediate; + timers.clearImmediate = _global.clearImmediate; + } + + if (hrtimePresent) { + timers.hrtime = _global.process.hrtime; + } + + if (nextTickPresent) { + timers.nextTick = _global.process.nextTick; + } + + if (performancePresent) { + timers.performance = _global.performance; + } + + if (requestAnimationFramePresent) { + timers.requestAnimationFrame = _global.requestAnimationFrame; + } + + if (queueMicrotaskPresent) { + timers.queueMicrotask = true; + } + + if (cancelAnimationFramePresent) { + timers.cancelAnimationFrame = _global.cancelAnimationFrame; + } + + if (requestIdleCallbackPresent) { + timers.requestIdleCallback = _global.requestIdleCallback; + } + + if (cancelIdleCallbackPresent) { + timers.cancelIdleCallback = _global.cancelIdleCallback; + } + + var keys = + Object.keys || + function(obj) { + var ks = []; + var key; + + for (key in obj) { + if (obj.hasOwnProperty(key)) { + ks.push(key); + } + } + + return ks; + }; + + var originalSetTimeout = _global.setImmediate || _global.setTimeout; + + /** + * @param start {Date|number} the system time - non-integer values are floored + * @param loopLimit {number} maximum number of timers that will be run when calling runAll() + */ + function createClock(start, loopLimit) { + // eslint-disable-next-line no-param-reassign + start = Math.floor(getEpoch(start)); + // eslint-disable-next-line no-param-reassign + loopLimit = loopLimit || 1000; + var nanos = 0; + var adjustedSystemTime = [0, 0]; // [millis, nanoremainder] + + if (NativeDate === undefined) { + throw new Error( + "The global scope doesn't have a `Date` object" + + " (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)" + ); + } + + var clock = { + now: start, + timeouts: {}, + Date: createDate(), + loopLimit: loopLimit + }; + + clock.Date.clock = clock; + + function getTimeToNextFrame() { + return 16 - ((clock.now - start) % 16); + } + + function hrtime(prev) { + var millisSinceStart = clock.now - adjustedSystemTime[0] - start; + var secsSinceStart = Math.floor(millisSinceStart / 1000); + var remainderInNanos = + (millisSinceStart - secsSinceStart * 1e3) * 1e6 + + nanos - + adjustedSystemTime[1]; + + if (Array.isArray(prev)) { + if (prev[1] > 1e9) { + throw new TypeError( + "Number of nanoseconds can't exceed a billion" + ); + } + + var oldSecs = prev[0]; + var nanoDiff = remainderInNanos - prev[1]; + var secDiff = secsSinceStart - oldSecs; + + if (nanoDiff < 0) { + nanoDiff += 1e9; + secDiff -= 1; + } + + return [secDiff, nanoDiff]; + } + return [secsSinceStart, remainderInNanos]; + } + + if (hrtimeBigintPresent) { + hrtime.bigint = function() { + var parts = hrtime(); + return BigInt(parts[0]) * BigInt(1e9) + BigInt(parts[1]); // eslint-disable-line + }; + } + + clock.requestIdleCallback = function requestIdleCallback( + func, + timeout + ) { + var timeToNextIdlePeriod = 0; + + if (clock.countTimers() > 0) { + timeToNextIdlePeriod = 50; // const for now + } + + var result = addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: + typeof timeout === "undefined" + ? timeToNextIdlePeriod + : Math.min(timeout, timeToNextIdlePeriod) + }); + + return result.id || result; + }; + + clock.cancelIdleCallback = function cancelIdleCallback(timerId) { + return clearTimer(clock, timerId, "Timeout"); + }; + + clock.setTimeout = function setTimeout(func, timeout) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: timeout + }); + }; + if (typeof _global.Promise !== "undefined" && utilPromisify) { + clock.setTimeout[ + utilPromisify.custom + ] = function promisifiedSetTimeout(timeout, arg) { + return new _global.Promise(function setTimeoutExecutor( + resolve + ) { + addTimer(clock, { + func: resolve, + args: [arg], + delay: timeout + }); + }); + }; + } + + clock.clearTimeout = function clearTimeout(timerId) { + return clearTimer(clock, timerId, "Timeout"); + }; + + clock.nextTick = function nextTick(func) { + return enqueueJob(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 1) + }); + }; + + clock.queueMicrotask = function queueMicrotask(func) { + return clock.nextTick(func); // explicitly drop additional arguments + }; + + clock.setInterval = function setInterval(func, timeout) { + // eslint-disable-next-line no-param-reassign + timeout = parseInt(timeout, 10); + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: timeout, + interval: timeout + }); + }; + + clock.clearInterval = function clearInterval(timerId) { + return clearTimer(clock, timerId, "Interval"); + }; + + if (setImmediatePresent) { + clock.setImmediate = function setImmediate(func) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 1), + immediate: true + }); + }; + + if (typeof _global.Promise !== "undefined" && utilPromisify) { + clock.setImmediate[ + utilPromisify.custom + ] = function promisifiedSetImmediate(arg) { + return new _global.Promise(function setImmediateExecutor( + resolve + ) { + addTimer(clock, { + func: resolve, + args: [arg], + immediate: true + }); + }); + }; + } + + clock.clearImmediate = function clearImmediate(timerId) { + return clearTimer(clock, timerId, "Immediate"); + }; + } + + clock.countTimers = function countTimers() { + return ( + Object.keys(clock.timers || {}).length + + (clock.jobs || []).length + ); + }; + + clock.requestAnimationFrame = function requestAnimationFrame(func) { + var result = addTimer(clock, { + func: func, + delay: getTimeToNextFrame(), + args: [clock.now + getTimeToNextFrame()], + animation: true + }); + + return result.id || result; + }; + + clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) { + return clearTimer(clock, timerId, "AnimationFrame"); + }; + + clock.runMicrotasks = function runMicrotasks() { + runJobs(clock); + }; + + function doTick(tickValue, isAsync, resolve, reject) { + var msFloat = + typeof tickValue === "number" + ? tickValue + : parseTime(tickValue); + var ms = Math.floor(msFloat); + var remainder = nanoRemainder(msFloat); + var nanosTotal = nanos + remainder; + var tickTo = clock.now + ms; + + if (msFloat < 0) { + throw new TypeError("Negative ticks are not supported"); + } + + // adjust for positive overflow + if (nanosTotal >= 1e6) { + tickTo += 1; + nanosTotal -= 1e6; + } + + nanos = nanosTotal; + var tickFrom = clock.now; + var previous = clock.now; + var timer, + firstException, + oldNow, + nextPromiseTick, + compensationCheck, + postTimerCall; + + clock.duringTick = true; + + // perform microtasks + oldNow = clock.now; + runJobs(clock); + if (oldNow !== clock.now) { + // compensate for any setSystemTime() call during microtask callback + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + } + + function doTickInner() { + // perform each timer in the requested range + timer = firstTimerInRange(clock, tickFrom, tickTo); + // eslint-disable-next-line no-unmodified-loop-condition + while (timer && tickFrom <= tickTo) { + if (clock.timers[timer.id]) { + tickFrom = timer.callAt; + clock.now = timer.callAt; + oldNow = clock.now; + try { + runJobs(clock); + callTimer(clock, timer); + } catch (e) { + firstException = firstException || e; + } + + if (isAsync) { + // finish up after native setImmediate callback to allow + // all native es6 promises to process their callbacks after + // each timer fires. + originalSetTimeout(nextPromiseTick); + return; + } + + compensationCheck(); + } + + postTimerCall(); + } + + // perform process.nextTick()s again + oldNow = clock.now; + runJobs(clock); + if (oldNow !== clock.now) { + // compensate for any setSystemTime() call during process.nextTick() callback + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + } + clock.duringTick = false; + + // corner case: during runJobs new timers were scheduled which could be in the range [clock.now, tickTo] + timer = firstTimerInRange(clock, tickFrom, tickTo); + if (timer) { + try { + clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range + } catch (e) { + firstException = firstException || e; + } + } else { + // no timers remaining in the requested range: move the clock all the way to the end + clock.now = tickTo; + + // update nanos + nanos = nanosTotal; + } + if (firstException) { + throw firstException; + } + + if (isAsync) { + resolve(clock.now); + } else { + return clock.now; + } + } + + nextPromiseTick = + isAsync && + function() { + try { + compensationCheck(); + postTimerCall(); + doTickInner(); + } catch (e) { + reject(e); + } + }; + + compensationCheck = function() { + // compensate for any setSystemTime() call during timer callback + if (oldNow !== clock.now) { + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + previous += clock.now - oldNow; + } + }; + + postTimerCall = function() { + timer = firstTimerInRange(clock, previous, tickTo); + previous = tickFrom; + }; + + return doTickInner(); + } + + /** + * @param {tickValue} {String|Number} number of milliseconds or a human-readable value like "01:11:15" + */ + clock.tick = function tick(tickValue) { + return doTick(tickValue, false); + }; + + if (typeof _global.Promise !== "undefined") { + clock.tickAsync = function tickAsync(ms) { + return new _global.Promise(function(resolve, reject) { + originalSetTimeout(function() { + try { + doTick(ms, true, resolve, reject); + } catch (e) { + reject(e); + } + }); + }); + }; + } + + clock.next = function next() { + runJobs(clock); + var timer = firstTimer(clock); + if (!timer) { + return clock.now; + } + + clock.duringTick = true; + try { + clock.now = timer.callAt; + callTimer(clock, timer); + runJobs(clock); + return clock.now; + } finally { + clock.duringTick = false; + } + }; + + if (typeof _global.Promise !== "undefined") { + clock.nextAsync = function nextAsync() { + return new _global.Promise(function(resolve, reject) { + originalSetTimeout(function() { + try { + var timer = firstTimer(clock); + if (!timer) { + resolve(clock.now); + return; + } + + var err; + clock.duringTick = true; + clock.now = timer.callAt; + try { + callTimer(clock, timer); + } catch (e) { + err = e; + } + clock.duringTick = false; + + originalSetTimeout(function() { + if (err) { + reject(err); + } else { + resolve(clock.now); + } + }); + } catch (e) { + reject(e); + } + }); + }); + }; + } + + clock.runAll = function runAll() { + var numTimers, i; + runJobs(clock); + for (i = 0; i < clock.loopLimit; i++) { + if (!clock.timers) { + return clock.now; + } + + numTimers = keys(clock.timers).length; + if (numTimers === 0) { + return clock.now; + } + + clock.next(); + } + + throw new Error( + "Aborting after running " + + clock.loopLimit + + " timers, assuming an infinite loop!" + ); + }; + + clock.runToFrame = function runToFrame() { + return clock.tick(getTimeToNextFrame()); + }; + + if (typeof _global.Promise !== "undefined") { + clock.runAllAsync = function runAllAsync() { + return new _global.Promise(function(resolve, reject) { + var i = 0; + function doRun() { + originalSetTimeout(function() { + try { + var numTimers; + if (i < clock.loopLimit) { + if (!clock.timers) { + resolve(clock.now); + return; + } + + numTimers = Object.keys(clock.timers) + .length; + if (numTimers === 0) { + resolve(clock.now); + return; + } + + clock.next(); + + i++; + + doRun(); + return; + } + + reject( + new Error( + "Aborting after running " + + clock.loopLimit + + " timers, assuming an infinite loop!" + ) + ); + } catch (e) { + reject(e); + } + }); + } + doRun(); + }); + }; + } + + clock.runToLast = function runToLast() { + var timer = lastTimer(clock); + if (!timer) { + runJobs(clock); + return clock.now; + } + + return clock.tick(timer.callAt - clock.now); + }; + + if (typeof _global.Promise !== "undefined") { + clock.runToLastAsync = function runToLastAsync() { + return new _global.Promise(function(resolve, reject) { + originalSetTimeout(function() { + try { + var timer = lastTimer(clock); + if (!timer) { + resolve(clock.now); + } + + resolve(clock.tickAsync(timer.callAt)); + } catch (e) { + reject(e); + } + }); + }); + }; + } + + clock.reset = function reset() { + nanos = 0; + clock.timers = {}; + clock.jobs = []; + clock.now = start; + }; + + clock.setSystemTime = function setSystemTime(systemTime) { + // determine time difference + var newNow = getEpoch(systemTime); + var difference = newNow - clock.now; + var id, timer; + + adjustedSystemTime[0] = adjustedSystemTime[0] + difference; + adjustedSystemTime[1] = adjustedSystemTime[1] + nanos; + // update 'system clock' + clock.now = newNow; + nanos = 0; + + // update timers and intervals to keep them stable + for (id in clock.timers) { + if (clock.timers.hasOwnProperty(id)) { + timer = clock.timers[id]; + timer.createdAt += difference; + timer.callAt += difference; + } + } + }; + + if (performancePresent) { + clock.performance = Object.create(null); + + if (hasPerformancePrototype) { + var proto = _global.Performance.prototype; + + Object.getOwnPropertyNames(proto).forEach(function(name) { + if (name.indexOf("getEntries") === 0) { + // match expected return type for getEntries functions + clock.performance[name] = NOOP_ARRAY; + } else { + clock.performance[name] = NOOP; + } + }); + } + + clock.performance.now = function FakeTimersNow() { + var hrt = hrtime(); + var millis = hrt[0] * 1000 + hrt[1] / 1e6; + return millis; + }; + } + + if (hrtimePresent) { + clock.hrtime = hrtime; + } + + return clock; + } + + /** + * @param config {Object} optional config + * @param config.target {Object} the target to install timers in (default `window`) + * @param config.now {number|Date} a number (in milliseconds) or a Date object (default epoch) + * @param config.toFake {string[]} names of the methods that should be faked. + * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll() + * @param config.shouldAdvanceTime {Boolean} tells FakeTimers to increment mocked time automatically (default false) + * @param config.advanceTimeDelta {Number} increment mocked time every <> ms (default: 20ms) + */ + // eslint-disable-next-line complexity + function install(config) { + if ( + arguments.length > 1 || + config instanceof Date || + Array.isArray(config) || + typeof config === "number" + ) { + throw new TypeError( + "FakeTimers.install called with " + + String(config) + + " install requires an object parameter" + ); + } + + // eslint-disable-next-line no-param-reassign + config = typeof config !== "undefined" ? config : {}; + config.shouldAdvanceTime = config.shouldAdvanceTime || false; + config.advanceTimeDelta = config.advanceTimeDelta || 20; + + var i, l; + var target = config.target || _global; + var clock = createClock(config.now, config.loopLimit); + + clock.uninstall = function() { + return uninstall(clock, target, config); + }; + + clock.methods = config.toFake || []; + + if (clock.methods.length === 0) { + // do not fake nextTick by default - GitHub#126 + clock.methods = keys(timers).filter(function(key) { + return key !== "nextTick" && key !== "queueMicrotask"; + }); + } + + for (i = 0, l = clock.methods.length; i < l; i++) { + if (clock.methods[i] === "hrtime") { + if ( + target.process && + typeof target.process.hrtime === "function" + ) { + hijackMethod(target.process, clock.methods[i], clock); + } + } else if (clock.methods[i] === "nextTick") { + if ( + target.process && + typeof target.process.nextTick === "function" + ) { + hijackMethod(target.process, clock.methods[i], clock); + } + } else { + if ( + clock.methods[i] === "setInterval" && + config.shouldAdvanceTime === true + ) { + var intervalTick = doIntervalTick.bind( + null, + clock, + config.advanceTimeDelta + ); + var intervalId = target[clock.methods[i]]( + intervalTick, + config.advanceTimeDelta + ); + clock.attachedInterval = intervalId; + } + hijackMethod(target, clock.methods[i], clock); + } + } + + return clock; + } + + return { + timers: timers, + createClock: createClock, + install: install, + withGlobal: withGlobal + }; +} + +var defaultImplementation = withGlobal(globalObject); + +exports.timers = defaultImplementation.timers; +exports.createClock = defaultImplementation.createClock; +exports.install = defaultImplementation.install; +exports.withGlobal = withGlobal; + +},{"@sinonjs/commons":44,"util":107}],57:[function(require,module,exports){ +"use strict"; + +var ARRAY_TYPES = [ + Array, + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array +]; + +module.exports = ARRAY_TYPES; + +},{}],58:[function(require,module,exports){ +"use strict"; + +var arrayProto = require("@sinonjs/commons").prototypes.array; +var deepEqual = require("./deep-equal").use(createMatcher); // eslint-disable-line no-use-before-define +var every = require("@sinonjs/commons").every; +var functionName = require("@sinonjs/commons").functionName; +var get = require("lodash.get"); +var iterableToString = require("./iterable-to-string"); +var objectProto = require("@sinonjs/commons").prototypes.object; +var typeOf = require("@sinonjs/commons").typeOf; +var valueToString = require("@sinonjs/commons").valueToString; + +var assertMatcher = require("./create-matcher/assert-matcher"); +var assertMethodExists = require("./create-matcher/assert-method-exists"); +var assertType = require("./create-matcher/assert-type"); +var isIterable = require("./create-matcher/is-iterable"); +var isMatcher = require("./create-matcher/is-matcher"); + +var matcherPrototype = require("./create-matcher/matcher-prototype"); + +var arrayIndexOf = arrayProto.indexOf; +var some = arrayProto.some; + +var hasOwnProperty = objectProto.hasOwnProperty; +var objectToString = objectProto.toString; + +var TYPE_MAP = require("./create-matcher/type-map")(createMatcher); // eslint-disable-line no-use-before-define + +/** + * Creates a matcher object for the passed expectation + * + * @alias module:samsam.createMatcher + * @param {*} expectation An expecttation + * @param {string} message A message for the expectation + * @returns {object} A matcher object + */ +function createMatcher(expectation, message) { + var m = Object.create(matcherPrototype); + var type = typeOf(expectation); + + if (message !== undefined && typeof message !== "string") { + throw new TypeError("Message should be a string"); + } + + if (arguments.length > 2) { + throw new TypeError( + "Expected 1 or 2 arguments, received " + arguments.length + ); + } + + if (type in TYPE_MAP) { + TYPE_MAP[type](m, expectation, message); + } else { + m.test = function(actual) { + return deepEqual(actual, expectation); + }; + } + + if (!m.message) { + m.message = "match(" + valueToString(expectation) + ")"; + } + + return m; +} + +createMatcher.isMatcher = isMatcher; + +createMatcher.any = createMatcher(function() { + return true; +}, "any"); + +createMatcher.defined = createMatcher(function(actual) { + return actual !== null && actual !== undefined; +}, "defined"); + +createMatcher.truthy = createMatcher(function(actual) { + return Boolean(actual); +}, "truthy"); + +createMatcher.falsy = createMatcher(function(actual) { + return !actual; +}, "falsy"); + +createMatcher.same = function(expectation) { + return createMatcher(function(actual) { + return expectation === actual; + }, "same(" + valueToString(expectation) + ")"); +}; + +createMatcher.in = function(arrayOfExpectations) { + if (typeOf(arrayOfExpectations) !== "array") { + throw new TypeError("array expected"); + } + + return createMatcher(function(actual) { + return some(arrayOfExpectations, function(expectation) { + return expectation === actual; + }); + }, "in(" + valueToString(arrayOfExpectations) + ")"); +}; + +createMatcher.typeOf = function(type) { + assertType(type, "string", "type"); + return createMatcher(function(actual) { + return typeOf(actual) === type; + }, 'typeOf("' + type + '")'); +}; + +createMatcher.instanceOf = function(type) { + /* istanbul ignore if */ + if ( + typeof Symbol === "undefined" || + typeof Symbol.hasInstance === "undefined" + ) { + assertType(type, "function", "type"); + } else { + assertMethodExists( + type, + Symbol.hasInstance, + "type", + "[Symbol.hasInstance]" + ); + } + return createMatcher(function(actual) { + return actual instanceof type; + }, "instanceOf(" + (functionName(type) || objectToString(type)) + ")"); +}; + +/** + * Creates a property matcher + * + * @private + * @param {Function} propertyTest A function to test the property against a value + * @param {string} messagePrefix A prefix to use for messages generated by the matcher + * @returns {object} A matcher + */ +function createPropertyMatcher(propertyTest, messagePrefix) { + return function(property, value) { + assertType(property, "string", "property"); + var onlyProperty = arguments.length === 1; + var message = messagePrefix + '("' + property + '"'; + if (!onlyProperty) { + message += ", " + valueToString(value); + } + message += ")"; + return createMatcher(function(actual) { + if ( + actual === undefined || + actual === null || + !propertyTest(actual, property) + ) { + return false; + } + return onlyProperty || deepEqual(actual[property], value); + }, message); + }; +} + +createMatcher.has = createPropertyMatcher(function(actual, property) { + if (typeof actual === "object") { + return property in actual; + } + return actual[property] !== undefined; +}, "has"); + +createMatcher.hasOwn = createPropertyMatcher(function(actual, property) { + return hasOwnProperty(actual, property); +}, "hasOwn"); + +createMatcher.hasNested = function(property, value) { + assertType(property, "string", "property"); + var onlyProperty = arguments.length === 1; + var message = 'hasNested("' + property + '"'; + if (!onlyProperty) { + message += ", " + valueToString(value); + } + message += ")"; + return createMatcher(function(actual) { + if ( + actual === undefined || + actual === null || + get(actual, property) === undefined + ) { + return false; + } + return onlyProperty || deepEqual(get(actual, property), value); + }, message); +}; + +var jsonParseResultTypes = { + null: true, + boolean: true, + number: true, + string: true, + object: true, + array: true +}; +createMatcher.json = function(value) { + if (!jsonParseResultTypes[typeOf(value)]) { + throw new TypeError("Value cannot be the result of JSON.parse"); + } + var message = "json(" + JSON.stringify(value, null, " ") + ")"; + return createMatcher(function(actual) { + var parsed; + try { + parsed = JSON.parse(actual); + } catch (e) { + return false; + } + return deepEqual(parsed, value); + }, message); +}; + +createMatcher.every = function(predicate) { + assertMatcher(predicate); + + return createMatcher(function(actual) { + if (typeOf(actual) === "object") { + return every(Object.keys(actual), function(key) { + return predicate.test(actual[key]); + }); + } + + return ( + isIterable(actual) && + every(actual, function(element) { + return predicate.test(element); + }) + ); + }, "every(" + predicate.message + ")"); +}; + +createMatcher.some = function(predicate) { + assertMatcher(predicate); + + return createMatcher(function(actual) { + if (typeOf(actual) === "object") { + return !every(Object.keys(actual), function(key) { + return !predicate.test(actual[key]); + }); + } + + return ( + isIterable(actual) && + !every(actual, function(element) { + return !predicate.test(element); + }) + ); + }, "some(" + predicate.message + ")"); +}; + +createMatcher.array = createMatcher.typeOf("array"); + +createMatcher.array.deepEquals = function(expectation) { + return createMatcher(function(actual) { + // Comparing lengths is the fastest way to spot a difference before iterating through every item + var sameLength = actual.length === expectation.length; + return ( + typeOf(actual) === "array" && + sameLength && + every(actual, function(element, index) { + var expected = expectation[index]; + return typeOf(expected) === "array" && + typeOf(element) === "array" + ? createMatcher.array.deepEquals(expected).test(element) + : deepEqual(expected, element); + }) + ); + }, "deepEquals([" + iterableToString(expectation) + "])"); +}; + +createMatcher.array.startsWith = function(expectation) { + return createMatcher(function(actual) { + return ( + typeOf(actual) === "array" && + every(expectation, function(expectedElement, index) { + return actual[index] === expectedElement; + }) + ); + }, "startsWith([" + iterableToString(expectation) + "])"); +}; + +createMatcher.array.endsWith = function(expectation) { + return createMatcher(function(actual) { + // This indicates the index in which we should start matching + var offset = actual.length - expectation.length; + + return ( + typeOf(actual) === "array" && + every(expectation, function(expectedElement, index) { + return actual[offset + index] === expectedElement; + }) + ); + }, "endsWith([" + iterableToString(expectation) + "])"); +}; + +createMatcher.array.contains = function(expectation) { + return createMatcher(function(actual) { + return ( + typeOf(actual) === "array" && + every(expectation, function(expectedElement) { + return arrayIndexOf(actual, expectedElement) !== -1; + }) + ); + }, "contains([" + iterableToString(expectation) + "])"); +}; + +createMatcher.map = createMatcher.typeOf("map"); + +createMatcher.map.deepEquals = function mapDeepEquals(expectation) { + return createMatcher(function(actual) { + // Comparing lengths is the fastest way to spot a difference before iterating through every item + var sameLength = actual.size === expectation.size; + return ( + typeOf(actual) === "map" && + sameLength && + every(actual, function(element, key) { + return expectation.has(key) && expectation.get(key) === element; + }) + ); + }, "deepEquals(Map[" + iterableToString(expectation) + "])"); +}; + +createMatcher.map.contains = function mapContains(expectation) { + return createMatcher(function(actual) { + return ( + typeOf(actual) === "map" && + every(expectation, function(element, key) { + return actual.has(key) && actual.get(key) === element; + }) + ); + }, "contains(Map[" + iterableToString(expectation) + "])"); +}; + +createMatcher.set = createMatcher.typeOf("set"); + +createMatcher.set.deepEquals = function setDeepEquals(expectation) { + return createMatcher(function(actual) { + // Comparing lengths is the fastest way to spot a difference before iterating through every item + var sameLength = actual.size === expectation.size; + return ( + typeOf(actual) === "set" && + sameLength && + every(actual, function(element) { + return expectation.has(element); + }) + ); + }, "deepEquals(Set[" + iterableToString(expectation) + "])"); +}; + +createMatcher.set.contains = function setContains(expectation) { + return createMatcher(function(actual) { + return ( + typeOf(actual) === "set" && + every(expectation, function(element) { + return actual.has(element); + }) + ); + }, "contains(Set[" + iterableToString(expectation) + "])"); +}; + +createMatcher.bool = createMatcher.typeOf("boolean"); +createMatcher.number = createMatcher.typeOf("number"); +createMatcher.string = createMatcher.typeOf("string"); +createMatcher.object = createMatcher.typeOf("object"); +createMatcher.func = createMatcher.typeOf("function"); +createMatcher.regexp = createMatcher.typeOf("regexp"); +createMatcher.date = createMatcher.typeOf("date"); +createMatcher.symbol = createMatcher.typeOf("symbol"); + +module.exports = createMatcher; + +},{"./create-matcher/assert-matcher":59,"./create-matcher/assert-method-exists":60,"./create-matcher/assert-type":61,"./create-matcher/is-iterable":62,"./create-matcher/is-matcher":63,"./create-matcher/matcher-prototype":65,"./create-matcher/type-map":66,"./deep-equal":67,"./iterable-to-string":80,"@sinonjs/commons":44,"lodash.get":89}],59:[function(require,module,exports){ +"use strict"; + +var isMatcher = require("./is-matcher"); + +/** + * Throws a TypeError when `value` is not a matcher + * + * @private + * @param {*} value The value to examine + */ +function assertMatcher(value) { + if (!isMatcher(value)) { + throw new TypeError("Matcher expected"); + } +} + +module.exports = assertMatcher; + +},{"./is-matcher":63}],60:[function(require,module,exports){ +"use strict"; + +/** + * Throws a TypeError when expected method doesn't exist + * + * @private + * @param {*} value A value to examine + * @param {string} method The name of the method to look for + * @param {name} name A name to use for the error message + * @param {string} methodPath The name of the method to use for error messages + * @throws {TypeError} When the method doesn't exist + */ +function assertMethodExists(value, method, name, methodPath) { + if (value[method] === null || value[method] === undefined) { + throw new TypeError( + "Expected " + name + " to have method " + methodPath + ); + } +} + +module.exports = assertMethodExists; + +},{}],61:[function(require,module,exports){ +"use strict"; + +var typeOf = require("@sinonjs/commons").typeOf; + +/** + * Ensures that value is of type + * + * @private + * @param {*} value A value to examine + * @param {string} type A basic JavaScript type to compare to, e.g. "object", "string" + * @param {string} name A string to use for the error message + * @throws {TypeError} If value is not of the expected type + * @returns {undefined} + */ +function assertType(value, type, name) { + var actual = typeOf(value); + if (actual !== type) { + throw new TypeError( + "Expected type of " + + name + + " to be " + + type + + ", but was " + + actual + ); + } +} + +module.exports = assertType; + +},{"@sinonjs/commons":44}],62:[function(require,module,exports){ +"use strict"; + +var typeOf = require("@sinonjs/commons").typeOf; + +/** + * Returns `true` for iterables + * + * @private + * @param {*} value A value to examine + * @returns {boolean} Returns `true` when `value` looks like an iterable + */ +function isIterable(value) { + return Boolean(value) && typeOf(value.forEach) === "function"; +} + +module.exports = isIterable; + +},{"@sinonjs/commons":44}],63:[function(require,module,exports){ +"use strict"; + +var isPrototypeOf = require("@sinonjs/commons").prototypes.object.isPrototypeOf; + +var matcherPrototype = require("./matcher-prototype"); + +/** + * Returns `true` when `object` is a matcher + * + * @private + * @param {*} object A value to examine + * @returns {boolean} Returns `true` when `object` is a matcher + */ +function isMatcher(object) { + return isPrototypeOf(matcherPrototype, object); +} + +module.exports = isMatcher; + +},{"./matcher-prototype":65,"@sinonjs/commons":44}],64:[function(require,module,exports){ +"use strict"; + +var every = require("@sinonjs/commons").prototypes.array.every; +var concat = require("@sinonjs/commons").prototypes.array.concat; +var typeOf = require("@sinonjs/commons").typeOf; + +var deepEqualFactory = require("../deep-equal").use; + +var isMatcher = require("./is-matcher"); + +var keys = Object.keys; +var getOwnPropertySymbols = Object.getOwnPropertySymbols; + +/** + * Matches `actual` with `expectation` + * + * @private + * @param {*} actual A value to examine + * @param {object} expectation An object with properties to match on + * @param {object} matcher A matcher to use for comparison + * @returns {boolean} Returns true when `actual` matches all properties in `expectation` + */ +function matchObject(actual, expectation, matcher) { + var deepEqual = deepEqualFactory(matcher); + if (actual === null || actual === undefined) { + return false; + } + + var expectedKeys = keys(expectation); + /* istanbul ignore else: cannot collect coverage for engine that doesn't support Symbol */ + if (typeOf(getOwnPropertySymbols) === "function") { + expectedKeys = concat(expectedKeys, getOwnPropertySymbols(expectation)); + } + + return every(expectedKeys, function(key) { + var exp = expectation[key]; + var act = actual[key]; + + if (isMatcher(exp)) { + if (!exp.test(act)) { + return false; + } + } else if (typeOf(exp) === "object") { + if (!matchObject(act, exp, matcher)) { + return false; + } + } else if (!deepEqual(act, exp)) { + return false; + } + + return true; + }); +} + +module.exports = matchObject; + +},{"../deep-equal":67,"./is-matcher":63,"@sinonjs/commons":44}],65:[function(require,module,exports){ +"use strict"; + +var matcherPrototype = { + toString: function() { + return this.message; + } +}; + +matcherPrototype.or = function(valueOrMatcher) { + var createMatcher = require("../create-matcher"); + var isMatcher = createMatcher.isMatcher; + + if (!arguments.length) { + throw new TypeError("Matcher expected"); + } + + var m2 = isMatcher(valueOrMatcher) + ? valueOrMatcher + : createMatcher(valueOrMatcher); + var m1 = this; + var or = Object.create(matcherPrototype); + or.test = function(actual) { + return m1.test(actual) || m2.test(actual); + }; + or.message = m1.message + ".or(" + m2.message + ")"; + return or; +}; + +matcherPrototype.and = function(valueOrMatcher) { + var createMatcher = require("../create-matcher"); + var isMatcher = createMatcher.isMatcher; + + if (!arguments.length) { + throw new TypeError("Matcher expected"); + } + + var m2 = isMatcher(valueOrMatcher) + ? valueOrMatcher + : createMatcher(valueOrMatcher); + var m1 = this; + var and = Object.create(matcherPrototype); + and.test = function(actual) { + return m1.test(actual) && m2.test(actual); + }; + and.message = m1.message + ".and(" + m2.message + ")"; + return and; +}; + +module.exports = matcherPrototype; + +},{"../create-matcher":58}],66:[function(require,module,exports){ +"use strict"; + +var functionName = require("@sinonjs/commons").functionName; +var join = require("@sinonjs/commons").prototypes.array.join; +var map = require("@sinonjs/commons").prototypes.array.map; +var stringIndexOf = require("@sinonjs/commons").prototypes.string.indexOf; +var valueToString = require("@sinonjs/commons").valueToString; + +var matchObject = require("./match-object"); + +var createTypeMap = function(match) { + return { + function: function(m, expectation, message) { + m.test = expectation; + m.message = message || "match(" + functionName(expectation) + ")"; + }, + number: function(m, expectation) { + m.test = function(actual) { + // we need type coercion here + return expectation == actual; // eslint-disable-line eqeqeq + }; + }, + object: function(m, expectation) { + var array = []; + + if (typeof expectation.test === "function") { + m.test = function(actual) { + return expectation.test(actual) === true; + }; + m.message = "match(" + functionName(expectation.test) + ")"; + return m; + } + + array = map(Object.keys(expectation), function(key) { + return key + ": " + valueToString(expectation[key]); + }); + + m.test = function(actual) { + return matchObject(actual, expectation, match); + }; + m.message = "match(" + join(array, ", ") + ")"; + + return m; + }, + regexp: function(m, expectation) { + m.test = function(actual) { + return typeof actual === "string" && expectation.test(actual); + }; + }, + string: function(m, expectation) { + m.test = function(actual) { + return ( + typeof actual === "string" && + stringIndexOf(actual, expectation) !== -1 + ); + }; + m.message = 'match("' + expectation + '")'; + } + }; +}; + +module.exports = createTypeMap; + +},{"./match-object":64,"@sinonjs/commons":44}],67:[function(require,module,exports){ +"use strict"; + +var valueToString = require("@sinonjs/commons").valueToString; +var className = require("@sinonjs/commons").className; +var typeOf = require("@sinonjs/commons").typeOf; +var arrayProto = require("@sinonjs/commons").prototypes.array; +var objectProto = require("@sinonjs/commons").prototypes.object; +var mapForEach = require("@sinonjs/commons").prototypes.map.forEach; + +var getClass = require("./get-class"); +var identical = require("./identical"); +var isArguments = require("./is-arguments"); +var isDate = require("./is-date"); +var isElement = require("./is-element"); +var isMap = require("./is-map"); +var isNaN = require("./is-nan"); +var isObject = require("./is-object"); +var isSet = require("./is-set"); +var isSubset = require("./is-subset"); + +var concat = arrayProto.concat; +var every = arrayProto.every; +var push = arrayProto.push; + +var getTime = Date.prototype.getTime; +var hasOwnProperty = objectProto.hasOwnProperty; +var indexOf = arrayProto.indexOf; +var keys = Object.keys; +var getOwnPropertySymbols = Object.getOwnPropertySymbols; + +/** + * Deep equal comparison. Two values are "deep equal" when: + * + * - They are equal, according to samsam.identical + * - They are both date objects representing the same time + * - They are both arrays containing elements that are all deepEqual + * - They are objects with the same set of properties, and each property + * in ``actual`` is deepEqual to the corresponding property in ``expectation`` + * + * Supports cyclic objects. + * + * @alias module:samsam.deepEqual + * @param {*} actual The object to examine + * @param {*} expectation The object actual is expected to be equal to + * @param {object} match A value to match on + * @returns {boolean} Returns true when actual and expectation are considered equal + */ +function deepEqualCyclic(actual, expectation, match) { + // used for cyclic comparison + // contain already visited objects + var actualObjects = []; + var expectationObjects = []; + // contain pathes (position in the object structure) + // of the already visited objects + // indexes same as in objects arrays + var actualPaths = []; + var expectationPaths = []; + // contains combinations of already compared objects + // in the manner: { "$1['ref']$2['ref']": true } + var compared = {}; + + // does the recursion for the deep equal check + // eslint-disable-next-line complexity + return (function deepEqual( + actualObj, + expectationObj, + actualPath, + expectationPath + ) { + // If both are matchers they must be the same instance in order to be + // considered equal If we didn't do that we would end up running one + // matcher against the other + if (match && match.isMatcher(expectationObj)) { + if (match.isMatcher(actualObj)) { + return actualObj === expectationObj; + } + return expectationObj.test(actualObj); + } + + var actualType = typeof actualObj; + var expectationType = typeof expectationObj; + + if ( + actualObj === expectationObj || + isNaN(actualObj) || + isNaN(expectationObj) || + actualObj === null || + expectationObj === null || + actualObj === undefined || + expectationObj === undefined || + actualType !== "object" || + expectationType !== "object" + ) { + return identical(actualObj, expectationObj); + } + + // Elements are only equal if identical(expected, actual) + if (isElement(actualObj) || isElement(expectationObj)) { + return false; + } + + var isActualDate = isDate(actualObj); + var isExpectationDate = isDate(expectationObj); + if (isActualDate || isExpectationDate) { + if ( + !isActualDate || + !isExpectationDate || + getTime.call(actualObj) !== getTime.call(expectationObj) + ) { + return false; + } + } + + if (actualObj instanceof RegExp && expectationObj instanceof RegExp) { + if (valueToString(actualObj) !== valueToString(expectationObj)) { + return false; + } + } + + if (actualObj instanceof Error && expectationObj instanceof Error) { + return actualObj === expectationObj; + } + + var actualClass = getClass(actualObj); + var expectationClass = getClass(expectationObj); + var actualKeys = keys(actualObj); + var expectationKeys = keys(expectationObj); + var actualName = className(actualObj); + var expectationName = className(expectationObj); + var expectationSymbols = + typeOf(getOwnPropertySymbols) === "function" + ? getOwnPropertySymbols(expectationObj) + : /* istanbul ignore next: cannot collect coverage for engine that doesn't support Symbol */ + []; + var expectationKeysAndSymbols = concat( + expectationKeys, + expectationSymbols + ); + + if (isArguments(actualObj) || isArguments(expectationObj)) { + if (actualObj.length !== expectationObj.length) { + return false; + } + } else { + if ( + actualType !== expectationType || + actualClass !== expectationClass || + actualKeys.length !== expectationKeys.length || + (actualName && + expectationName && + actualName !== expectationName) + ) { + return false; + } + } + + if (isSet(actualObj) || isSet(expectationObj)) { + if ( + !isSet(actualObj) || + !isSet(expectationObj) || + actualObj.size !== expectationObj.size + ) { + return false; + } + + return isSubset(actualObj, expectationObj, deepEqual); + } + + if (isMap(actualObj) || isMap(expectationObj)) { + if ( + !isMap(actualObj) || + !isMap(expectationObj) || + actualObj.size !== expectationObj.size + ) { + return false; + } + + var mapsDeeplyEqual = true; + mapForEach(actualObj, function(value, key) { + mapsDeeplyEqual = + mapsDeeplyEqual && + deepEqualCyclic(value, expectationObj.get(key)); + }); + + return mapsDeeplyEqual; + } + + return every(expectationKeysAndSymbols, function(key) { + if (!hasOwnProperty(actualObj, key)) { + return false; + } + + var actualValue = actualObj[key]; + var expectationValue = expectationObj[key]; + var actualObject = isObject(actualValue); + var expectationObject = isObject(expectationValue); + // determines, if the objects were already visited + // (it's faster to check for isObject first, than to + // get -1 from getIndex for non objects) + var actualIndex = actualObject + ? indexOf(actualObjects, actualValue) + : -1; + var expectationIndex = expectationObject + ? indexOf(expectationObjects, expectationValue) + : -1; + // determines the new paths of the objects + // - for non cyclic objects the current path will be extended + // by current property name + // - for cyclic objects the stored path is taken + var newActualPath = + actualIndex !== -1 + ? actualPaths[actualIndex] + : actualPath + "[" + JSON.stringify(key) + "]"; + var newExpectationPath = + expectationIndex !== -1 + ? expectationPaths[expectationIndex] + : expectationPath + "[" + JSON.stringify(key) + "]"; + var combinedPath = newActualPath + newExpectationPath; + + // stop recursion if current objects are already compared + if (compared[combinedPath]) { + return true; + } + + // remember the current objects and their paths + if (actualIndex === -1 && actualObject) { + push(actualObjects, actualValue); + push(actualPaths, newActualPath); + } + if (expectationIndex === -1 && expectationObject) { + push(expectationObjects, expectationValue); + push(expectationPaths, newExpectationPath); + } + + // remember that the current objects are already compared + if (actualObject && expectationObject) { + compared[combinedPath] = true; + } + + // End of cyclic logic + + // neither actualValue nor expectationValue is a cycle + // continue with next level + return deepEqual( + actualValue, + expectationValue, + newActualPath, + newExpectationPath + ); + }); + })(actual, expectation, "$1", "$2"); +} + +deepEqualCyclic.use = function(match) { + return function deepEqual(a, b) { + return deepEqualCyclic(a, b, match); + }; +}; + +module.exports = deepEqualCyclic; + +},{"./get-class":68,"./identical":69,"./is-arguments":70,"./is-date":72,"./is-element":73,"./is-map":74,"./is-nan":75,"./is-object":77,"./is-set":78,"./is-subset":79,"@sinonjs/commons":44}],68:[function(require,module,exports){ +"use strict"; + +var toString = require("@sinonjs/commons").prototypes.object.toString; + +/** + * Returns the internal `Class` by calling `Object.prototype.toString` + * with the provided value as `this`. Return value is a `String`, naming the + * internal class, e.g. "Array" + * + * @private + * @param {*} value - Any value + * @returns {string} - A string representation of the `Class` of `value` + */ +function getClass(value) { + return toString(value).split(/[ \]]/)[1]; +} + +module.exports = getClass; + +},{"@sinonjs/commons":44}],69:[function(require,module,exports){ +"use strict"; + +var isNaN = require("./is-nan"); +var isNegZero = require("./is-neg-zero"); + +/** + * Strict equality check according to EcmaScript Harmony's `egal`. + * + * **From the Harmony wiki:** + * > An `egal` function simply makes available the internal `SameValue` function + * > from section 9.12 of the ES5 spec. If two values are egal, then they are not + * > observably distinguishable. + * + * `identical` returns `true` when `===` is `true`, except for `-0` and + * `+0`, where it returns `false`. Additionally, it returns `true` when + * `NaN` is compared to itself. + * + * @alias module:samsam.identical + * @param {*} obj1 The first value to compare + * @param {*} obj2 The second value to compare + * @returns {boolean} Returns `true` when the objects are *egal*, `false` otherwise + */ +function identical(obj1, obj2) { + if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) { + return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2); + } + + return false; +} + +module.exports = identical; + +},{"./is-nan":75,"./is-neg-zero":76}],70:[function(require,module,exports){ +"use strict"; + +var getClass = require("./get-class"); + +/** + * Returns `true` when `object` is an `arguments` object, `false` otherwise + * + * @alias module:samsam.isArguments + * @param {*} object - The object to examine + * @returns {boolean} `true` when `object` is an `arguments` object + */ +function isArguments(object) { + return getClass(object) === "Arguments"; +} + +module.exports = isArguments; + +},{"./get-class":68}],71:[function(require,module,exports){ +"use strict"; + +var functionName = require("@sinonjs/commons").functionName; +var indexOf = require("@sinonjs/commons").prototypes.array.indexOf; +var map = require("@sinonjs/commons").prototypes.array.map; +var ARRAY_TYPES = require("./array-types"); +var type = require("type-detect"); + +/** + * Returns `true` when `object` is an array type, `false` otherwise + * + * @param {*} object - The object to examine + * @returns {boolean} `true` when `object` is an array type + * @private + */ +function isArrayType(object) { + return indexOf(map(ARRAY_TYPES, functionName), type(object)) !== -1; +} + +module.exports = isArrayType; + +},{"./array-types":57,"@sinonjs/commons":44,"type-detect":104}],72:[function(require,module,exports){ +"use strict"; + +/** + * Returns `true` when `value` is an instance of Date + * + * @private + * @param {Date} value The value to examine + * @returns {boolean} `true` when `value` is an instance of Date + */ +function isDate(value) { + return value instanceof Date; +} + +module.exports = isDate; + +},{}],73:[function(require,module,exports){ +"use strict"; + +var div = typeof document !== "undefined" && document.createElement("div"); + +/** + * Returns `true` when `object` is a DOM element node. + * + * Unlike Underscore.js/lodash, this function will return `false` if `object` + * is an *element-like* object, i.e. a regular object with a `nodeType` + * property that holds the value `1`. + * + * @alias module:samsam.isElement + * @param {object} object The object to examine + * @returns {boolean} Returns `true` for DOM element nodes + */ +function isElement(object) { + if (!object || object.nodeType !== 1 || !div) { + return false; + } + try { + object.appendChild(div); + object.removeChild(div); + } catch (e) { + return false; + } + return true; +} + +module.exports = isElement; + +},{}],74:[function(require,module,exports){ +"use strict"; + +/** + * Returns `true` when `value` is a Map + * + * @param {*} value A value to examine + * @returns {boolean} `true` when `value` is an instance of `Map`, `false` otherwise + * @private + */ +function isMap(value) { + return typeof Map !== "undefined" && value instanceof Map; +} + +module.exports = isMap; + +},{}],75:[function(require,module,exports){ +"use strict"; + +/** + * Compares a `value` to `NaN` + * + * @private + * @param {*} value A value to examine + * @returns {boolean} Returns `true` when `value` is `NaN` + */ +function isNaN(value) { + // Unlike global `isNaN`, this function avoids type coercion + // `typeof` check avoids IE host object issues, hat tip to + // lodash + + // eslint-disable-next-line no-self-compare + return typeof value === "number" && value !== value; +} + +module.exports = isNaN; + +},{}],76:[function(require,module,exports){ +"use strict"; + +/** + * Returns `true` when `value` is `-0` + * + * @alias module:samsam.isNegZero + * @param {*} value A value to examine + * @returns {boolean} Returns `true` when `value` is `-0` + */ +function isNegZero(value) { + return value === 0 && 1 / value === -Infinity; +} + +module.exports = isNegZero; + +},{}],77:[function(require,module,exports){ +"use strict"; + +/** + * Returns `true` when the value is a regular Object and not a specialized Object + * + * This helps speed up deepEqual cyclic checks + * + * The premise is that only Objects are stored in the visited array. + * So if this function returns false, we don't have to do the + * expensive operation of searching for the value in the the array of already + * visited objects + * + * @private + * @param {object} value The object to examine + * @returns {boolean} `true` when the object is a non-specialised object + */ +function isObject(value) { + return ( + typeof value === "object" && + value !== null && + // none of these are collection objects, so we can return false + !(value instanceof Boolean) && + !(value instanceof Date) && + !(value instanceof Error) && + !(value instanceof Number) && + !(value instanceof RegExp) && + !(value instanceof String) + ); +} + +module.exports = isObject; + +},{}],78:[function(require,module,exports){ +"use strict"; + +/** + * Returns `true` when the argument is an instance of Set, `false` otherwise + * + * @alias module:samsam.isSet + * @param {*} val - A value to examine + * @returns {boolean} Returns `true` when the argument is an instance of Set, `false` otherwise + */ +function isSet(val) { + return (typeof Set !== "undefined" && val instanceof Set) || false; +} + +module.exports = isSet; + +},{}],79:[function(require,module,exports){ +"use strict"; + +var forEach = require("@sinonjs/commons").prototypes.set.forEach; + +/** + * Returns `true` when `s1` is a subset of `s2`, `false` otherwise + * + * @private + * @param {Array|Set} s1 The target value + * @param {Array|Set} s2 The containing value + * @param {Function} compare A comparison function, should return `true` when + * values are considered equal + * @returns {boolean} Returns `true` when `s1` is a subset of `s2`, `false`` otherwise + */ +function isSubset(s1, s2, compare) { + var allContained = true; + forEach(s1, function(v1) { + var includes = false; + forEach(s2, function(v2) { + if (compare(v2, v1)) { + includes = true; + } + }); + allContained = allContained && includes; + }); + + return allContained; +} + +module.exports = isSubset; + +},{"@sinonjs/commons":44}],80:[function(require,module,exports){ +"use strict"; + +var slice = require("@sinonjs/commons").prototypes.string.slice; +var typeOf = require("@sinonjs/commons").typeOf; +var valueToString = require("@sinonjs/commons").valueToString; + +/** + * Creates a string represenation of an iterable object + * + * @private + * @param {object} obj The iterable object to stringify + * @returns {string} A string representation + */ +function iterableToString(obj) { + if (typeOf(obj) === "map") { + return mapToString(obj); + } + + return genericIterableToString(obj); +} + +/** + * Creates a string representation of a Map + * + * @private + * @param {Map} map The map to stringify + * @returns {string} A string representation + */ +function mapToString(map) { + var representation = ""; + + // eslint-disable-next-line @sinonjs/no-prototype-methods/no-prototype-methods + map.forEach(function(value, key) { + representation += "[" + stringify(key) + "," + stringify(value) + "],"; + }); + + representation = slice(representation, 0, -1); + return representation; +} + +/** + * Create a string represenation for an iterable + * + * @private + * @param {object} iterable The iterable to stringify + * @returns {string} A string representation + */ +function genericIterableToString(iterable) { + var representation = ""; + + // eslint-disable-next-line @sinonjs/no-prototype-methods/no-prototype-methods + iterable.forEach(function(value) { + representation += stringify(value) + ","; + }); + + representation = slice(representation, 0, -1); + return representation; +} + +/** + * Creates a string representation of the passed `item` + * + * @private + * @param {object} item The item to stringify + * @returns {string} A string representation of `item` + */ +function stringify(item) { + return typeof item === "string" ? "'" + item + "'" : valueToString(item); +} + +module.exports = iterableToString; + +},{"@sinonjs/commons":44}],81:[function(require,module,exports){ +"use strict"; + +var valueToString = require("@sinonjs/commons").valueToString; +var indexOf = require("@sinonjs/commons").prototypes.string.indexOf; +var forEach = require("@sinonjs/commons").prototypes.array.forEach; +var type = require("type-detect"); + +var engineCanCompareMaps = typeof Array.from === "function"; +var deepEqual = require("./deep-equal").use(match); // eslint-disable-line no-use-before-define +var isArrayType = require("./is-array-type"); +var isSubset = require("./is-subset"); +var createMatcher = require("./create-matcher"); + +/** + * Returns true when `array` contains all of `subset` as defined by the `compare` + * argument + * + * @param {Array} array An array to search for a subset + * @param {Array} subset The subset to find in the array + * @param {Function} compare A comparison function + * @returns {boolean} [description] + * @private + */ +function arrayContains(array, subset, compare) { + if (subset.length === 0) { + return true; + } + var i, l, j, k; + for (i = 0, l = array.length; i < l; ++i) { + if (compare(array[i], subset[0])) { + for (j = 0, k = subset.length; j < k; ++j) { + if (i + j >= l) { + return false; + } + if (!compare(array[i + j], subset[j])) { + return false; + } + } + return true; + } + } + return false; +} + +/* eslint-disable complexity */ +/** + * Matches an object with a matcher (or value) + * + * @alias module:samsam.match + * @param {object} object The object candidate to match + * @param {object} matcherOrValue A matcher or value to match against + * @returns {boolean} true when `object` matches `matcherOrValue` + */ +function match(object, matcherOrValue) { + if (matcherOrValue && typeof matcherOrValue.test === "function") { + return matcherOrValue.test(object); + } + + switch (type(matcherOrValue)) { + case "bigint": + case "boolean": + case "number": + case "symbol": + return matcherOrValue === object; + case "function": + return matcherOrValue(object) === true; + case "string": + var notNull = typeof object === "string" || Boolean(object); + return ( + notNull && + indexOf( + valueToString(object).toLowerCase(), + matcherOrValue.toLowerCase() + ) >= 0 + ); + case "null": + return object === null; + case "undefined": + return typeof object === "undefined"; + case "Date": + /* istanbul ignore else */ + if (type(object) === "Date") { + return object.getTime() === matcherOrValue.getTime(); + } + /* istanbul ignore next: this is basically the rest of the function, which is covered */ + break; + case "Array": + case "Int8Array": + case "Uint8Array": + case "Uint8ClampedArray": + case "Int16Array": + case "Uint16Array": + case "Int32Array": + case "Uint32Array": + case "Float32Array": + case "Float64Array": + return ( + isArrayType(matcherOrValue) && + arrayContains(object, matcherOrValue, match) + ); + case "Map": + /* istanbul ignore next: this is covered by a test, that is only run in IE, but we collect coverage information in node*/ + if (!engineCanCompareMaps) { + throw new Error( + "The JavaScript engine does not support Array.from and cannot reliably do value comparison of Map instances" + ); + } + + return ( + type(object) === "Map" && + arrayContains( + Array.from(object), + Array.from(matcherOrValue), + match + ) + ); + default: + break; + } + + switch (type(object)) { + case "null": + return false; + case "Set": + return isSubset(matcherOrValue, object, match); + default: + break; + } + + /* istanbul ignore else */ + if (matcherOrValue && typeof matcherOrValue === "object") { + if (matcherOrValue === object) { + return true; + } + if (typeof object !== "object") { + return false; + } + var prop; + // eslint-disable-next-line guard-for-in + for (prop in matcherOrValue) { + var value = object[prop]; + if ( + typeof value === "undefined" && + typeof object.getAttribute === "function" + ) { + value = object.getAttribute(prop); + } + if ( + matcherOrValue[prop] === null || + typeof matcherOrValue[prop] === "undefined" + ) { + if (value !== matcherOrValue[prop]) { + return false; + } + } else if ( + typeof value === "undefined" || + !deepEqual(value, matcherOrValue[prop]) + ) { + return false; + } + } + return true; + } + + /* istanbul ignore next */ + throw new Error("Matcher was an unknown or unsupported type"); +} +/* eslint-enable complexity */ + +forEach(Object.keys(createMatcher), function(key) { + match[key] = createMatcher[key]; +}); + +module.exports = match; + +},{"./create-matcher":58,"./deep-equal":67,"./is-array-type":71,"./is-subset":79,"@sinonjs/commons":44,"type-detect":104}],82:[function(require,module,exports){ +"use strict"; + +/** + * @module samsam + */ +var identical = require("./identical"); +var isArguments = require("./is-arguments"); +var isElement = require("./is-element"); +var isNegZero = require("./is-neg-zero"); +var isSet = require("./is-set"); +var isMap = require("./is-map"); +var match = require("./match"); +var deepEqualCyclic = require("./deep-equal").use(match); +var createMatcher = require("./create-matcher"); + +module.exports = { + createMatcher: createMatcher, + deepEqual: deepEqualCyclic, + identical: identical, + isArguments: isArguments, + isElement: isElement, + isMap: isMap, + isNegZero: isNegZero, + isSet: isSet, + match: match +}; + +},{"./create-matcher":58,"./deep-equal":67,"./identical":69,"./is-arguments":70,"./is-element":73,"./is-map":74,"./is-neg-zero":76,"./is-set":78,"./match":81}],83:[function(require,module,exports){ +// This is free and unencumbered software released into the public domain. +// See LICENSE.md for more information. + +var encoding = require("./lib/encoding.js"); + +module.exports = { + TextEncoder: encoding.TextEncoder, + TextDecoder: encoding.TextDecoder, +}; + +},{"./lib/encoding.js":85}],84:[function(require,module,exports){ +(function(global) { + 'use strict'; + + if (typeof module !== "undefined" && module.exports) { + module.exports = global; + } + + global["encoding-indexes"] = +{ + "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188], + "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565], + "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]], + "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160], + "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], + "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729], + "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729], + "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119], + "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null], + "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], + "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], + "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312], + "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217], + "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255], + "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], + "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255], + "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], + "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], + "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711], + "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null], + "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], + "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103], + "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], + "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], + "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255], + "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], + "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746], + "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729], + "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255], + "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364] +}; + +// For strict environments where `this` inside the global scope +// is `undefined`, take a pure object instead +}(this || {})); +},{}],85:[function(require,module,exports){ +// This is free and unencumbered software released into the public domain. +// See LICENSE.md for more information. + +/** + * @fileoverview Global |this| required for resolving indexes in node. + * @suppress {globalThis} + */ +(function(global) { + 'use strict'; + + // If we're in node require encoding-indexes and attach it to the global. + if (typeof module !== "undefined" && module.exports && + !global["encoding-indexes"]) { + global["encoding-indexes"] = + require("./encoding-indexes.js")["encoding-indexes"]; + } + + // + // Utilities + // + + /** + * @param {number} a The number to test. + * @param {number} min The minimum value in the range, inclusive. + * @param {number} max The maximum value in the range, inclusive. + * @return {boolean} True if a >= min and a <= max. + */ + function inRange(a, min, max) { + return min <= a && a <= max; + } + + /** + * @param {!Array.<*>} array The array to check. + * @param {*} item The item to look for in the array. + * @return {boolean} True if the item appears in the array. + */ + function includes(array, item) { + return array.indexOf(item) !== -1; + } + + var floor = Math.floor; + + /** + * @param {*} o + * @return {Object} + */ + function ToDictionary(o) { + if (o === undefined) return {}; + if (o === Object(o)) return o; + throw TypeError('Could not convert argument to dictionary'); + } + + /** + * @param {string} string Input string of UTF-16 code units. + * @return {!Array.} Code points. + */ + function stringToCodePoints(string) { + // https://heycam.github.io/webidl/#dfn-obtain-unicode + + // 1. Let S be the DOMString value. + var s = String(string); + + // 2. Let n be the length of S. + var n = s.length; + + // 3. Initialize i to 0. + var i = 0; + + // 4. Initialize U to be an empty sequence of Unicode characters. + var u = []; + + // 5. While i < n: + while (i < n) { + + // 1. Let c be the code unit in S at index i. + var c = s.charCodeAt(i); + + // 2. Depending on the value of c: + + // c < 0xD800 or c > 0xDFFF + if (c < 0xD800 || c > 0xDFFF) { + // Append to U the Unicode character with code point c. + u.push(c); + } + + // 0xDC00 ≤ c ≤ 0xDFFF + else if (0xDC00 <= c && c <= 0xDFFF) { + // Append to U a U+FFFD REPLACEMENT CHARACTER. + u.push(0xFFFD); + } + + // 0xD800 ≤ c ≤ 0xDBFF + else if (0xD800 <= c && c <= 0xDBFF) { + // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT + // CHARACTER. + if (i === n - 1) { + u.push(0xFFFD); + } + // 2. Otherwise, i < n−1: + else { + // 1. Let d be the code unit in S at index i+1. + var d = s.charCodeAt(i + 1); + + // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then: + if (0xDC00 <= d && d <= 0xDFFF) { + // 1. Let a be c & 0x3FF. + var a = c & 0x3FF; + + // 2. Let b be d & 0x3FF. + var b = d & 0x3FF; + + // 3. Append to U the Unicode character with code point + // 2^16+2^10*a+b. + u.push(0x10000 + (a << 10) + b); + + // 4. Set i to i+1. + i += 1; + } + + // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a + // U+FFFD REPLACEMENT CHARACTER. + else { + u.push(0xFFFD); + } + } + } + + // 3. Set i to i+1. + i += 1; + } + + // 6. Return U. + return u; + } + + /** + * @param {!Array.} code_points Array of code points. + * @return {string} string String of UTF-16 code units. + */ + function codePointsToString(code_points) { + var s = ''; + for (var i = 0; i < code_points.length; ++i) { + var cp = code_points[i]; + if (cp <= 0xFFFF) { + s += String.fromCharCode(cp); + } else { + cp -= 0x10000; + s += String.fromCharCode((cp >> 10) + 0xD800, + (cp & 0x3FF) + 0xDC00); + } + } + return s; + } + + + // + // Implementation of Encoding specification + // https://encoding.spec.whatwg.org/ + // + + // + // 4. Terminology + // + + /** + * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive. + * @param {number} a The number to test. + * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive. + */ + function isASCIIByte(a) { + return 0x00 <= a && a <= 0x7F; + } + + /** + * An ASCII code point is a code point in the range U+0000 to + * U+007F, inclusive. + */ + var isASCIICodePoint = isASCIIByte; + + + /** + * End-of-stream is a special token that signifies no more tokens + * are in the stream. + * @const + */ var end_of_stream = -1; + + /** + * A stream represents an ordered sequence of tokens. + * + * @constructor + * @param {!(Array.|Uint8Array)} tokens Array of tokens that provide + * the stream. + */ + function Stream(tokens) { + /** @type {!Array.} */ + this.tokens = [].slice.call(tokens); + // Reversed as push/pop is more efficient than shift/unshift. + this.tokens.reverse(); + } + + Stream.prototype = { + /** + * @return {boolean} True if end-of-stream has been hit. + */ + endOfStream: function() { + return !this.tokens.length; + }, + + /** + * When a token is read from a stream, the first token in the + * stream must be returned and subsequently removed, and + * end-of-stream must be returned otherwise. + * + * @return {number} Get the next token from the stream, or + * end_of_stream. + */ + read: function() { + if (!this.tokens.length) + return end_of_stream; + return this.tokens.pop(); + }, + + /** + * When one or more tokens are prepended to a stream, those tokens + * must be inserted, in given order, before the first token in the + * stream. + * + * @param {(number|!Array.)} token The token(s) to prepend to the + * stream. + */ + prepend: function(token) { + if (Array.isArray(token)) { + var tokens = /**@type {!Array.}*/(token); + while (tokens.length) + this.tokens.push(tokens.pop()); + } else { + this.tokens.push(token); + } + }, + + /** + * When one or more tokens are pushed to a stream, those tokens + * must be inserted, in given order, after the last token in the + * stream. + * + * @param {(number|!Array.)} token The tokens(s) to push to the + * stream. + */ + push: function(token) { + if (Array.isArray(token)) { + var tokens = /**@type {!Array.}*/(token); + while (tokens.length) + this.tokens.unshift(tokens.shift()); + } else { + this.tokens.unshift(token); + } + } + }; + + // + // 5. Encodings + // + + // 5.1 Encoders and decoders + + /** @const */ + var finished = -1; + + /** + * @param {boolean} fatal If true, decoding errors raise an exception. + * @param {number=} opt_code_point Override the standard fallback code point. + * @return {number} The code point to insert on a decoding error. + */ + function decoderError(fatal, opt_code_point) { + if (fatal) + throw TypeError('Decoder error'); + return opt_code_point || 0xFFFD; + } + + /** + * @param {number} code_point The code point that could not be encoded. + * @return {number} Always throws, no value is actually returned. + */ + function encoderError(code_point) { + throw TypeError('The code point ' + code_point + ' could not be encoded.'); + } + + /** @interface */ + function Decoder() {} + Decoder.prototype = { + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point, or |finished|. + */ + handler: function(stream, bite) {} + }; + + /** @interface */ + function Encoder() {} + Encoder.prototype = { + /** + * @param {Stream} stream The stream of code points being encoded. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit, or |finished|. + */ + handler: function(stream, code_point) {} + }; + + // 5.2 Names and labels + + // TODO: Define @typedef for Encoding: {name:string,labels:Array.} + // https://github.com/google/closure-compiler/issues/247 + + /** + * @param {string} label The encoding label. + * @return {?{name:string,labels:Array.}} + */ + function getEncoding(label) { + // 1. Remove any leading and trailing ASCII whitespace from label. + label = String(label).trim().toLowerCase(); + + // 2. If label is an ASCII case-insensitive match for any of the + // labels listed in the table below, return the corresponding + // encoding, and failure otherwise. + if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) { + return label_to_encoding[label]; + } + return null; + } + + /** + * Encodings table: https://encoding.spec.whatwg.org/encodings.json + * @const + * @type {!Array.<{ + * heading: string, + * encodings: Array.<{name:string,labels:Array.}> + * }>} + */ + var encodings = [ + { + "encodings": [ + { + "labels": [ + "unicode-1-1-utf-8", + "utf-8", + "utf8" + ], + "name": "UTF-8" + } + ], + "heading": "The Encoding" + }, + { + "encodings": [ + { + "labels": [ + "866", + "cp866", + "csibm866", + "ibm866" + ], + "name": "IBM866" + }, + { + "labels": [ + "csisolatin2", + "iso-8859-2", + "iso-ir-101", + "iso8859-2", + "iso88592", + "iso_8859-2", + "iso_8859-2:1987", + "l2", + "latin2" + ], + "name": "ISO-8859-2" + }, + { + "labels": [ + "csisolatin3", + "iso-8859-3", + "iso-ir-109", + "iso8859-3", + "iso88593", + "iso_8859-3", + "iso_8859-3:1988", + "l3", + "latin3" + ], + "name": "ISO-8859-3" + }, + { + "labels": [ + "csisolatin4", + "iso-8859-4", + "iso-ir-110", + "iso8859-4", + "iso88594", + "iso_8859-4", + "iso_8859-4:1988", + "l4", + "latin4" + ], + "name": "ISO-8859-4" + }, + { + "labels": [ + "csisolatincyrillic", + "cyrillic", + "iso-8859-5", + "iso-ir-144", + "iso8859-5", + "iso88595", + "iso_8859-5", + "iso_8859-5:1988" + ], + "name": "ISO-8859-5" + }, + { + "labels": [ + "arabic", + "asmo-708", + "csiso88596e", + "csiso88596i", + "csisolatinarabic", + "ecma-114", + "iso-8859-6", + "iso-8859-6-e", + "iso-8859-6-i", + "iso-ir-127", + "iso8859-6", + "iso88596", + "iso_8859-6", + "iso_8859-6:1987" + ], + "name": "ISO-8859-6" + }, + { + "labels": [ + "csisolatingreek", + "ecma-118", + "elot_928", + "greek", + "greek8", + "iso-8859-7", + "iso-ir-126", + "iso8859-7", + "iso88597", + "iso_8859-7", + "iso_8859-7:1987", + "sun_eu_greek" + ], + "name": "ISO-8859-7" + }, + { + "labels": [ + "csiso88598e", + "csisolatinhebrew", + "hebrew", + "iso-8859-8", + "iso-8859-8-e", + "iso-ir-138", + "iso8859-8", + "iso88598", + "iso_8859-8", + "iso_8859-8:1988", + "visual" + ], + "name": "ISO-8859-8" + }, + { + "labels": [ + "csiso88598i", + "iso-8859-8-i", + "logical" + ], + "name": "ISO-8859-8-I" + }, + { + "labels": [ + "csisolatin6", + "iso-8859-10", + "iso-ir-157", + "iso8859-10", + "iso885910", + "l6", + "latin6" + ], + "name": "ISO-8859-10" + }, + { + "labels": [ + "iso-8859-13", + "iso8859-13", + "iso885913" + ], + "name": "ISO-8859-13" + }, + { + "labels": [ + "iso-8859-14", + "iso8859-14", + "iso885914" + ], + "name": "ISO-8859-14" + }, + { + "labels": [ + "csisolatin9", + "iso-8859-15", + "iso8859-15", + "iso885915", + "iso_8859-15", + "l9" + ], + "name": "ISO-8859-15" + }, + { + "labels": [ + "iso-8859-16" + ], + "name": "ISO-8859-16" + }, + { + "labels": [ + "cskoi8r", + "koi", + "koi8", + "koi8-r", + "koi8_r" + ], + "name": "KOI8-R" + }, + { + "labels": [ + "koi8-ru", + "koi8-u" + ], + "name": "KOI8-U" + }, + { + "labels": [ + "csmacintosh", + "mac", + "macintosh", + "x-mac-roman" + ], + "name": "macintosh" + }, + { + "labels": [ + "dos-874", + "iso-8859-11", + "iso8859-11", + "iso885911", + "tis-620", + "windows-874" + ], + "name": "windows-874" + }, + { + "labels": [ + "cp1250", + "windows-1250", + "x-cp1250" + ], + "name": "windows-1250" + }, + { + "labels": [ + "cp1251", + "windows-1251", + "x-cp1251" + ], + "name": "windows-1251" + }, + { + "labels": [ + "ansi_x3.4-1968", + "ascii", + "cp1252", + "cp819", + "csisolatin1", + "ibm819", + "iso-8859-1", + "iso-ir-100", + "iso8859-1", + "iso88591", + "iso_8859-1", + "iso_8859-1:1987", + "l1", + "latin1", + "us-ascii", + "windows-1252", + "x-cp1252" + ], + "name": "windows-1252" + }, + { + "labels": [ + "cp1253", + "windows-1253", + "x-cp1253" + ], + "name": "windows-1253" + }, + { + "labels": [ + "cp1254", + "csisolatin5", + "iso-8859-9", + "iso-ir-148", + "iso8859-9", + "iso88599", + "iso_8859-9", + "iso_8859-9:1989", + "l5", + "latin5", + "windows-1254", + "x-cp1254" + ], + "name": "windows-1254" + }, + { + "labels": [ + "cp1255", + "windows-1255", + "x-cp1255" + ], + "name": "windows-1255" + }, + { + "labels": [ + "cp1256", + "windows-1256", + "x-cp1256" + ], + "name": "windows-1256" + }, + { + "labels": [ + "cp1257", + "windows-1257", + "x-cp1257" + ], + "name": "windows-1257" + }, + { + "labels": [ + "cp1258", + "windows-1258", + "x-cp1258" + ], + "name": "windows-1258" + }, + { + "labels": [ + "x-mac-cyrillic", + "x-mac-ukrainian" + ], + "name": "x-mac-cyrillic" + } + ], + "heading": "Legacy single-byte encodings" + }, + { + "encodings": [ + { + "labels": [ + "chinese", + "csgb2312", + "csiso58gb231280", + "gb2312", + "gb_2312", + "gb_2312-80", + "gbk", + "iso-ir-58", + "x-gbk" + ], + "name": "GBK" + }, + { + "labels": [ + "gb18030" + ], + "name": "gb18030" + } + ], + "heading": "Legacy multi-byte Chinese (simplified) encodings" + }, + { + "encodings": [ + { + "labels": [ + "big5", + "big5-hkscs", + "cn-big5", + "csbig5", + "x-x-big5" + ], + "name": "Big5" + } + ], + "heading": "Legacy multi-byte Chinese (traditional) encodings" + }, + { + "encodings": [ + { + "labels": [ + "cseucpkdfmtjapanese", + "euc-jp", + "x-euc-jp" + ], + "name": "EUC-JP" + }, + { + "labels": [ + "csiso2022jp", + "iso-2022-jp" + ], + "name": "ISO-2022-JP" + }, + { + "labels": [ + "csshiftjis", + "ms932", + "ms_kanji", + "shift-jis", + "shift_jis", + "sjis", + "windows-31j", + "x-sjis" + ], + "name": "Shift_JIS" + } + ], + "heading": "Legacy multi-byte Japanese encodings" + }, + { + "encodings": [ + { + "labels": [ + "cseuckr", + "csksc56011987", + "euc-kr", + "iso-ir-149", + "korean", + "ks_c_5601-1987", + "ks_c_5601-1989", + "ksc5601", + "ksc_5601", + "windows-949" + ], + "name": "EUC-KR" + } + ], + "heading": "Legacy multi-byte Korean encodings" + }, + { + "encodings": [ + { + "labels": [ + "csiso2022kr", + "hz-gb-2312", + "iso-2022-cn", + "iso-2022-cn-ext", + "iso-2022-kr" + ], + "name": "replacement" + }, + { + "labels": [ + "utf-16be" + ], + "name": "UTF-16BE" + }, + { + "labels": [ + "utf-16", + "utf-16le" + ], + "name": "UTF-16LE" + }, + { + "labels": [ + "x-user-defined" + ], + "name": "x-user-defined" + } + ], + "heading": "Legacy miscellaneous encodings" + } + ]; + + // Label to encoding registry. + /** @type {Object.}>} */ + var label_to_encoding = {}; + encodings.forEach(function(category) { + category.encodings.forEach(function(encoding) { + encoding.labels.forEach(function(label) { + label_to_encoding[label] = encoding; + }); + }); + }); + + // Registry of of encoder/decoder factories, by encoding name. + /** @type {Object.} */ + var encoders = {}; + /** @type {Object.} */ + var decoders = {}; + + // + // 6. Indexes + // + + /** + * @param {number} pointer The |pointer| to search for. + * @param {(!Array.|undefined)} index The |index| to search within. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in |index|. + */ + function indexCodePointFor(pointer, index) { + if (!index) return null; + return index[pointer] || null; + } + + /** + * @param {number} code_point The |code point| to search for. + * @param {!Array.} index The |index| to search within. + * @return {?number} The first pointer corresponding to |code point| in + * |index|, or null if |code point| is not in |index|. + */ + function indexPointerFor(code_point, index) { + var pointer = index.indexOf(code_point); + return pointer === -1 ? null : pointer; + } + + /** + * @param {string} name Name of the index. + * @return {(!Array.|!Array.>)} + * */ + function index(name) { + if (!('encoding-indexes' in global)) { + throw Error("Indexes missing." + + " Did you forget to include encoding-indexes.js first?"); + } + return global['encoding-indexes'][name]; + } + + /** + * @param {number} pointer The |pointer| to search for in the gb18030 index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the gb18030 index. + */ + function indexGB18030RangesCodePointFor(pointer) { + // 1. If pointer is greater than 39419 and less than 189000, or + // pointer is greater than 1237575, return null. + if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) + return null; + + // 2. If pointer is 7457, return code point U+E7C7. + if (pointer === 7457) return 0xE7C7; + + // 3. Let offset be the last pointer in index gb18030 ranges that + // is equal to or less than pointer and let code point offset be + // its corresponding code point. + var offset = 0; + var code_point_offset = 0; + var idx = index('gb18030-ranges'); + var i; + for (i = 0; i < idx.length; ++i) { + /** @type {!Array.} */ + var entry = idx[i]; + if (entry[0] <= pointer) { + offset = entry[0]; + code_point_offset = entry[1]; + } else { + break; + } + } + + // 4. Return a code point whose value is code point offset + + // pointer − offset. + return code_point_offset + pointer - offset; + } + + /** + * @param {number} code_point The |code point| to locate in the gb18030 index. + * @return {number} The first pointer corresponding to |code point| in the + * gb18030 index. + */ + function indexGB18030RangesPointerFor(code_point) { + // 1. If code point is U+E7C7, return pointer 7457. + if (code_point === 0xE7C7) return 7457; + + // 2. Let offset be the last code point in index gb18030 ranges + // that is equal to or less than code point and let pointer offset + // be its corresponding pointer. + var offset = 0; + var pointer_offset = 0; + var idx = index('gb18030-ranges'); + var i; + for (i = 0; i < idx.length; ++i) { + /** @type {!Array.} */ + var entry = idx[i]; + if (entry[1] <= code_point) { + offset = entry[1]; + pointer_offset = entry[0]; + } else { + break; + } + } + + // 3. Return a pointer whose value is pointer offset + code point + // − offset. + return pointer_offset + code_point - offset; + } + + /** + * @param {number} code_point The |code_point| to search for in the Shift_JIS + * index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the Shift_JIS index. + */ + function indexShiftJISPointerFor(code_point) { + // 1. Let index be index jis0208 excluding all entries whose + // pointer is in the range 8272 to 8835, inclusive. + shift_jis_index = shift_jis_index || + index('jis0208').map(function(code_point, pointer) { + return inRange(pointer, 8272, 8835) ? null : code_point; + }); + var index_ = shift_jis_index; + + // 2. Return the index pointer for code point in index. + return index_.indexOf(code_point); + } + var shift_jis_index; + + /** + * @param {number} code_point The |code_point| to search for in the big5 + * index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the big5 index. + */ + function indexBig5PointerFor(code_point) { + // 1. Let index be index Big5 excluding all entries whose pointer + big5_index_no_hkscs = big5_index_no_hkscs || + index('big5').map(function(code_point, pointer) { + return (pointer < (0xA1 - 0x81) * 157) ? null : code_point; + }); + var index_ = big5_index_no_hkscs; + + // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or + // U+5345, return the last pointer corresponding to code point in + // index. + if (code_point === 0x2550 || code_point === 0x255E || + code_point === 0x2561 || code_point === 0x256A || + code_point === 0x5341 || code_point === 0x5345) { + return index_.lastIndexOf(code_point); + } + + // 3. Return the index pointer for code point in index. + return indexPointerFor(code_point, index_); + } + var big5_index_no_hkscs; + + // + // 8. API + // + + /** @const */ var DEFAULT_ENCODING = 'utf-8'; + + // 8.1 Interface TextDecoder + + /** + * @constructor + * @param {string=} label The label of the encoding; + * defaults to 'utf-8'. + * @param {Object=} options + */ + function TextDecoder(label, options) { + // Web IDL conventions + if (!(this instanceof TextDecoder)) + throw TypeError('Called as a function. Did you forget \'new\'?'); + label = label !== undefined ? String(label) : DEFAULT_ENCODING; + options = ToDictionary(options); + + // A TextDecoder object has an associated encoding, decoder, + // stream, ignore BOM flag (initially unset), BOM seen flag + // (initially unset), error mode (initially replacement), and do + // not flush flag (initially unset). + + /** @private */ + this._encoding = null; + /** @private @type {?Decoder} */ + this._decoder = null; + /** @private @type {boolean} */ + this._ignoreBOM = false; + /** @private @type {boolean} */ + this._BOMseen = false; + /** @private @type {string} */ + this._error_mode = 'replacement'; + /** @private @type {boolean} */ + this._do_not_flush = false; + + + // 1. Let encoding be the result of getting an encoding from + // label. + var encoding = getEncoding(label); + + // 2. If encoding is failure or replacement, throw a RangeError. + if (encoding === null || encoding.name === 'replacement') + throw RangeError('Unknown encoding: ' + label); + if (!decoders[encoding.name]) { + throw Error('Decoder not present.' + + ' Did you forget to include encoding-indexes.js first?'); + } + + // 3. Let dec be a new TextDecoder object. + var dec = this; + + // 4. Set dec's encoding to encoding. + dec._encoding = encoding; + + // 5. If options's fatal member is true, set dec's error mode to + // fatal. + if (Boolean(options['fatal'])) + dec._error_mode = 'fatal'; + + // 6. If options's ignoreBOM member is true, set dec's ignore BOM + // flag. + if (Boolean(options['ignoreBOM'])) + dec._ignoreBOM = true; + + // For pre-ES5 runtimes: + if (!Object.defineProperty) { + this.encoding = dec._encoding.name.toLowerCase(); + this.fatal = dec._error_mode === 'fatal'; + this.ignoreBOM = dec._ignoreBOM; + } + + // 7. Return dec. + return dec; + } + + if (Object.defineProperty) { + // The encoding attribute's getter must return encoding's name. + Object.defineProperty(TextDecoder.prototype, 'encoding', { + /** @this {TextDecoder} */ + get: function() { return this._encoding.name.toLowerCase(); } + }); + + // The fatal attribute's getter must return true if error mode + // is fatal, and false otherwise. + Object.defineProperty(TextDecoder.prototype, 'fatal', { + /** @this {TextDecoder} */ + get: function() { return this._error_mode === 'fatal'; } + }); + + // The ignoreBOM attribute's getter must return true if ignore + // BOM flag is set, and false otherwise. + Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', { + /** @this {TextDecoder} */ + get: function() { return this._ignoreBOM; } + }); + } + + /** + * @param {BufferSource=} input The buffer of bytes to decode. + * @param {Object=} options + * @return {string} The decoded string. + */ + TextDecoder.prototype.decode = function decode(input, options) { + var bytes; + if (typeof input === 'object' && input instanceof ArrayBuffer) { + bytes = new Uint8Array(input); + } else if (typeof input === 'object' && 'buffer' in input && + input.buffer instanceof ArrayBuffer) { + bytes = new Uint8Array(input.buffer, + input.byteOffset, + input.byteLength); + } else { + bytes = new Uint8Array(0); + } + + options = ToDictionary(options); + + // 1. If the do not flush flag is unset, set decoder to a new + // encoding's decoder, set stream to a new stream, and unset the + // BOM seen flag. + if (!this._do_not_flush) { + this._decoder = decoders[this._encoding.name]({ + fatal: this._error_mode === 'fatal'}); + this._BOMseen = false; + } + + // 2. If options's stream is true, set the do not flush flag, and + // unset the do not flush flag otherwise. + this._do_not_flush = Boolean(options['stream']); + + // 3. If input is given, push a copy of input to stream. + // TODO: Align with spec algorithm - maintain stream on instance. + var input_stream = new Stream(bytes); + + // 4. Let output be a new stream. + var output = []; + + /** @type {?(number|!Array.)} */ + var result; + + // 5. While true: + while (true) { + // 1. Let token be the result of reading from stream. + var token = input_stream.read(); + + // 2. If token is end-of-stream and the do not flush flag is + // set, return output, serialized. + // TODO: Align with spec algorithm. + if (token === end_of_stream) + break; + + // 3. Otherwise, run these subsubsteps: + + // 1. Let result be the result of processing token for decoder, + // stream, output, and error mode. + result = this._decoder.handler(input_stream, token); + + // 2. If result is finished, return output, serialized. + if (result === finished) + break; + + if (result !== null) { + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + + // 3. Otherwise, if result is error, throw a TypeError. + // (Thrown in handler) + + // 4. Otherwise, do nothing. + } + // TODO: Align with spec algorithm. + if (!this._do_not_flush) { + do { + result = this._decoder.handler(input_stream, input_stream.read()); + if (result === finished) + break; + if (result === null) + continue; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } while (!input_stream.endOfStream()); + this._decoder = null; + } + + // A TextDecoder object also has an associated serialize stream + // algorithm... + /** + * @param {!Array.} stream + * @return {string} + * @this {TextDecoder} + */ + function serializeStream(stream) { + // 1. Let token be the result of reading from stream. + // (Done in-place on array, rather than as a stream) + + // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore + // BOM flag and BOM seen flag are unset, run these subsubsteps: + if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) && + !this._ignoreBOM && !this._BOMseen) { + if (stream.length > 0 && stream[0] === 0xFEFF) { + // 1. If token is U+FEFF, set BOM seen flag. + this._BOMseen = true; + stream.shift(); + } else if (stream.length > 0) { + // 2. Otherwise, if token is not end-of-stream, set BOM seen + // flag and append token to stream. + this._BOMseen = true; + } else { + // 3. Otherwise, if token is not end-of-stream, append token + // to output. + // (no-op) + } + } + // 4. Otherwise, return output. + return codePointsToString(stream); + } + + return serializeStream.call(this, output); + }; + + // 8.2 Interface TextEncoder + + /** + * @constructor + * @param {string=} label The label of the encoding. NONSTANDARD. + * @param {Object=} options NONSTANDARD. + */ + function TextEncoder(label, options) { + // Web IDL conventions + if (!(this instanceof TextEncoder)) + throw TypeError('Called as a function. Did you forget \'new\'?'); + options = ToDictionary(options); + + // A TextEncoder object has an associated encoding and encoder. + + /** @private */ + this._encoding = null; + /** @private @type {?Encoder} */ + this._encoder = null; + + // Non-standard + /** @private @type {boolean} */ + this._do_not_flush = false; + /** @private @type {string} */ + this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement'; + + // 1. Let enc be a new TextEncoder object. + var enc = this; + + // 2. Set enc's encoding to UTF-8's encoder. + if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) { + // NONSTANDARD behavior. + label = label !== undefined ? String(label) : DEFAULT_ENCODING; + var encoding = getEncoding(label); + if (encoding === null || encoding.name === 'replacement') + throw RangeError('Unknown encoding: ' + label); + if (!encoders[encoding.name]) { + throw Error('Encoder not present.' + + ' Did you forget to include encoding-indexes.js first?'); + } + enc._encoding = encoding; + } else { + // Standard behavior. + enc._encoding = getEncoding('utf-8'); + + if (label !== undefined && 'console' in global) { + console.warn('TextEncoder constructor called with encoding label, ' + + 'which is ignored.'); + } + } + + // For pre-ES5 runtimes: + if (!Object.defineProperty) + this.encoding = enc._encoding.name.toLowerCase(); + + // 3. Return enc. + return enc; + } + + if (Object.defineProperty) { + // The encoding attribute's getter must return encoding's name. + Object.defineProperty(TextEncoder.prototype, 'encoding', { + /** @this {TextEncoder} */ + get: function() { return this._encoding.name.toLowerCase(); } + }); + } + + /** + * @param {string=} opt_string The string to encode. + * @param {Object=} options + * @return {!Uint8Array} Encoded bytes, as a Uint8Array. + */ + TextEncoder.prototype.encode = function encode(opt_string, options) { + opt_string = opt_string === undefined ? '' : String(opt_string); + options = ToDictionary(options); + + // NOTE: This option is nonstandard. None of the encodings + // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when + // the input is a USVString so streaming is not necessary. + if (!this._do_not_flush) + this._encoder = encoders[this._encoding.name]({ + fatal: this._fatal === 'fatal'}); + this._do_not_flush = Boolean(options['stream']); + + // 1. Convert input to a stream. + var input = new Stream(stringToCodePoints(opt_string)); + + // 2. Let output be a new stream + var output = []; + + /** @type {?(number|!Array.)} */ + var result; + // 3. While true, run these substeps: + while (true) { + // 1. Let token be the result of reading from input. + var token = input.read(); + if (token === end_of_stream) + break; + // 2. Let result be the result of processing token for encoder, + // input, output. + result = this._encoder.handler(input, token); + if (result === finished) + break; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + // TODO: Align with spec algorithm. + if (!this._do_not_flush) { + while (true) { + result = this._encoder.handler(input, input.read()); + if (result === finished) + break; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + this._encoder = null; + } + // 3. If result is finished, convert output into a byte sequence, + // and then return a Uint8Array object wrapping an ArrayBuffer + // containing output. + return new Uint8Array(output); + }; + + + // + // 9. The encoding + // + + // 9.1 utf-8 + + // 9.1.1 utf-8 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function UTF8Decoder(options) { + var fatal = options.fatal; + + // utf-8's decoder's has an associated utf-8 code point, utf-8 + // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8 + // lower boundary (initially 0x80), and a utf-8 upper boundary + // (initially 0xBF). + var /** @type {number} */ utf8_code_point = 0, + /** @type {number} */ utf8_bytes_seen = 0, + /** @type {number} */ utf8_bytes_needed = 0, + /** @type {number} */ utf8_lower_boundary = 0x80, + /** @type {number} */ utf8_upper_boundary = 0xBF; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and utf-8 bytes needed is not 0, + // set utf-8 bytes needed to 0 and return error. + if (bite === end_of_stream && utf8_bytes_needed !== 0) { + utf8_bytes_needed = 0; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 3. If utf-8 bytes needed is 0, based on byte: + if (utf8_bytes_needed === 0) { + + // 0x00 to 0x7F + if (inRange(bite, 0x00, 0x7F)) { + // Return a code point whose value is byte. + return bite; + } + + // 0xC2 to 0xDF + else if (inRange(bite, 0xC2, 0xDF)) { + // 1. Set utf-8 bytes needed to 1. + utf8_bytes_needed = 1; + + // 2. Set UTF-8 code point to byte & 0x1F. + utf8_code_point = bite & 0x1F; + } + + // 0xE0 to 0xEF + else if (inRange(bite, 0xE0, 0xEF)) { + // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0. + if (bite === 0xE0) + utf8_lower_boundary = 0xA0; + // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F. + if (bite === 0xED) + utf8_upper_boundary = 0x9F; + // 3. Set utf-8 bytes needed to 2. + utf8_bytes_needed = 2; + // 4. Set UTF-8 code point to byte & 0xF. + utf8_code_point = bite & 0xF; + } + + // 0xF0 to 0xF4 + else if (inRange(bite, 0xF0, 0xF4)) { + // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90. + if (bite === 0xF0) + utf8_lower_boundary = 0x90; + // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F. + if (bite === 0xF4) + utf8_upper_boundary = 0x8F; + // 3. Set utf-8 bytes needed to 3. + utf8_bytes_needed = 3; + // 4. Set UTF-8 code point to byte & 0x7. + utf8_code_point = bite & 0x7; + } + + // Otherwise + else { + // Return error. + return decoderError(fatal); + } + + // Return continue. + return null; + } + + // 4. If byte is not in the range utf-8 lower boundary to utf-8 + // upper boundary, inclusive, run these substeps: + if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) { + + // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8 + // bytes seen to 0, set utf-8 lower boundary to 0x80, and set + // utf-8 upper boundary to 0xBF. + utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; + utf8_lower_boundary = 0x80; + utf8_upper_boundary = 0xBF; + + // 2. Prepend byte to stream. + stream.prepend(bite); + + // 3. Return error. + return decoderError(fatal); + } + + // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary + // to 0xBF. + utf8_lower_boundary = 0x80; + utf8_upper_boundary = 0xBF; + + // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte & + // 0x3F) + utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F); + + // 7. Increase utf-8 bytes seen by one. + utf8_bytes_seen += 1; + + // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed, + // continue. + if (utf8_bytes_seen !== utf8_bytes_needed) + return null; + + // 9. Let code point be utf-8 code point. + var code_point = utf8_code_point; + + // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes + // seen to 0. + utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; + + // 11. Return a code point whose value is code point. + return code_point; + }; + } + + // 9.1.2 utf-8 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function UTF8Encoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Set count and offset based on the range code point is in: + var count, offset; + // U+0080 to U+07FF, inclusive: + if (inRange(code_point, 0x0080, 0x07FF)) { + // 1 and 0xC0 + count = 1; + offset = 0xC0; + } + // U+0800 to U+FFFF, inclusive: + else if (inRange(code_point, 0x0800, 0xFFFF)) { + // 2 and 0xE0 + count = 2; + offset = 0xE0; + } + // U+10000 to U+10FFFF, inclusive: + else if (inRange(code_point, 0x10000, 0x10FFFF)) { + // 3 and 0xF0 + count = 3; + offset = 0xF0; + } + + // 4. Let bytes be a byte sequence whose first byte is (code + // point >> (6 × count)) + offset. + var bytes = [(code_point >> (6 * count)) + offset]; + + // 5. Run these substeps while count is greater than 0: + while (count > 0) { + + // 1. Set temp to code point >> (6 × (count − 1)). + var temp = code_point >> (6 * (count - 1)); + + // 2. Append to bytes 0x80 | (temp & 0x3F). + bytes.push(0x80 | (temp & 0x3F)); + + // 3. Decrease count by one. + count -= 1; + } + + // 6. Return bytes bytes, in order. + return bytes; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['UTF-8'] = function(options) { + return new UTF8Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['UTF-8'] = function(options) { + return new UTF8Decoder(options); + }; + + // + // 10. Legacy single-byte encodings + // + + // 10.1 single-byte decoder + /** + * @constructor + * @implements {Decoder} + * @param {!Array.} index The encoding index. + * @param {{fatal: boolean}} options + */ + function SingleByteDecoder(index, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 2. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 3. Let code point be the index code point for byte − 0x80 in + // index single-byte. + var code_point = index[bite - 0x80]; + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + }; + } + + // 10.2 single-byte encoder + /** + * @constructor + * @implements {Encoder} + * @param {!Array.} index The encoding index. + * @param {{fatal: boolean}} options + */ + function SingleByteEncoder(index, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index pointer for code point in index + // single-byte. + var pointer = indexPointerFor(code_point, index); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + encoderError(code_point); + + // 5. Return a byte whose value is pointer + 0x80. + return pointer + 0x80; + }; + } + + (function() { + if (!('encoding-indexes' in global)) + return; + encodings.forEach(function(category) { + if (category.heading !== 'Legacy single-byte encodings') + return; + category.encodings.forEach(function(encoding) { + var name = encoding.name; + var idx = index(name.toLowerCase()); + /** @param {{fatal: boolean}} options */ + decoders[name] = function(options) { + return new SingleByteDecoder(idx, options); + }; + /** @param {{fatal: boolean}} options */ + encoders[name] = function(options) { + return new SingleByteEncoder(idx, options); + }; + }); + }); + }()); + + // + // 11. Legacy multi-byte Chinese (simplified) encodings + // + + // 11.1 gbk + + // 11.1.1 gbk decoder + // gbk's decoder is gb18030's decoder. + /** @param {{fatal: boolean}} options */ + decoders['GBK'] = function(options) { + return new GB18030Decoder(options); + }; + + // 11.1.2 gbk encoder + // gbk's encoder is gb18030's encoder with its gbk flag set. + /** @param {{fatal: boolean}} options */ + encoders['GBK'] = function(options) { + return new GB18030Encoder(options, true); + }; + + // 11.2 gb18030 + + // 11.2.1 gb18030 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function GB18030Decoder(options) { + var fatal = options.fatal; + // gb18030's decoder has an associated gb18030 first, gb18030 + // second, and gb18030 third (all initially 0x00). + var /** @type {number} */ gb18030_first = 0x00, + /** @type {number} */ gb18030_second = 0x00, + /** @type {number} */ gb18030_third = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and gb18030 first, gb18030 + // second, and gb18030 third are 0x00, return finished. + if (bite === end_of_stream && gb18030_first === 0x00 && + gb18030_second === 0x00 && gb18030_third === 0x00) { + return finished; + } + // 2. If byte is end-of-stream, and gb18030 first, gb18030 + // second, or gb18030 third is not 0x00, set gb18030 first, + // gb18030 second, and gb18030 third to 0x00, and return error. + if (bite === end_of_stream && + (gb18030_first !== 0x00 || gb18030_second !== 0x00 || + gb18030_third !== 0x00)) { + gb18030_first = 0x00; + gb18030_second = 0x00; + gb18030_third = 0x00; + decoderError(fatal); + } + var code_point; + // 3. If gb18030 third is not 0x00, run these substeps: + if (gb18030_third !== 0x00) { + // 1. Let code point be null. + code_point = null; + // 2. If byte is in the range 0x30 to 0x39, inclusive, set + // code point to the index gb18030 ranges code point for + // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) × + // 126 + gb18030 third − 0x81) × 10 + byte − 0x30. + if (inRange(bite, 0x30, 0x39)) { + code_point = indexGB18030RangesCodePointFor( + (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 + + gb18030_third - 0x81) * 10 + bite - 0x30); + } + + // 3. Let buffer be a byte sequence consisting of gb18030 + // second, gb18030 third, and byte, in order. + var buffer = [gb18030_second, gb18030_third, bite]; + + // 4. Set gb18030 first, gb18030 second, and gb18030 third to + // 0x00. + gb18030_first = 0x00; + gb18030_second = 0x00; + gb18030_third = 0x00; + + // 5. If code point is null, prepend buffer to stream and + // return error. + if (code_point === null) { + stream.prepend(buffer); + return decoderError(fatal); + } + + // 6. Return a code point whose value is code point. + return code_point; + } + + // 4. If gb18030 second is not 0x00, run these substeps: + if (gb18030_second !== 0x00) { + + // 1. If byte is in the range 0x81 to 0xFE, inclusive, set + // gb18030 third to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + gb18030_third = bite; + return null; + } + + // 2. Prepend gb18030 second followed by byte to stream, set + // gb18030 first and gb18030 second to 0x00, and return error. + stream.prepend([gb18030_second, bite]); + gb18030_first = 0x00; + gb18030_second = 0x00; + return decoderError(fatal); + } + + // 5. If gb18030 first is not 0x00, run these substeps: + if (gb18030_first !== 0x00) { + + // 1. If byte is in the range 0x30 to 0x39, inclusive, set + // gb18030 second to byte and return continue. + if (inRange(bite, 0x30, 0x39)) { + gb18030_second = bite; + return null; + } + + // 2. Let lead be gb18030 first, let pointer be null, and set + // gb18030 first to 0x00. + var lead = gb18030_first; + var pointer = null; + gb18030_first = 0x00; + + // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41 + // otherwise. + var offset = bite < 0x7F ? 0x40 : 0x41; + + // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 + // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 + + // (byte − offset). + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) + pointer = (lead - 0x81) * 190 + (bite - offset); + + // 5. Let code point be null if pointer is null and the index + // code point for pointer in index gb18030 otherwise. + code_point = pointer === null ? null : + indexCodePointFor(pointer, index('gb18030')); + + // 6. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 7. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 8. Return a code point whose value is code point. + return code_point; + } + + // 6. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 7. If byte is 0x80, return code point U+20AC. + if (bite === 0x80) + return 0x20AC; + + // 8. If byte is in the range 0x81 to 0xFE, inclusive, set + // gb18030 first to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + gb18030_first = bite; + return null; + } + + // 9. Return error. + return decoderError(fatal); + }; + } + + // 11.2.2 gb18030 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + * @param {boolean=} gbk_flag + */ + function GB18030Encoder(options, gbk_flag) { + var fatal = options.fatal; + // gb18030's decoder has an associated gbk flag (initially unset). + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is U+E5E5, return error with code point. + if (code_point === 0xE5E5) + return encoderError(code_point); + + // 4. If the gbk flag is set and code point is U+20AC, return + // byte 0x80. + if (gbk_flag && code_point === 0x20AC) + return 0x80; + + // 5. Let pointer be the index pointer for code point in index + // gb18030. + var pointer = indexPointerFor(code_point, index('gb18030')); + + // 6. If pointer is not null, run these substeps: + if (pointer !== null) { + + // 1. Let lead be floor(pointer / 190) + 0x81. + var lead = floor(pointer / 190) + 0x81; + + // 2. Let trail be pointer % 190. + var trail = pointer % 190; + + // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise. + var offset = trail < 0x3F ? 0x40 : 0x41; + + // 4. Return two bytes whose values are lead and trail + offset. + return [lead, trail + offset]; + } + + // 7. If gbk flag is set, return error with code point. + if (gbk_flag) + return encoderError(code_point); + + // 8. Set pointer to the index gb18030 ranges pointer for code + // point. + pointer = indexGB18030RangesPointerFor(code_point); + + // 9. Let byte1 be floor(pointer / 10 / 126 / 10). + var byte1 = floor(pointer / 10 / 126 / 10); + + // 10. Set pointer to pointer − byte1 × 10 × 126 × 10. + pointer = pointer - byte1 * 10 * 126 * 10; + + // 11. Let byte2 be floor(pointer / 10 / 126). + var byte2 = floor(pointer / 10 / 126); + + // 12. Set pointer to pointer − byte2 × 10 × 126. + pointer = pointer - byte2 * 10 * 126; + + // 13. Let byte3 be floor(pointer / 10). + var byte3 = floor(pointer / 10); + + // 14. Let byte4 be pointer − byte3 × 10. + var byte4 = pointer - byte3 * 10; + + // 15. Return four bytes whose values are byte1 + 0x81, byte2 + + // 0x30, byte3 + 0x81, byte4 + 0x30. + return [byte1 + 0x81, + byte2 + 0x30, + byte3 + 0x81, + byte4 + 0x30]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['gb18030'] = function(options) { + return new GB18030Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['gb18030'] = function(options) { + return new GB18030Decoder(options); + }; + + + // + // 12. Legacy multi-byte Chinese (traditional) encodings + // + + // 12.1 Big5 + + // 12.1.1 Big5 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function Big5Decoder(options) { + var fatal = options.fatal; + // Big5's decoder has an associated Big5 lead (initially 0x00). + var /** @type {number} */ Big5_lead = 0x00; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and Big5 lead is not 0x00, set + // Big5 lead to 0x00 and return error. + if (bite === end_of_stream && Big5_lead !== 0x00) { + Big5_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and Big5 lead is 0x00, return + // finished. + if (bite === end_of_stream && Big5_lead === 0x00) + return finished; + + // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let + // pointer be null, set Big5 lead to 0x00, and then run these + // substeps: + if (Big5_lead !== 0x00) { + var lead = Big5_lead; + var pointer = null; + Big5_lead = 0x00; + + // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62 + // otherwise. + var offset = bite < 0x7F ? 0x40 : 0x62; + + // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1 + // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 + + // (byte − offset). + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) + pointer = (lead - 0x81) * 157 + (bite - offset); + + // 3. If there is a row in the table below whose first column + // is pointer, return the two code points listed in its second + // column + // Pointer | Code points + // --------+-------------- + // 1133 | U+00CA U+0304 + // 1135 | U+00CA U+030C + // 1164 | U+00EA U+0304 + // 1166 | U+00EA U+030C + switch (pointer) { + case 1133: return [0x00CA, 0x0304]; + case 1135: return [0x00CA, 0x030C]; + case 1164: return [0x00EA, 0x0304]; + case 1166: return [0x00EA, 0x030C]; + } + + // 4. Let code point be null if pointer is null and the index + // code point for pointer in index Big5 otherwise. + var code_point = (pointer === null) ? null : + indexCodePointFor(pointer, index('big5')); + + // 5. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 6. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 7. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5 + // lead to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + Big5_lead = bite; + return null; + } + + // 6. Return error. + return decoderError(fatal); + }; + } + + // 12.1.2 Big5 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function Big5Encoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index Big5 pointer for code point. + var pointer = indexBig5PointerFor(code_point); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 5. Let lead be floor(pointer / 157) + 0x81. + var lead = floor(pointer / 157) + 0x81; + + // 6. If lead is less than 0xA1, return error with code point. + if (lead < 0xA1) + return encoderError(code_point); + + // 7. Let trail be pointer % 157. + var trail = pointer % 157; + + // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62 + // otherwise. + var offset = trail < 0x3F ? 0x40 : 0x62; + + // Return two bytes whose values are lead and trail + offset. + return [lead, trail + offset]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['Big5'] = function(options) { + return new Big5Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['Big5'] = function(options) { + return new Big5Decoder(options); + }; + + + // + // 13. Legacy multi-byte Japanese encodings + // + + // 13.1 euc-jp + + // 13.1.1 euc-jp decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function EUCJPDecoder(options) { + var fatal = options.fatal; + + // euc-jp's decoder has an associated euc-jp jis0212 flag + // (initially unset) and euc-jp lead (initially 0x00). + var /** @type {boolean} */ eucjp_jis0212_flag = false, + /** @type {number} */ eucjp_lead = 0x00; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set + // euc-jp lead to 0x00, and return error. + if (bite === end_of_stream && eucjp_lead !== 0x00) { + eucjp_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and euc-jp lead is 0x00, return + // finished. + if (bite === end_of_stream && eucjp_lead === 0x00) + return finished; + + // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to + // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code + // point whose value is 0xFF61 − 0xA1 + byte. + if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) { + eucjp_lead = 0x00; + return 0xFF61 - 0xA1 + bite; + } + + // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to + // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead + // to byte, and return continue. + if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) { + eucjp_jis0212_flag = true; + eucjp_lead = bite; + return null; + } + + // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set + // euc-jp lead to 0x00, and run these substeps: + if (eucjp_lead !== 0x00) { + var lead = eucjp_lead; + eucjp_lead = 0x00; + + // 1. Let code point be null. + var code_point = null; + + // 2. If lead and byte are both in the range 0xA1 to 0xFE, + // inclusive, set code point to the index code point for (lead + // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp + // jis0212 flag is unset and in index jis0212 otherwise. + if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) { + code_point = indexCodePointFor( + (lead - 0xA1) * 94 + (bite - 0xA1), + index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212')); + } + + // 3. Unset the euc-jp jis0212 flag. + eucjp_jis0212_flag = false; + + // 4. If byte is not in the range 0xA1 to 0xFE, inclusive, + // prepend byte to stream. + if (!inRange(bite, 0xA1, 0xFE)) + stream.prepend(bite); + + // 5. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 6. Return a code point whose value is code point. + return code_point; + } + + // 6. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE, + // inclusive, set euc-jp lead to byte and return continue. + if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) { + eucjp_lead = bite; + return null; + } + + // 8. Return error. + return decoderError(fatal); + }; + } + + // 13.1.2 euc-jp encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function EUCJPEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 4. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + + // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, + // return two bytes whose values are 0x8E and code point − + // 0xFF61 + 0xA1. + if (inRange(code_point, 0xFF61, 0xFF9F)) + return [0x8E, code_point - 0xFF61 + 0xA1]; + + // 6. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 7. Let pointer be the index pointer for code point in index + // jis0208. + var pointer = indexPointerFor(code_point, index('jis0208')); + + // 8. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 9. Let lead be floor(pointer / 94) + 0xA1. + var lead = floor(pointer / 94) + 0xA1; + + // 10. Let trail be pointer % 94 + 0xA1. + var trail = pointer % 94 + 0xA1; + + // 11. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['EUC-JP'] = function(options) { + return new EUCJPEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['EUC-JP'] = function(options) { + return new EUCJPDecoder(options); + }; + + // 13.2 iso-2022-jp + + // 13.2.1 iso-2022-jp decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function ISO2022JPDecoder(options) { + var fatal = options.fatal; + /** @enum */ + var states = { + ASCII: 0, + Roman: 1, + Katakana: 2, + LeadByte: 3, + TrailByte: 4, + EscapeStart: 5, + Escape: 6 + }; + // iso-2022-jp's decoder has an associated iso-2022-jp decoder + // state (initially ASCII), iso-2022-jp decoder output state + // (initially ASCII), iso-2022-jp lead (initially 0x00), and + // iso-2022-jp output flag (initially unset). + var /** @type {number} */ iso2022jp_decoder_state = states.ASCII, + /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII, + /** @type {number} */ iso2022jp_lead = 0x00, + /** @type {boolean} */ iso2022jp_output_flag = false; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // switching on iso-2022-jp decoder state: + switch (iso2022jp_decoder_state) { + default: + case states.ASCII: + // ASCII + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B + if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E + && bite !== 0x0F && bite !== 0x1B) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is byte. + iso2022jp_output_flag = false; + return bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.Roman: + // Roman + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x5C + if (bite === 0x5C) { + // Unset the iso-2022-jp output flag and return code point + // U+00A5. + iso2022jp_output_flag = false; + return 0x00A5; + } + + // 0x7E + if (bite === 0x7E) { + // Unset the iso-2022-jp output flag and return code point + // U+203E. + iso2022jp_output_flag = false; + return 0x203E; + } + + // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E + if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F + && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is byte. + iso2022jp_output_flag = false; + return bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.Katakana: + // Katakana + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x21 to 0x5F + if (inRange(bite, 0x21, 0x5F)) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is 0xFF61 − 0x21 + byte. + iso2022jp_output_flag = false; + return 0xFF61 - 0x21 + bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.LeadByte: + // Lead byte + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x21 to 0x7E + if (inRange(bite, 0x21, 0x7E)) { + // Unset the iso-2022-jp output flag, set iso-2022-jp lead + // to byte, iso-2022-jp decoder state to trail byte, and + // return continue. + iso2022jp_output_flag = false; + iso2022jp_lead = bite; + iso2022jp_decoder_state = states.TrailByte; + return null; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.TrailByte: + // Trail byte + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return decoderError(fatal); + } + + // 0x21 to 0x7E + if (inRange(bite, 0x21, 0x7E)) { + // 1. Set the iso-2022-jp decoder state to lead byte. + iso2022jp_decoder_state = states.LeadByte; + + // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21. + var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21; + + // 3. Let code point be the index code point for pointer in + // index jis0208. + var code_point = indexCodePointFor(pointer, index('jis0208')); + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + } + + // end-of-stream + if (bite === end_of_stream) { + // Set the iso-2022-jp decoder state to lead byte, prepend + // byte to stream, and return error. + iso2022jp_decoder_state = states.LeadByte; + stream.prepend(bite); + return decoderError(fatal); + } + + // Otherwise + // Set iso-2022-jp decoder state to lead byte and return + // error. + iso2022jp_decoder_state = states.LeadByte; + return decoderError(fatal); + + case states.EscapeStart: + // Escape start + + // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to + // byte, iso-2022-jp decoder state to escape, and return + // continue. + if (bite === 0x24 || bite === 0x28) { + iso2022jp_lead = bite; + iso2022jp_decoder_state = states.Escape; + return null; + } + + // 2. Prepend byte to stream. + stream.prepend(bite); + + // 3. Unset the iso-2022-jp output flag, set iso-2022-jp + // decoder state to iso-2022-jp decoder output state, and + // return error. + iso2022jp_output_flag = false; + iso2022jp_decoder_state = iso2022jp_decoder_output_state; + return decoderError(fatal); + + case states.Escape: + // Escape + + // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to + // 0x00. + var lead = iso2022jp_lead; + iso2022jp_lead = 0x00; + + // 2. Let state be null. + var state = null; + + // 3. If lead is 0x28 and byte is 0x42, set state to ASCII. + if (lead === 0x28 && bite === 0x42) + state = states.ASCII; + + // 4. If lead is 0x28 and byte is 0x4A, set state to Roman. + if (lead === 0x28 && bite === 0x4A) + state = states.Roman; + + // 5. If lead is 0x28 and byte is 0x49, set state to Katakana. + if (lead === 0x28 && bite === 0x49) + state = states.Katakana; + + // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set + // state to lead byte. + if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) + state = states.LeadByte; + + // 7. If state is non-null, run these substeps: + if (state !== null) { + // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder + // output state to states. + iso2022jp_decoder_state = iso2022jp_decoder_state = state; + + // 2. Let output flag be the iso-2022-jp output flag. + var output_flag = iso2022jp_output_flag; + + // 3. Set the iso-2022-jp output flag. + iso2022jp_output_flag = true; + + // 4. Return continue, if output flag is unset, and error + // otherwise. + return !output_flag ? null : decoderError(fatal); + } + + // 8. Prepend lead and byte to stream. + stream.prepend([lead, bite]); + + // 9. Unset the iso-2022-jp output flag, set iso-2022-jp + // decoder state to iso-2022-jp decoder output state and + // return error. + iso2022jp_output_flag = false; + iso2022jp_decoder_state = iso2022jp_decoder_output_state; + return decoderError(fatal); + } + }; + } + + // 13.2.2 iso-2022-jp encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function ISO2022JPEncoder(options) { + var fatal = options.fatal; + // iso-2022-jp's encoder has an associated iso-2022-jp encoder + // state which is one of ASCII, Roman, and jis0208 (initially + // ASCII). + /** @enum */ + var states = { + ASCII: 0, + Roman: 1, + jis0208: 2 + }; + var /** @type {number} */ iso2022jp_state = states.ASCII; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream and iso-2022-jp encoder + // state is not ASCII, prepend code point to stream, set + // iso-2022-jp encoder state to ASCII, and return three bytes + // 0x1B 0x28 0x42. + if (code_point === end_of_stream && + iso2022jp_state !== states.ASCII) { + stream.prepend(code_point); + iso2022jp_state = states.ASCII; + return [0x1B, 0x28, 0x42]; + } + + // 2. If code point is end-of-stream and iso-2022-jp encoder + // state is ASCII, return finished. + if (code_point === end_of_stream && iso2022jp_state === states.ASCII) + return finished; + + // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code + // point is U+000E, U+000F, or U+001B, return error with U+FFFD. + if ((iso2022jp_state === states.ASCII || + iso2022jp_state === states.Roman) && + (code_point === 0x000E || code_point === 0x000F || + code_point === 0x001B)) { + return encoderError(0xFFFD); + } + + // 4. If iso-2022-jp encoder state is ASCII and code point is an + // ASCII code point, return a byte whose value is code point. + if (iso2022jp_state === states.ASCII && + isASCIICodePoint(code_point)) + return code_point; + + // 5. If iso-2022-jp encoder state is Roman and code point is an + // ASCII code point, excluding U+005C and U+007E, or is U+00A5 + // or U+203E, run these substeps: + if (iso2022jp_state === states.Roman && + ((isASCIICodePoint(code_point) && + code_point !== 0x005C && code_point !== 0x007E) || + (code_point == 0x00A5 || code_point == 0x203E))) { + + // 1. If code point is an ASCII code point, return a byte + // whose value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 2. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 3. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + } + + // 6. If code point is an ASCII code point, and iso-2022-jp + // encoder state is not ASCII, prepend code point to stream, set + // iso-2022-jp encoder state to ASCII, and return three bytes + // 0x1B 0x28 0x42. + if (isASCIICodePoint(code_point) && + iso2022jp_state !== states.ASCII) { + stream.prepend(code_point); + iso2022jp_state = states.ASCII; + return [0x1B, 0x28, 0x42]; + } + + // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp + // encoder state is not Roman, prepend code point to stream, set + // iso-2022-jp encoder state to Roman, and return three bytes + // 0x1B 0x28 0x4A. + if ((code_point === 0x00A5 || code_point === 0x203E) && + iso2022jp_state !== states.Roman) { + stream.prepend(code_point); + iso2022jp_state = states.Roman; + return [0x1B, 0x28, 0x4A]; + } + + // 8. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 9. Let pointer be the index pointer for code point in index + // jis0208. + var pointer = indexPointerFor(code_point, index('jis0208')); + + // 10. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 11. If iso-2022-jp encoder state is not jis0208, prepend code + // point to stream, set iso-2022-jp encoder state to jis0208, + // and return three bytes 0x1B 0x24 0x42. + if (iso2022jp_state !== states.jis0208) { + stream.prepend(code_point); + iso2022jp_state = states.jis0208; + return [0x1B, 0x24, 0x42]; + } + + // 12. Let lead be floor(pointer / 94) + 0x21. + var lead = floor(pointer / 94) + 0x21; + + // 13. Let trail be pointer % 94 + 0x21. + var trail = pointer % 94 + 0x21; + + // 14. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['ISO-2022-JP'] = function(options) { + return new ISO2022JPEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['ISO-2022-JP'] = function(options) { + return new ISO2022JPDecoder(options); + }; + + // 13.3 Shift_JIS + + // 13.3.1 Shift_JIS decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function ShiftJISDecoder(options) { + var fatal = options.fatal; + // Shift_JIS's decoder has an associated Shift_JIS lead (initially + // 0x00). + var /** @type {number} */ Shift_JIS_lead = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00, + // set Shift_JIS lead to 0x00 and return error. + if (bite === end_of_stream && Shift_JIS_lead !== 0x00) { + Shift_JIS_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and Shift_JIS lead is 0x00, + // return finished. + if (bite === end_of_stream && Shift_JIS_lead === 0x00) + return finished; + + // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead, + // let pointer be null, set Shift_JIS lead to 0x00, and then run + // these substeps: + if (Shift_JIS_lead !== 0x00) { + var lead = Shift_JIS_lead; + var pointer = null; + Shift_JIS_lead = 0x00; + + // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41 + // otherwise. + var offset = (bite < 0x7F) ? 0x40 : 0x41; + + // 2. Let lead offset be 0x81, if lead is less than 0xA0, and + // 0xC1 otherwise. + var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1; + + // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 + // to 0xFC, inclusive, set pointer to (lead − lead offset) × + // 188 + byte − offset. + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) + pointer = (lead - lead_offset) * 188 + bite - offset; + + // 4. If pointer is in the range 8836 to 10715, inclusive, + // return a code point whose value is 0xE000 − 8836 + pointer. + if (inRange(pointer, 8836, 10715)) + return 0xE000 - 8836 + pointer; + + // 5. Let code point be null, if pointer is null, and the + // index code point for pointer in index jis0208 otherwise. + var code_point = (pointer === null) ? null : + indexCodePointFor(pointer, index('jis0208')); + + // 6. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 7. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 8. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte or 0x80, return a code point + // whose value is byte. + if (isASCIIByte(bite) || bite === 0x80) + return bite; + + // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a + // code point whose value is 0xFF61 − 0xA1 + byte. + if (inRange(bite, 0xA1, 0xDF)) + return 0xFF61 - 0xA1 + bite; + + // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0 + // to 0xFC, inclusive, set Shift_JIS lead to byte and return + // continue. + if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) { + Shift_JIS_lead = bite; + return null; + } + + // 7. Return error. + return decoderError(fatal); + }; + } + + // 13.3.2 Shift_JIS encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function ShiftJISEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point or U+0080, return a + // byte whose value is code point. + if (isASCIICodePoint(code_point) || code_point === 0x0080) + return code_point; + + // 3. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 4. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + + // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, + // return a byte whose value is code point − 0xFF61 + 0xA1. + if (inRange(code_point, 0xFF61, 0xFF9F)) + return code_point - 0xFF61 + 0xA1; + + // 6. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 7. Let pointer be the index Shift_JIS pointer for code point. + var pointer = indexShiftJISPointerFor(code_point); + + // 8. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 9. Let lead be floor(pointer / 188). + var lead = floor(pointer / 188); + + // 10. Let lead offset be 0x81, if lead is less than 0x1F, and + // 0xC1 otherwise. + var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1; + + // 11. Let trail be pointer % 188. + var trail = pointer % 188; + + // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41 + // otherwise. + var offset = (trail < 0x3F) ? 0x40 : 0x41; + + // 13. Return two bytes whose values are lead + lead offset and + // trail + offset. + return [lead + lead_offset, trail + offset]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['Shift_JIS'] = function(options) { + return new ShiftJISEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['Shift_JIS'] = function(options) { + return new ShiftJISDecoder(options); + }; + + // + // 14. Legacy multi-byte Korean encodings + // + + // 14.1 euc-kr + + // 14.1.1 euc-kr decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function EUCKRDecoder(options) { + var fatal = options.fatal; + + // euc-kr's decoder has an associated euc-kr lead (initially 0x00). + var /** @type {number} */ euckr_lead = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set + // euc-kr lead to 0x00 and return error. + if (bite === end_of_stream && euckr_lead !== 0) { + euckr_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and euc-kr lead is 0x00, return + // finished. + if (bite === end_of_stream && euckr_lead === 0) + return finished; + + // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let + // pointer be null, set euc-kr lead to 0x00, and then run these + // substeps: + if (euckr_lead !== 0x00) { + var lead = euckr_lead; + var pointer = null; + euckr_lead = 0x00; + + // 1. If byte is in the range 0x41 to 0xFE, inclusive, set + // pointer to (lead − 0x81) × 190 + (byte − 0x41). + if (inRange(bite, 0x41, 0xFE)) + pointer = (lead - 0x81) * 190 + (bite - 0x41); + + // 2. Let code point be null, if pointer is null, and the + // index code point for pointer in index euc-kr otherwise. + var code_point = (pointer === null) + ? null : indexCodePointFor(pointer, index('euc-kr')); + + // 3. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (pointer === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 5. If byte is in the range 0x81 to 0xFE, inclusive, set + // euc-kr lead to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + euckr_lead = bite; + return null; + } + + // 6. Return error. + return decoderError(fatal); + }; + } + + // 14.1.2 euc-kr encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function EUCKREncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index pointer for code point in index + // euc-kr. + var pointer = indexPointerFor(code_point, index('euc-kr')); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 5. Let lead be floor(pointer / 190) + 0x81. + var lead = floor(pointer / 190) + 0x81; + + // 6. Let trail be pointer % 190 + 0x41. + var trail = (pointer % 190) + 0x41; + + // 7. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['EUC-KR'] = function(options) { + return new EUCKREncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['EUC-KR'] = function(options) { + return new EUCKRDecoder(options); + }; + + + // + // 15. Legacy miscellaneous encodings + // + + // 15.1 replacement + + // Not needed - API throws RangeError + + // 15.2 Common infrastructure for utf-16be and utf-16le + + /** + * @param {number} code_unit + * @param {boolean} utf16be + * @return {!Array.} bytes + */ + function convertCodeUnitToBytes(code_unit, utf16be) { + // 1. Let byte1 be code unit >> 8. + var byte1 = code_unit >> 8; + + // 2. Let byte2 be code unit & 0x00FF. + var byte2 = code_unit & 0x00FF; + + // 3. Then return the bytes in order: + // utf-16be flag is set: byte1, then byte2. + if (utf16be) + return [byte1, byte2]; + // utf-16be flag is unset: byte2, then byte1. + return [byte2, byte1]; + } + + // 15.2.1 shared utf-16 decoder + /** + * @constructor + * @implements {Decoder} + * @param {boolean} utf16_be True if big-endian, false if little-endian. + * @param {{fatal: boolean}} options + */ + function UTF16Decoder(utf16_be, options) { + var fatal = options.fatal; + var /** @type {?number} */ utf16_lead_byte = null, + /** @type {?number} */ utf16_lead_surrogate = null; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and either utf-16 lead byte or + // utf-16 lead surrogate is not null, set utf-16 lead byte and + // utf-16 lead surrogate to null, and return error. + if (bite === end_of_stream && (utf16_lead_byte !== null || + utf16_lead_surrogate !== null)) { + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and utf-16 lead byte and utf-16 + // lead surrogate are null, return finished. + if (bite === end_of_stream && utf16_lead_byte === null && + utf16_lead_surrogate === null) { + return finished; + } + + // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte + // and return continue. + if (utf16_lead_byte === null) { + utf16_lead_byte = bite; + return null; + } + + // 4. Let code unit be the result of: + var code_unit; + if (utf16_be) { + // utf-16be decoder flag is set + // (utf-16 lead byte << 8) + byte. + code_unit = (utf16_lead_byte << 8) + bite; + } else { + // utf-16be decoder flag is unset + // (byte << 8) + utf-16 lead byte. + code_unit = (bite << 8) + utf16_lead_byte; + } + // Then set utf-16 lead byte to null. + utf16_lead_byte = null; + + // 5. If utf-16 lead surrogate is not null, let lead surrogate + // be utf-16 lead surrogate, set utf-16 lead surrogate to null, + // and then run these substeps: + if (utf16_lead_surrogate !== null) { + var lead_surrogate = utf16_lead_surrogate; + utf16_lead_surrogate = null; + + // 1. If code unit is in the range U+DC00 to U+DFFF, + // inclusive, return a code point whose value is 0x10000 + + // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00). + if (inRange(code_unit, 0xDC00, 0xDFFF)) { + return 0x10000 + (lead_surrogate - 0xD800) * 0x400 + + (code_unit - 0xDC00); + } + + // 2. Prepend the sequence resulting of converting code unit + // to bytes using utf-16be decoder flag to stream and return + // error. + stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be)); + return decoderError(fatal); + } + + // 6. If code unit is in the range U+D800 to U+DBFF, inclusive, + // set utf-16 lead surrogate to code unit and return continue. + if (inRange(code_unit, 0xD800, 0xDBFF)) { + utf16_lead_surrogate = code_unit; + return null; + } + + // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive, + // return error. + if (inRange(code_unit, 0xDC00, 0xDFFF)) + return decoderError(fatal); + + // 8. Return code point code unit. + return code_unit; + }; + } + + // 15.2.2 shared utf-16 encoder + /** + * @constructor + * @implements {Encoder} + * @param {boolean} utf16_be True if big-endian, false if little-endian. + * @param {{fatal: boolean}} options + */ + function UTF16Encoder(utf16_be, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is in the range U+0000 to U+FFFF, inclusive, + // return the sequence resulting of converting code point to + // bytes using utf-16be encoder flag. + if (inRange(code_point, 0x0000, 0xFFFF)) + return convertCodeUnitToBytes(code_point, utf16_be); + + // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800, + // converted to bytes using utf-16be encoder flag. + var lead = convertCodeUnitToBytes( + ((code_point - 0x10000) >> 10) + 0xD800, utf16_be); + + // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00, + // converted to bytes using utf-16be encoder flag. + var trail = convertCodeUnitToBytes( + ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be); + + // 5. Return a byte sequence of lead followed by trail. + return lead.concat(trail); + }; + } + + // 15.3 utf-16be + // 15.3.1 utf-16be decoder + /** @param {{fatal: boolean}} options */ + encoders['UTF-16BE'] = function(options) { + return new UTF16Encoder(true, options); + }; + // 15.3.2 utf-16be encoder + /** @param {{fatal: boolean}} options */ + decoders['UTF-16BE'] = function(options) { + return new UTF16Decoder(true, options); + }; + + // 15.4 utf-16le + // 15.4.1 utf-16le decoder + /** @param {{fatal: boolean}} options */ + encoders['UTF-16LE'] = function(options) { + return new UTF16Encoder(false, options); + }; + // 15.4.2 utf-16le encoder + /** @param {{fatal: boolean}} options */ + decoders['UTF-16LE'] = function(options) { + return new UTF16Decoder(false, options); + }; + + // 15.5 x-user-defined + + // 15.5.1 x-user-defined decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function XUserDefinedDecoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 2. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 3. Return a code point whose value is 0xF780 + byte − 0x80. + return 0xF780 + bite - 0x80; + }; + } + + // 15.5.2 x-user-defined encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function XUserDefinedEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1.If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is in the range U+F780 to U+F7FF, inclusive, + // return a byte whose value is code point − 0xF780 + 0x80. + if (inRange(code_point, 0xF780, 0xF7FF)) + return code_point - 0xF780 + 0x80; + + // 4. Return error with code point. + return encoderError(code_point); + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['x-user-defined'] = function(options) { + return new XUserDefinedEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['x-user-defined'] = function(options) { + return new XUserDefinedDecoder(options); + }; + + if (!global['TextEncoder']) + global['TextEncoder'] = TextEncoder; + if (!global['TextDecoder']) + global['TextDecoder'] = TextDecoder; + + if (typeof module !== "undefined" && module.exports) { + module.exports = { + TextEncoder: global['TextEncoder'], + TextDecoder: global['TextDecoder'], + EncodingIndexes: global["encoding-indexes"] + }; + } + +// For strict environments where `this` inside the global scope +// is `undefined`, take a pure object instead +}(this || {})); +},{"./encoding-indexes.js":84}],86:[function(require,module,exports){ +/*! + + diff v4.0.1 + +Software License Agreement (BSD License) + +Copyright (c) 2009-2015, Kevin Decker + +All rights reserved. + +Redistribution and use of this software in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of Kevin Decker nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +@license +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.Diff = {})); +}(this, function (exports) { 'use strict'; + + function Diff() {} + Diff.prototype = { + diff: function diff(oldString, newString) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var callback = options.callback; + + if (typeof options === 'function') { + callback = options; + options = {}; + } + + this.options = options; + var self = this; + + function done(value) { + if (callback) { + setTimeout(function () { + callback(undefined, value); + }, 0); + return true; + } else { + return value; + } + } // Allow subclasses to massage the input prior to running + + + oldString = this.castInput(oldString); + newString = this.castInput(newString); + oldString = this.removeEmpty(this.tokenize(oldString)); + newString = this.removeEmpty(this.tokenize(newString)); + var newLen = newString.length, + oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ + newPos: -1, + components: [] + }]; // Seed editLength = 0, i.e. the content starts with the same values + + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{ + value: this.join(newString), + count: newString.length + }]); + } // Main worker method. checks all permutations of a given edit length for acceptance. + + + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath = void 0; + + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + + + if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done + + if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { + return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + + + if (callback) { + (function exec() { + setTimeout(function () { + // This should not happen, but we want to be safe. + + /* istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + })(); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + + if (ret) { + return ret; + } + } + } + }, + pushComponent: function pushComponent(components, added, removed) { + var last = components[components.length - 1]; + + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = { + count: last.count + 1, + added: added, + removed: removed + }; + } else { + components.push({ + count: 1, + added: added, + removed: removed + }); + } + }, + extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + commonCount = 0; + + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({ + count: commonCount + }); + } + + basePath.newPos = newPos; + return oldPos; + }, + equals: function equals(left, right) { + if (this.options.comparator) { + return this.options.comparator(left, right); + } else { + return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); + } + }, + removeEmpty: function removeEmpty(array) { + var ret = []; + + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + + return ret; + }, + castInput: function castInput(value) { + return value; + }, + tokenize: function tokenize(value) { + return value.split(''); + }, + join: function join(chars) { + return chars.join(''); + } + }; + + function buildValues(diff, components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = value.map(function (value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + component.value = diff.join(value); + } else { + component.value = diff.join(newString.slice(newPos, newPos + component.count)); + } + + newPos += component.count; // Common case + + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); + oldPos += component.count; // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } // Special case handle for when one terminal is ignored (i.e. whitespace). + // For this case we merge the terminal into the prior string and drop the change. + // This is only available for string mode. + + + var lastComponent = components[componentLen - 1]; + + if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { + components[componentLen - 2].value += lastComponent.value; + components.pop(); + } + + return components; + } + + function clonePath(path) { + return { + newPos: path.newPos, + components: path.components.slice(0) + }; + } + + var characterDiff = new Diff(); + function diffChars(oldStr, newStr, options) { + return characterDiff.diff(oldStr, newStr, options); + } + + function generateOptions(options, defaults) { + if (typeof options === 'function') { + defaults.callback = options; + } else if (options) { + for (var name in options) { + /* istanbul ignore else */ + if (options.hasOwnProperty(name)) { + defaults[name] = options[name]; + } + } + } + + return defaults; + } + + // + // Ranges and exceptions: + // Latin-1 Supplement, 0080–00FF + // - U+00D7 × Multiplication sign + // - U+00F7 ÷ Division sign + // Latin Extended-A, 0100–017F + // Latin Extended-B, 0180–024F + // IPA Extensions, 0250–02AF + // Spacing Modifier Letters, 02B0–02FF + // - U+02C7 ˇ ˇ Caron + // - U+02D8 ˘ ˘ Breve + // - U+02D9 ˙ ˙ Dot Above + // - U+02DA ˚ ˚ Ring Above + // - U+02DB ˛ ˛ Ogonek + // - U+02DC ˜ ˜ Small Tilde + // - U+02DD ˝ ˝ Double Acute Accent + // Latin Extended Additional, 1E00–1EFF + + var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; + var reWhitespace = /\S/; + var wordDiff = new Diff(); + + wordDiff.equals = function (left, right) { + if (this.options.ignoreCase) { + left = left.toLowerCase(); + right = right.toLowerCase(); + } + + return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); + }; + + wordDiff.tokenize = function (value) { + var tokens = value.split(/(\s+|[()[\]{}'"]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. + + for (var i = 0; i < tokens.length - 1; i++) { + // If we have an empty string in the next field and we have only word chars before and after, merge + if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { + tokens[i] += tokens[i + 2]; + tokens.splice(i + 1, 2); + i--; + } + } + + return tokens; + }; + + function diffWords(oldStr, newStr, options) { + options = generateOptions(options, { + ignoreWhitespace: true + }); + return wordDiff.diff(oldStr, newStr, options); + } + function diffWordsWithSpace(oldStr, newStr, options) { + return wordDiff.diff(oldStr, newStr, options); + } + + var lineDiff = new Diff(); + + lineDiff.tokenize = function (value) { + var retLines = [], + linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line + + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } // Merge the content and line separators into single tokens + + + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2 && !this.options.newlineIsToken) { + retLines[retLines.length - 1] += line; + } else { + if (this.options.ignoreWhitespace) { + line = line.trim(); + } + + retLines.push(line); + } + } + + return retLines; + }; + + function diffLines(oldStr, newStr, callback) { + return lineDiff.diff(oldStr, newStr, callback); + } + function diffTrimmedLines(oldStr, newStr, callback) { + var options = generateOptions(callback, { + ignoreWhitespace: true + }); + return lineDiff.diff(oldStr, newStr, options); + } + + var sentenceDiff = new Diff(); + + sentenceDiff.tokenize = function (value) { + return value.split(/(\S.+?[.!?])(?=\s+|$)/); + }; + + function diffSentences(oldStr, newStr, callback) { + return sentenceDiff.diff(oldStr, newStr, callback); + } + + var cssDiff = new Diff(); + + cssDiff.tokenize = function (value) { + return value.split(/([{}:;,]|\s+)/); + }; + + function diffCss(oldStr, newStr, callback) { + return cssDiff.diff(oldStr, newStr, callback); + } + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var objectPrototypeToString = Object.prototype.toString; + var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + + jsonDiff.useLongestToken = true; + jsonDiff.tokenize = lineDiff.tokenize; + + jsonDiff.castInput = function (value) { + var _this$options = this.options, + undefinedReplacement = _this$options.undefinedReplacement, + _this$options$stringi = _this$options.stringifyReplacer, + stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) { + return typeof v === 'undefined' ? undefinedReplacement : v; + } : _this$options$stringi; + return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); + }; + + jsonDiff.equals = function (left, right) { + return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); + }; + + function diffJson(oldObj, newObj, options) { + return jsonDiff.diff(oldObj, newObj, options); + } // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. Accepts an optional replacer + + function canonicalize(obj, stack, replacementStack, replacer, key) { + stack = stack || []; + replacementStack = replacementStack || []; + + if (replacer) { + obj = replacer(key, obj); + } + + var i; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); + } + + stack.pop(); + replacementStack.pop(); + return canonicalizedObj; + } + + if (obj && obj.toJSON) { + obj = obj.toJSON(); + } + + if (_typeof(obj) === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + + var sortedKeys = [], + _key; + + for (_key in obj) { + /* istanbul ignore else */ + if (obj.hasOwnProperty(_key)) { + sortedKeys.push(_key); + } + } + + sortedKeys.sort(); + + for (i = 0; i < sortedKeys.length; i += 1) { + _key = sortedKeys[i]; + canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); + } + + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + + return canonicalizedObj; + } + + var arrayDiff = new Diff(); + + arrayDiff.tokenize = function (value) { + return value.slice(); + }; + + arrayDiff.join = arrayDiff.removeEmpty = function (value) { + return value; + }; + + function diffArrays(oldArr, newArr, callback) { + return arrayDiff.diff(oldArr, newArr, callback); + } + + function parsePatch(uniDiff) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], + list = [], + i = 0; + + function parseIndex() { + var index = {}; + list.push(index); // Parse diff metadata + + while (i < diffstr.length) { + var line = diffstr[i]; // File header found, end parsing diff metadata + + if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { + break; + } // Diff index + + + var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); + + if (header) { + index.index = header[1]; + } + + i++; + } // Parse file headers if they are defined. Unified diff requires them, but + // there's no technical issues to have an isolated hunk without file header + + + parseFileHeader(index); + parseFileHeader(index); // Parse hunks + + index.hunks = []; + + while (i < diffstr.length) { + var _line = diffstr[i]; + + if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { + break; + } else if (/^@@/.test(_line)) { + index.hunks.push(parseHunk()); + } else if (_line && options.strict) { + // Ignore unexpected content unless in strict mode + throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); + } else { + i++; + } + } + } // Parses the --- and +++ headers, if none are found, no lines + // are consumed. + + + function parseFileHeader(index) { + var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); + + if (fileHeader) { + var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; + var data = fileHeader[2].split('\t', 2); + var fileName = data[0].replace(/\\\\/g, '\\'); + + if (/^".*"$/.test(fileName)) { + fileName = fileName.substr(1, fileName.length - 2); + } + + index[keyPrefix + 'FileName'] = fileName; + index[keyPrefix + 'Header'] = (data[1] || '').trim(); + i++; + } + } // Parses a hunk + // This assumes that we are at the start of a hunk. + + + function parseHunk() { + var chunkHeaderIndex = i, + chunkHeaderLine = diffstr[i++], + chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); + var hunk = { + oldStart: +chunkHeader[1], + oldLines: +chunkHeader[2] || 1, + newStart: +chunkHeader[3], + newLines: +chunkHeader[4] || 1, + lines: [], + linedelimiters: [] + }; + var addCount = 0, + removeCount = 0; + + for (; i < diffstr.length; i++) { + // Lines starting with '---' could be mistaken for the "remove line" operation + // But they could be the header for the next file. Therefore prune such cases out. + if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { + break; + } + + var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; + + if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { + hunk.lines.push(diffstr[i]); + hunk.linedelimiters.push(delimiters[i] || '\n'); + + if (operation === '+') { + addCount++; + } else if (operation === '-') { + removeCount++; + } else if (operation === ' ') { + addCount++; + removeCount++; + } + } else { + break; + } + } // Handle the empty block count case + + + if (!addCount && hunk.newLines === 1) { + hunk.newLines = 0; + } + + if (!removeCount && hunk.oldLines === 1) { + hunk.oldLines = 0; + } // Perform optional sanity checking + + + if (options.strict) { + if (addCount !== hunk.newLines) { + throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + + if (removeCount !== hunk.oldLines) { + throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + } + + return hunk; + } + + while (i < diffstr.length) { + parseIndex(); + } + + return list; + } + + // Iterator that traverses in the range of [min, max], stepping + // by distance from a given start position. I.e. for [0, 4], with + // start of 2, this will iterate 2, 3, 1, 4, 0. + function distanceIterator (start, minLine, maxLine) { + var wantForward = true, + backwardExhausted = false, + forwardExhausted = false, + localOffset = 1; + return function iterator() { + if (wantForward && !forwardExhausted) { + if (backwardExhausted) { + localOffset++; + } else { + wantForward = false; + } // Check if trying to fit beyond text length, and if not, check it fits + // after offset location (or desired location on first iteration) + + + if (start + localOffset <= maxLine) { + return localOffset; + } + + forwardExhausted = true; + } + + if (!backwardExhausted) { + if (!forwardExhausted) { + wantForward = true; + } // Check if trying to fit before text beginning, and if not, check it fits + // before offset location + + + if (minLine <= start - localOffset) { + return -localOffset++; + } + + backwardExhausted = true; + return iterator(); + } // We tried to fit hunk before text beginning and beyond text length, then + // hunk can't fit on the text. Return undefined + + }; + } + + function applyPatch(source, uniDiff) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (typeof uniDiff === 'string') { + uniDiff = parsePatch(uniDiff); + } + + if (Array.isArray(uniDiff)) { + if (uniDiff.length > 1) { + throw new Error('applyPatch only works with a single input.'); + } + + uniDiff = uniDiff[0]; + } // Apply the diff to the input + + + var lines = source.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], + hunks = uniDiff.hunks, + compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) { + return line === patchContent; + }, + errorCount = 0, + fuzzFactor = options.fuzzFactor || 0, + minLine = 0, + offset = 0, + removeEOFNL, + addEOFNL; + /** + * Checks if the hunk exactly fits on the provided location + */ + + + function hunkFits(hunk, toPos) { + for (var j = 0; j < hunk.lines.length; j++) { + var line = hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line; + + if (operation === ' ' || operation === '-') { + // Context sanity check + if (!compareLine(toPos + 1, lines[toPos], operation, content)) { + errorCount++; + + if (errorCount > fuzzFactor) { + return false; + } + } + + toPos++; + } + } + + return true; + } // Search best fit offsets for each hunk based on the previous ones + + + for (var i = 0; i < hunks.length; i++) { + var hunk = hunks[i], + maxLine = lines.length - hunk.oldLines, + localOffset = 0, + toPos = offset + hunk.oldStart - 1; + var iterator = distanceIterator(toPos, minLine, maxLine); + + for (; localOffset !== undefined; localOffset = iterator()) { + if (hunkFits(hunk, toPos + localOffset)) { + hunk.offset = offset += localOffset; + break; + } + } + + if (localOffset === undefined) { + return false; + } // Set lower text limit to end of the current hunk, so next ones don't try + // to fit over already patched text + + + minLine = hunk.offset + hunk.oldStart + hunk.oldLines; + } // Apply patch hunks + + + var diffOffset = 0; + + for (var _i = 0; _i < hunks.length; _i++) { + var _hunk = hunks[_i], + _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; + + diffOffset += _hunk.newLines - _hunk.oldLines; + + if (_toPos < 0) { + // Creating a new file + _toPos = 0; + } + + for (var j = 0; j < _hunk.lines.length; j++) { + var line = _hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line, + delimiter = _hunk.linedelimiters[j]; + + if (operation === ' ') { + _toPos++; + } else if (operation === '-') { + lines.splice(_toPos, 1); + delimiters.splice(_toPos, 1); + /* istanbul ignore else */ + } else if (operation === '+') { + lines.splice(_toPos, 0, content); + delimiters.splice(_toPos, 0, delimiter); + _toPos++; + } else if (operation === '\\') { + var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; + + if (previousOperation === '+') { + removeEOFNL = true; + } else if (previousOperation === '-') { + addEOFNL = true; + } + } + } + } // Handle EOFNL insertion/removal + + + if (removeEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + delimiters.pop(); + } + } else if (addEOFNL) { + lines.push(''); + delimiters.push('\n'); + } + + for (var _k = 0; _k < lines.length - 1; _k++) { + lines[_k] = lines[_k] + delimiters[_k]; + } + + return lines.join(''); + } // Wrapper that supports multiple file patches via callbacks. + + function applyPatches(uniDiff, options) { + if (typeof uniDiff === 'string') { + uniDiff = parsePatch(uniDiff); + } + + var currentIndex = 0; + + function processIndex() { + var index = uniDiff[currentIndex++]; + + if (!index) { + return options.complete(); + } + + options.loadFile(index, function (err, data) { + if (err) { + return options.complete(err); + } + + var updatedContent = applyPatch(data, index, options); + options.patched(index, updatedContent, function (err) { + if (err) { + return options.complete(err); + } + + processIndex(); + }); + }); + } + + processIndex(); + } + + function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + if (!options) { + options = {}; + } + + if (typeof options.context === 'undefined') { + options.context = 4; + } + + var diff = diffLines(oldStr, newStr, options); + diff.push({ + value: '', + lines: [] + }); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function (entry) { + return ' ' + entry; + }); + } + + var hunks = []; + var oldRangeStart = 0, + newRangeStart = 0, + curRange = [], + oldLine = 1, + newLine = 1; + + var _loop = function _loop(i) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + var _curRange; + + // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } // Output our changes + + + (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) { + return (current.added ? '+' : '-') + entry; + }))); // Track the updated file position + + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= options.context * 2 && i < diff.length - 2) { + var _curRange2; + + // Overlapping + (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines))); + } else { + var _curRange3; + + // end the range and output + var contextSize = Math.min(lines.length, options.context); + + (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize)))); + + var hunk = { + oldStart: oldRangeStart, + oldLines: oldLine - oldRangeStart + contextSize, + newStart: newRangeStart, + newLines: newLine - newRangeStart + contextSize, + lines: curRange + }; + + if (i >= diff.length - 2 && lines.length <= options.context) { + // EOF is inside this hunk + var oldEOFNewline = /\n$/.test(oldStr); + var newEOFNewline = /\n$/.test(newStr); + var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines; + + if (!oldEOFNewline && noNlBeforeAdds) { + // special case: old has no eol and no trailing context; no-nl can end up before adds + curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); + } + + if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) { + curRange.push('\\ No newline at end of file'); + } + } + + hunks.push(hunk); + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + + oldLine += lines.length; + newLine += lines.length; + } + }; + + for (var i = 0; i < diff.length; i++) { + _loop(i); + } + + return { + oldFileName: oldFileName, + newFileName: newFileName, + oldHeader: oldHeader, + newHeader: newHeader, + hunks: hunks + }; + } + function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); + var ret = []; + + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); + } + + ret.push('==================================================================='); + ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); + ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); + + for (var i = 0; i < diff.hunks.length; i++) { + var hunk = diff.hunks[i]; + ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); + ret.push.apply(ret, hunk.lines); + } + + return ret.join('\n') + '\n'; + } + function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { + return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); + } + + function arrayEqual(a, b) { + if (a.length !== b.length) { + return false; + } + + return arrayStartsWith(a, b); + } + function arrayStartsWith(array, start) { + if (start.length > array.length) { + return false; + } + + for (var i = 0; i < start.length; i++) { + if (start[i] !== array[i]) { + return false; + } + } + + return true; + } + + function calcLineCount(hunk) { + var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines), + oldLines = _calcOldNewLineCount.oldLines, + newLines = _calcOldNewLineCount.newLines; + + if (oldLines !== undefined) { + hunk.oldLines = oldLines; + } else { + delete hunk.oldLines; + } + + if (newLines !== undefined) { + hunk.newLines = newLines; + } else { + delete hunk.newLines; + } + } + function merge(mine, theirs, base) { + mine = loadPatch(mine, base); + theirs = loadPatch(theirs, base); + var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning. + // Leaving sanity checks on this to the API consumer that may know more about the + // meaning in their own context. + + if (mine.index || theirs.index) { + ret.index = mine.index || theirs.index; + } + + if (mine.newFileName || theirs.newFileName) { + if (!fileNameChanged(mine)) { + // No header or no change in ours, use theirs (and ours if theirs does not exist) + ret.oldFileName = theirs.oldFileName || mine.oldFileName; + ret.newFileName = theirs.newFileName || mine.newFileName; + ret.oldHeader = theirs.oldHeader || mine.oldHeader; + ret.newHeader = theirs.newHeader || mine.newHeader; + } else if (!fileNameChanged(theirs)) { + // No header or no change in theirs, use ours + ret.oldFileName = mine.oldFileName; + ret.newFileName = mine.newFileName; + ret.oldHeader = mine.oldHeader; + ret.newHeader = mine.newHeader; + } else { + // Both changed... figure it out + ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); + ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); + ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); + ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); + } + } + + ret.hunks = []; + var mineIndex = 0, + theirsIndex = 0, + mineOffset = 0, + theirsOffset = 0; + + while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { + var mineCurrent = mine.hunks[mineIndex] || { + oldStart: Infinity + }, + theirsCurrent = theirs.hunks[theirsIndex] || { + oldStart: Infinity + }; + + if (hunkBefore(mineCurrent, theirsCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); + mineIndex++; + theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; + } else if (hunkBefore(theirsCurrent, mineCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); + theirsIndex++; + mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; + } else { + // Overlap, merge as best we can + var mergedHunk = { + oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), + oldLines: 0, + newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), + newLines: 0, + lines: [] + }; + mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); + theirsIndex++; + mineIndex++; + ret.hunks.push(mergedHunk); + } + } + + return ret; + } + + function loadPatch(param, base) { + if (typeof param === 'string') { + if (/^@@/m.test(param) || /^Index:/m.test(param)) { + return parsePatch(param)[0]; + } + + if (!base) { + throw new Error('Must provide a base reference or pass in a patch'); + } + + return structuredPatch(undefined, undefined, base, param); + } + + return param; + } + + function fileNameChanged(patch) { + return patch.newFileName && patch.newFileName !== patch.oldFileName; + } + + function selectField(index, mine, theirs) { + if (mine === theirs) { + return mine; + } else { + index.conflict = true; + return { + mine: mine, + theirs: theirs + }; + } + } + + function hunkBefore(test, check) { + return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; + } + + function cloneHunk(hunk, offset) { + return { + oldStart: hunk.oldStart, + oldLines: hunk.oldLines, + newStart: hunk.newStart + offset, + newLines: hunk.newLines, + lines: hunk.lines + }; + } + + function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { + // This will generally result in a conflicted hunk, but there are cases where the context + // is the only overlap where we can successfully merge the content here. + var mine = { + offset: mineOffset, + lines: mineLines, + index: 0 + }, + their = { + offset: theirOffset, + lines: theirLines, + index: 0 + }; // Handle any leading content + + insertLeading(hunk, mine, their); + insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each. + + while (mine.index < mine.lines.length && their.index < their.lines.length) { + var mineCurrent = mine.lines[mine.index], + theirCurrent = their.lines[their.index]; + + if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { + // Both modified ... + mutualChange(hunk, mine, their); + } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { + var _hunk$lines; + + // Mine inserted + (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine))); + } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { + var _hunk$lines2; + + // Theirs inserted + (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their))); + } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { + // Mine removed or edited + removal(hunk, mine, their); + } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { + // Their removed or edited + removal(hunk, their, mine, true); + } else if (mineCurrent === theirCurrent) { + // Context identity + hunk.lines.push(mineCurrent); + mine.index++; + their.index++; + } else { + // Context mismatch + conflict(hunk, collectChange(mine), collectChange(their)); + } + } // Now push anything that may be remaining + + + insertTrailing(hunk, mine); + insertTrailing(hunk, their); + calcLineCount(hunk); + } + + function mutualChange(hunk, mine, their) { + var myChanges = collectChange(mine), + theirChanges = collectChange(their); + + if (allRemoves(myChanges) && allRemoves(theirChanges)) { + // Special case for remove changes that are supersets of one another + if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { + var _hunk$lines3; + + (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges)); + + return; + } else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { + var _hunk$lines4; + + (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges)); + + return; + } + } else if (arrayEqual(myChanges, theirChanges)) { + var _hunk$lines5; + + (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges)); + + return; + } + + conflict(hunk, myChanges, theirChanges); + } + + function removal(hunk, mine, their, swap) { + var myChanges = collectChange(mine), + theirChanges = collectContext(their, myChanges); + + if (theirChanges.merged) { + var _hunk$lines6; + + (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged)); + } else { + conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); + } + } + + function conflict(hunk, mine, their) { + hunk.conflict = true; + hunk.lines.push({ + conflict: true, + mine: mine, + theirs: their + }); + } + + function insertLeading(hunk, insert, their) { + while (insert.offset < their.offset && insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + insert.offset++; + } + } + + function insertTrailing(hunk, insert) { + while (insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + } + } + + function collectChange(state) { + var ret = [], + operation = state.lines[state.index][0]; + + while (state.index < state.lines.length) { + var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. + + if (operation === '-' && line[0] === '+') { + operation = '+'; + } + + if (operation === line[0]) { + ret.push(line); + state.index++; + } else { + break; + } + } + + return ret; + } + + function collectContext(state, matchChanges) { + var changes = [], + merged = [], + matchIndex = 0, + contextChanges = false, + conflicted = false; + + while (matchIndex < matchChanges.length && state.index < state.lines.length) { + var change = state.lines[state.index], + match = matchChanges[matchIndex]; // Once we've hit our add, then we are done + + if (match[0] === '+') { + break; + } + + contextChanges = contextChanges || change[0] !== ' '; + merged.push(match); + matchIndex++; // Consume any additions in the other block as a conflict to attempt + // to pull in the remaining context after this + + if (change[0] === '+') { + conflicted = true; + + while (change[0] === '+') { + changes.push(change); + change = state.lines[++state.index]; + } + } + + if (match.substr(1) === change.substr(1)) { + changes.push(change); + state.index++; + } else { + conflicted = true; + } + } + + if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { + conflicted = true; + } + + if (conflicted) { + return changes; + } + + while (matchIndex < matchChanges.length) { + merged.push(matchChanges[matchIndex++]); + } + + return { + merged: merged, + changes: changes + }; + } + + function allRemoves(changes) { + return changes.reduce(function (prev, change) { + return prev && change[0] === '-'; + }, true); + } + + function skipRemoveSuperset(state, removeChanges, delta) { + for (var i = 0; i < delta; i++) { + var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); + + if (state.lines[state.index + i] !== ' ' + changeContent) { + return false; + } + } + + state.index += delta; + return true; + } + + function calcOldNewLineCount(lines) { + var oldLines = 0; + var newLines = 0; + lines.forEach(function (line) { + if (typeof line !== 'string') { + var myCount = calcOldNewLineCount(line.mine); + var theirCount = calcOldNewLineCount(line.theirs); + + if (oldLines !== undefined) { + if (myCount.oldLines === theirCount.oldLines) { + oldLines += myCount.oldLines; + } else { + oldLines = undefined; + } + } + + if (newLines !== undefined) { + if (myCount.newLines === theirCount.newLines) { + newLines += myCount.newLines; + } else { + newLines = undefined; + } + } + } else { + if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { + newLines++; + } + + if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { + oldLines++; + } + } + }); + return { + oldLines: oldLines, + newLines: newLines + }; + } + + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + function convertChangesToDMP(changes) { + var ret = [], + change, + operation; + + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + + ret.push([operation, change.value]); + } + + return ret; + } + + function convertChangesToXML(changes) { + var ret = []; + + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + + return ret.join(''); + } + + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + return n; + } + + /* See LICENSE file for terms of use */ + + exports.Diff = Diff; + exports.diffChars = diffChars; + exports.diffWords = diffWords; + exports.diffWordsWithSpace = diffWordsWithSpace; + exports.diffLines = diffLines; + exports.diffTrimmedLines = diffTrimmedLines; + exports.diffSentences = diffSentences; + exports.diffCss = diffCss; + exports.diffJson = diffJson; + exports.diffArrays = diffArrays; + exports.structuredPatch = structuredPatch; + exports.createTwoFilesPatch = createTwoFilesPatch; + exports.createPatch = createPatch; + exports.applyPatch = applyPatch; + exports.applyPatches = applyPatches; + exports.parsePatch = parsePatch; + exports.merge = merge; + exports.convertChangesToDMP = convertChangesToDMP; + exports.convertChangesToXML = convertChangesToXML; + exports.canonicalize = canonicalize; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); + +},{}],87:[function(require,module,exports){ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; + +},{}],88:[function(require,module,exports){ +module.exports = extend; + +/* + var obj = {a: 3, b: 5}; + extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8} + obj; // {a: 4, b: 5, c: 8} + + var obj = {a: 3, b: 5}; + extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8} + obj; // {a: 3, b: 5} + + var arr = [1, 2, 3]; + var obj = {a: 3, b: 5}; + extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]} + arr.push(4); + obj; // {a: 3, b: 5, c: [1, 2, 3, 4]} + + var arr = [1, 2, 3]; + var obj = {a: 3, b: 5}; + extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]} + arr.push(4); + obj; // {a: 3, b: 5, c: [1, 2, 3]} + + extend({a: 4, b: 5}); // {a: 4, b: 5} + extend({a: 4, b: 5}, 3); {a: 4, b: 5} + extend({a: 4, b: 5}, true); {a: 4, b: 5} + extend('hello', {a: 4, b: 5}); // throws + extend(3, {a: 4, b: 5}); // throws +*/ + +function extend(/* [deep], obj1, obj2, [objn] */) { + var args = [].slice.call(arguments); + var deep = false; + if (typeof args[0] == 'boolean') { + deep = args.shift(); + } + var result = args[0]; + if (isUnextendable(result)) { + throw new Error('extendee must be an object'); + } + var extenders = args.slice(1); + var len = extenders.length; + for (var i = 0; i < len; i++) { + var extender = extenders[i]; + for (var key in extender) { + if (extender.hasOwnProperty(key)) { + var value = extender[key]; + if (deep && isCloneable(value)) { + var base = Array.isArray(value) ? [] : {}; + result[key] = extend( + true, + result.hasOwnProperty(key) && !isUnextendable(result[key]) + ? result[key] + : base, + value + ); + } else { + result[key] = value; + } + } + } + } + return result; +} + +function isCloneable(obj) { + return Array.isArray(obj) || {}.toString.call(obj) == '[object Object]'; +} + +function isUnextendable(val) { + return !val || (typeof val != 'object' && typeof val != 'function'); +} + +},{}],89:[function(require,module,exports){ +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** `Object#toString` result references. */ +var funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + symbolTag = '[object Symbol]'; + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Symbol = root.Symbol, + splice = arrayProto.splice; + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value) { + return isArray(value) ? value : stringToPath(value); +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoize(function(string) { + string = toString(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} + +// Assign cache to `_.memoize`. +memoize.Cache = MapCache; + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); +} + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +module.exports = get; + +},{}],90:[function(require,module,exports){ +"use strict"; + +// cache a reference to setTimeout, so that our reference won't be stubbed out +// when using fake timers and errors will still get logged +// https://github.com/cjohansen/Sinon.JS/issues/381 +var realSetTimeout = setTimeout; + +function configureLogger(config) { + // eslint-disable-next-line no-param-reassign + config = config || {}; + // Function which prints errors. + if (!config.hasOwnProperty("logger")) { + // eslint-disable-next-line no-empty-function + config.logger = function() {}; + } + // When set to true, any errors logged will be thrown immediately; + // If set to false, the errors will be thrown in separate execution frame. + if (!config.hasOwnProperty("useImmediateExceptions")) { + config.useImmediateExceptions = true; + } + // wrap realSetTimeout with something we can stub in tests + if (!config.hasOwnProperty("setTimeout")) { + config.setTimeout = realSetTimeout; + } + + return function logError(label, e) { + var msg = label + " threw exception: "; + var err = { + name: e.name || label, + message: e.message || e.toString(), + stack: e.stack + }; + + function throwLoggedError() { + err.message = msg + err.message; + throw err; + } + + config.logger(msg + "[" + err.name + "] " + err.message); + + if (err.stack) { + config.logger(err.stack); + } + + if (config.useImmediateExceptions) { + throwLoggedError(); + } else { + config.setTimeout(throwLoggedError, 0); + } + }; +} + +module.exports = configureLogger; + +},{}],91:[function(require,module,exports){ +"use strict"; + +var Event = require("./event"); + +function CustomEvent(type, customData, target) { + this.initEvent(type, false, false, target); + this.detail = customData.detail || null; +} + +CustomEvent.prototype = new Event(); + +CustomEvent.prototype.constructor = CustomEvent; + +module.exports = CustomEvent; + +},{"./event":93}],92:[function(require,module,exports){ +"use strict"; + +function flattenOptions(options) { + if (options !== Object(options)) { + return { + capture: Boolean(options), + once: false, + passive: false + }; + } + return { + capture: Boolean(options.capture), + once: Boolean(options.once), + passive: Boolean(options.passive) + }; +} +function not(fn) { + return function() { + return !fn.apply(this, arguments); + }; +} +function hasListenerFilter(listener, capture) { + return function(listenerSpec) { + return ( + listenerSpec.capture === capture && + listenerSpec.listener === listener + ); + }; +} + +var EventTarget = { + // https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener + addEventListener: function addEventListener( + event, + listener, + providedOptions + ) { + // 3. Let capture, passive, and once be the result of flattening more options. + // Flatten property before executing step 2, + // feture detection is usually based on registering handler with options object, + // that has getter defined + // addEventListener("load", () => {}, { + // get once() { supportsOnce = true; } + // }); + var options = flattenOptions(providedOptions); + + // 2. If callback is null, then return. + if (listener === null || listener === undefined) { + return; + } + + this.eventListeners = this.eventListeners || {}; + this.eventListeners[event] = this.eventListeners[event] || []; + + // 4. If context object’s associated list of event listener + // does not contain an event listener whose type is type, + // callback is callback, and capture is capture, then append + // a new event listener to it, whose type is type, callback is + // callback, capture is capture, passive is passive, and once is once. + if ( + !this.eventListeners[event].some( + hasListenerFilter(listener, options.capture) + ) + ) { + this.eventListeners[event].push({ + listener: listener, + capture: options.capture, + once: options.once + }); + } + }, + + // https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener + removeEventListener: function removeEventListener( + event, + listener, + providedOptions + ) { + if (!this.eventListeners || !this.eventListeners[event]) { + return; + } + + // 2. Let capture be the result of flattening options. + var options = flattenOptions(providedOptions); + + // 3. If there is an event listener in the associated list of + // event listeners whose type is type, callback is callback, + // and capture is capture, then set that event listener’s + // removed to true and remove it from the associated list of event listeners. + this.eventListeners[event] = this.eventListeners[event].filter( + not(hasListenerFilter(listener, options.capture)) + ); + }, + + dispatchEvent: function dispatchEvent(event) { + if (!this.eventListeners || !this.eventListeners[event.type]) { + return Boolean(event.defaultPrevented); + } + + var self = this; + var type = event.type; + var listeners = self.eventListeners[type]; + + // Remove listeners, that should be dispatched once + // before running dispatch loop to avoid nested dispatch issues + self.eventListeners[type] = listeners.filter(function(listenerSpec) { + return !listenerSpec.once; + }); + listeners.forEach(function(listenerSpec) { + var listener = listenerSpec.listener; + if (typeof listener === "function") { + listener.call(self, event); + } else { + listener.handleEvent(event); + } + }); + + return Boolean(event.defaultPrevented); + } +}; + +module.exports = EventTarget; + +},{}],93:[function(require,module,exports){ +"use strict"; + +function Event(type, bubbles, cancelable, target) { + this.initEvent(type, bubbles, cancelable, target); +} + +Event.prototype = { + initEvent: function(type, bubbles, cancelable, target) { + this.type = type; + this.bubbles = bubbles; + this.cancelable = cancelable; + this.target = target; + this.currentTarget = target; + }, + + // eslint-disable-next-line no-empty-function + stopPropagation: function() {}, + + preventDefault: function() { + this.defaultPrevented = true; + } +}; + +module.exports = Event; + +},{}],94:[function(require,module,exports){ +"use strict"; + +module.exports = { + Event: require("./event"), + ProgressEvent: require("./progress-event"), + CustomEvent: require("./custom-event"), + EventTarget: require("./event-target") +}; + +},{"./custom-event":91,"./event":93,"./event-target":92,"./progress-event":95}],95:[function(require,module,exports){ +"use strict"; + +var Event = require("./event"); + +function ProgressEvent(type, progressEventRaw, target) { + this.initEvent(type, false, false, target); + this.loaded = + typeof progressEventRaw.loaded === "number" + ? progressEventRaw.loaded + : null; + this.total = + typeof progressEventRaw.total === "number" + ? progressEventRaw.total + : null; + this.lengthComputable = Boolean(progressEventRaw.total); +} + +ProgressEvent.prototype = new Event(); + +ProgressEvent.prototype.constructor = ProgressEvent; + +module.exports = ProgressEvent; + +},{"./event":93}],96:[function(require,module,exports){ +"use strict"; + +var FakeTimers = require("@sinonjs/fake-timers"); +var fakeServer = require("./index"); + +// eslint-disable-next-line no-empty-function +function Server() {} +Server.prototype = fakeServer; + +var fakeServerWithClock = new Server(); + +fakeServerWithClock.addRequest = function addRequest(xhr) { + if (xhr.async) { + if (typeof setTimeout.clock === "object") { + this.clock = setTimeout.clock; + } else { + this.clock = FakeTimers.install(); + this.resetClock = true; + } + + if (!this.longestTimeout) { + var clockSetTimeout = this.clock.setTimeout; + var clockSetInterval = this.clock.setInterval; + var server = this; + + this.clock.setTimeout = function(fn, timeout) { + server.longestTimeout = Math.max( + timeout, + server.longestTimeout || 0 + ); + + return clockSetTimeout.apply(this, arguments); + }; + + this.clock.setInterval = function(fn, timeout) { + server.longestTimeout = Math.max( + timeout, + server.longestTimeout || 0 + ); + + return clockSetInterval.apply(this, arguments); + }; + } + } + + return fakeServer.addRequest.call(this, xhr); +}; + +fakeServerWithClock.respond = function respond() { + var returnVal = fakeServer.respond.apply(this, arguments); + + if (this.clock) { + this.clock.tick(this.longestTimeout || 0); + this.longestTimeout = 0; + + if (this.resetClock) { + this.clock.uninstall(); + this.resetClock = false; + } + } + + return returnVal; +}; + +fakeServerWithClock.restore = function restore() { + if (this.clock) { + this.clock.uninstall(); + } + + return fakeServer.restore.apply(this, arguments); +}; + +module.exports = fakeServerWithClock; + +},{"./index":97,"@sinonjs/fake-timers":56}],97:[function(require,module,exports){ +"use strict"; + +var fakeXhr = require("../fake-xhr"); +var push = [].push; +var log = require("./log"); +var configureLogError = require("../configure-logger"); +var pathToRegexp = require("path-to-regexp"); + +var supportsArrayBuffer = typeof ArrayBuffer !== "undefined"; + +function responseArray(handler) { + var response = handler; + + if (Object.prototype.toString.call(handler) !== "[object Array]") { + response = [200, {}, handler]; + } + + if (typeof response[2] !== "string") { + if (!supportsArrayBuffer) { + throw new TypeError( + "Fake server response body should be a string, but was " + + typeof response[2] + ); + } else if (!(response[2] instanceof ArrayBuffer)) { + throw new TypeError( + "Fake server response body should be a string or ArrayBuffer, but was " + + typeof response[2] + ); + } + } + + return response; +} + +function getDefaultWindowLocation() { + var winloc = { + hostname: "localhost", + port: process.env.PORT || 80, + protocol: "http:" + }; + winloc.host = + winloc.hostname + + (String(winloc.port) === "80" ? "" : ":" + winloc.port); + return winloc; +} + +function getWindowLocation() { + if (typeof window === "undefined") { + // Fallback + return getDefaultWindowLocation(); + } + + if (typeof window.location !== "undefined") { + // Browsers place location on window + return window.location; + } + + if ( + typeof window.window !== "undefined" && + typeof window.window.location !== "undefined" + ) { + // React Native on Android places location on window.window + return window.window.location; + } + + return getDefaultWindowLocation(); +} + +function matchOne(response, reqMethod, reqUrl) { + var rmeth = response.method; + var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase(); + var url = response.url; + var matchUrl = + !url || + url === reqUrl || + (typeof url.test === "function" && url.test(reqUrl)); + + return matchMethod && matchUrl; +} + +function match(response, request) { + var wloc = getWindowLocation(); + + var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host + "/"); + + var requestUrl = request.url; + + if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) { + requestUrl = requestUrl.replace(rCurrLoc, "/"); + } + + if (matchOne(response, this.getHTTPMethod(request), requestUrl)) { + if (typeof response.response === "function") { + var ru = response.url; + var args = [request].concat( + ru && typeof ru.exec === "function" + ? ru.exec(requestUrl).slice(1) + : [] + ); + return response.response.apply(response, args); + } + + return true; + } + + return false; +} + +function incrementRequestCount() { + var count = ++this.requestCount; + + this.requested = true; + + this.requestedOnce = count === 1; + this.requestedTwice = count === 2; + this.requestedThrice = count === 3; + + this.firstRequest = this.getRequest(0); + this.secondRequest = this.getRequest(1); + this.thirdRequest = this.getRequest(2); + + this.lastRequest = this.getRequest(count - 1); +} + +var fakeServer = { + create: function(config) { + var server = Object.create(this); + server.configure(config); + this.xhr = fakeXhr.useFakeXMLHttpRequest(); + server.requests = []; + server.requestCount = 0; + server.queue = []; + server.responses = []; + + this.xhr.onCreate = function(xhrObj) { + xhrObj.unsafeHeadersEnabled = function() { + return !(server.unsafeHeadersEnabled === false); + }; + server.addRequest(xhrObj); + }; + + return server; + }, + + configure: function(config) { + var self = this; + var whitelist = { + autoRespond: true, + autoRespondAfter: true, + respondImmediately: true, + fakeHTTPMethods: true, + logger: true, + unsafeHeadersEnabled: true + }; + + // eslint-disable-next-line no-param-reassign + config = config || {}; + + Object.keys(config).forEach(function(setting) { + if (setting in whitelist) { + self[setting] = config[setting]; + } + }); + + self.logError = configureLogError(config); + }, + + addRequest: function addRequest(xhrObj) { + var server = this; + push.call(this.requests, xhrObj); + + incrementRequestCount.call(this); + + xhrObj.onSend = function() { + server.handleRequest(this); + + if (server.respondImmediately) { + server.respond(); + } else if (server.autoRespond && !server.responding) { + setTimeout(function() { + server.responding = false; + server.respond(); + }, server.autoRespondAfter || 10); + + server.responding = true; + } + }; + }, + + getHTTPMethod: function getHTTPMethod(request) { + if (this.fakeHTTPMethods && /post/i.test(request.method)) { + var matches = (request.requestBody || "").match( + /_method=([^\b;]+)/ + ); + return matches ? matches[1] : request.method; + } + + return request.method; + }, + + handleRequest: function handleRequest(xhr) { + if (xhr.async) { + push.call(this.queue, xhr); + } else { + this.processRequest(xhr); + } + }, + + logger: function() { + // no-op; override via configure() + }, + + logError: configureLogError({}), + + log: log, + + respondWith: function respondWith(method, url, body) { + if (arguments.length === 1 && typeof method !== "function") { + this.response = responseArray(method); + return; + } + + if (arguments.length === 1) { + // eslint-disable-next-line no-param-reassign + body = method; + // eslint-disable-next-line no-param-reassign + url = method = null; + } + + if (arguments.length === 2) { + // eslint-disable-next-line no-param-reassign + body = url; + // eslint-disable-next-line no-param-reassign + url = method; + // eslint-disable-next-line no-param-reassign + method = null; + } + + // Escape port number to prevent "named" parameters in 'path-to-regexp' module + if (typeof url === "string" && url !== "" && /:[0-9]+\//.test(url)) { + var m = url.match(/^(https?:\/\/.*?):([0-9]+\/.*)$/); + // eslint-disable-next-line no-param-reassign + url = m[1] + "\\:" + m[2]; + } + + push.call(this.responses, { + method: method, + url: + typeof url === "string" && url !== "" ? pathToRegexp(url) : url, + response: typeof body === "function" ? body : responseArray(body) + }); + }, + + respond: function respond() { + if (arguments.length > 0) { + this.respondWith.apply(this, arguments); + } + + var queue = this.queue || []; + var requests = queue.splice(0, queue.length); + var self = this; + + requests.forEach(function(request) { + self.processRequest(request); + }); + }, + + respondAll: function respondAll() { + if (this.respondImmediately) { + return; + } + + this.queue = this.requests.slice(0); + + var request; + while ((request = this.queue.shift())) { + this.processRequest(request); + } + }, + + processRequest: function processRequest(request) { + try { + if (request.aborted) { + return; + } + + var response = this.response || [404, {}, ""]; + + if (this.responses) { + for (var l = this.responses.length, i = l - 1; i >= 0; i--) { + if (match.call(this, this.responses[i], request)) { + response = this.responses[i].response; + break; + } + } + } + + if (request.readyState !== 4) { + this.log(response, request); + + request.respond(response[0], response[1], response[2]); + } + } catch (e) { + this.logError("Fake server request processing", e); + } + }, + + restore: function restore() { + return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments); + }, + + getRequest: function getRequest(index) { + return this.requests[index] || null; + }, + + reset: function reset() { + this.resetBehavior(); + this.resetHistory(); + }, + + resetBehavior: function resetBehavior() { + this.responses.length = this.queue.length = 0; + }, + + resetHistory: function resetHistory() { + this.requests.length = this.requestCount = 0; + + this.requestedOnce = this.requestedTwice = this.requestedThrice = this.requested = false; + + this.firstRequest = this.secondRequest = this.thirdRequest = this.lastRequest = null; + } +}; + +module.exports = fakeServer; + +},{"../configure-logger":90,"../fake-xhr":100,"./log":98,"path-to-regexp":102}],98:[function(require,module,exports){ +"use strict"; +var inspect = require("util").inspect; + +function log(response, request) { + var str; + + str = "Request:\n" + inspect(request) + "\n\n"; + str += "Response:\n" + inspect(response) + "\n\n"; + + /* istanbul ignore else: when this.logger is not a function, it can't be called */ + if (typeof this.logger === "function") { + this.logger(str); + } +} + +module.exports = log; + +},{"util":107}],99:[function(require,module,exports){ +"use strict"; + +exports.isSupported = (function() { + try { + return Boolean(new Blob()); + } catch (e) { + return false; + } +})(); + +},{}],100:[function(require,module,exports){ +"use strict"; + +var GlobalTextEncoder = + typeof TextEncoder !== "undefined" + ? TextEncoder + : require("@sinonjs/text-encoding").TextEncoder; +var globalObject = require("@sinonjs/commons").global; +var configureLogError = require("../configure-logger"); +var sinonEvent = require("../event"); +var extend = require("just-extend"); + +var supportsProgress = typeof ProgressEvent !== "undefined"; +var supportsCustomEvent = typeof CustomEvent !== "undefined"; +var supportsFormData = typeof FormData !== "undefined"; +var supportsArrayBuffer = typeof ArrayBuffer !== "undefined"; +var supportsBlob = require("./blob").isSupported; + +function getWorkingXHR(globalScope) { + var supportsXHR = typeof globalScope.XMLHttpRequest !== "undefined"; + if (supportsXHR) { + return globalScope.XMLHttpRequest; + } + + var supportsActiveX = typeof globalScope.ActiveXObject !== "undefined"; + if (supportsActiveX) { + return function() { + return new globalScope.ActiveXObject("MSXML2.XMLHTTP.3.0"); + }; + } + + return false; +} + +// Ref: https://fetch.spec.whatwg.org/#forbidden-header-name +var unsafeHeaders = { + "Accept-Charset": true, + "Access-Control-Request-Headers": true, + "Access-Control-Request-Method": true, + "Accept-Encoding": true, + Connection: true, + "Content-Length": true, + Cookie: true, + Cookie2: true, + "Content-Transfer-Encoding": true, + Date: true, + DNT: true, + Expect: true, + Host: true, + "Keep-Alive": true, + Origin: true, + Referer: true, + TE: true, + Trailer: true, + "Transfer-Encoding": true, + Upgrade: true, + "User-Agent": true, + Via: true +}; + +function EventTargetHandler() { + var self = this; + var events = [ + "loadstart", + "progress", + "abort", + "error", + "load", + "timeout", + "loadend" + ]; + + function addEventListener(eventName) { + self.addEventListener(eventName, function(event) { + var listener = self["on" + eventName]; + + if (listener && typeof listener === "function") { + listener.call(this, event); + } + }); + } + + events.forEach(addEventListener); +} + +EventTargetHandler.prototype = sinonEvent.EventTarget; + +function normalizeHeaderValue(value) { + // Ref: https://fetch.spec.whatwg.org/#http-whitespace-bytes + /*eslint no-control-regex: "off"*/ + return value.replace(/^[\x09\x0A\x0D\x20]+|[\x09\x0A\x0D\x20]+$/g, ""); +} + +function getHeader(headers, header) { + var foundHeader = Object.keys(headers).filter(function(h) { + return h.toLowerCase() === header.toLowerCase(); + }); + + return foundHeader[0] || null; +} + +function excludeSetCookie2Header(header) { + return !/^Set-Cookie2?$/i.test(header); +} + +function verifyResponseBodyType(body, responseType) { + var error = null; + var isString = typeof body === "string"; + + if (responseType === "arraybuffer") { + if (!isString && !(body instanceof ArrayBuffer)) { + error = new Error( + "Attempted to respond to fake XMLHttpRequest with " + + body + + ", which is not a string or ArrayBuffer." + ); + error.name = "InvalidBodyException"; + } + } else if (!isString) { + error = new Error( + "Attempted to respond to fake XMLHttpRequest with " + + body + + ", which is not a string." + ); + error.name = "InvalidBodyException"; + } + + if (error) { + throw error; + } +} + +function convertToArrayBuffer(body, encoding) { + if (body instanceof ArrayBuffer) { + return body; + } + + return new GlobalTextEncoder(encoding || "utf-8").encode(body).buffer; +} + +function isXmlContentType(contentType) { + return ( + !contentType || + /(text\/xml)|(application\/xml)|(\+xml)/.test(contentType) + ); +} + +function clearResponse(xhr) { + if (xhr.responseType === "" || xhr.responseType === "text") { + xhr.response = xhr.responseText = ""; + } else { + xhr.response = xhr.responseText = null; + } + xhr.responseXML = null; +} + +function fakeXMLHttpRequestFor(globalScope) { + var isReactNative = + globalScope.navigator && + globalScope.navigator.product === "ReactNative"; + var sinonXhr = { XMLHttpRequest: globalScope.XMLHttpRequest }; + sinonXhr.GlobalXMLHttpRequest = globalScope.XMLHttpRequest; + sinonXhr.GlobalActiveXObject = globalScope.ActiveXObject; + sinonXhr.supportsActiveX = + typeof sinonXhr.GlobalActiveXObject !== "undefined"; + sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== "undefined"; + sinonXhr.workingXHR = getWorkingXHR(globalScope); + sinonXhr.supportsTimeout = + sinonXhr.supportsXHR && + "timeout" in new sinonXhr.GlobalXMLHttpRequest(); + sinonXhr.supportsCORS = + isReactNative || + (sinonXhr.supportsXHR && + "withCredentials" in new sinonXhr.GlobalXMLHttpRequest()); + + // Note that for FakeXMLHttpRequest to work pre ES5 + // we lose some of the alignment with the spec. + // To ensure as close a match as possible, + // set responseType before calling open, send or respond; + function FakeXMLHttpRequest(config) { + EventTargetHandler.call(this); + this.readyState = FakeXMLHttpRequest.UNSENT; + this.requestHeaders = {}; + this.requestBody = null; + this.status = 0; + this.statusText = ""; + this.upload = new EventTargetHandler(); + this.responseType = ""; + this.response = ""; + this.logError = configureLogError(config); + + if (sinonXhr.supportsTimeout) { + this.timeout = 0; + } + + if (sinonXhr.supportsCORS) { + this.withCredentials = false; + } + + if (typeof FakeXMLHttpRequest.onCreate === "function") { + FakeXMLHttpRequest.onCreate(this); + } + } + + function verifyState(xhr) { + if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { + throw new Error("INVALID_STATE_ERR"); + } + + if (xhr.sendFlag) { + throw new Error("INVALID_STATE_ERR"); + } + } + + // largest arity in XHR is 5 - XHR#open + var apply = function(obj, method, args) { + switch (args.length) { + case 0: + return obj[method](); + case 1: + return obj[method](args[0]); + case 2: + return obj[method](args[0], args[1]); + case 3: + return obj[method](args[0], args[1], args[2]); + case 4: + return obj[method](args[0], args[1], args[2], args[3]); + case 5: + return obj[method](args[0], args[1], args[2], args[3], args[4]); + default: + throw new Error("Unhandled case"); + } + }; + + FakeXMLHttpRequest.filters = []; + FakeXMLHttpRequest.addFilter = function addFilter(fn) { + this.filters.push(fn); + }; + FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) { + var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap + + [ + "open", + "setRequestHeader", + "abort", + "getResponseHeader", + "getAllResponseHeaders", + "addEventListener", + "overrideMimeType", + "removeEventListener" + ].forEach(function(method) { + fakeXhr[method] = function() { + return apply(xhr, method, arguments); + }; + }); + + fakeXhr.send = function() { + // Ref: https://xhr.spec.whatwg.org/#the-responsetype-attribute + if (xhr.responseType !== fakeXhr.responseType) { + xhr.responseType = fakeXhr.responseType; + } + return apply(xhr, "send", arguments); + }; + + var copyAttrs = function(args) { + args.forEach(function(attr) { + fakeXhr[attr] = xhr[attr]; + }); + }; + + var stateChangeStart = function() { + fakeXhr.readyState = xhr.readyState; + if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) { + copyAttrs(["status", "statusText"]); + } + if (xhr.readyState >= FakeXMLHttpRequest.LOADING) { + copyAttrs(["response"]); + if (xhr.responseType === "" || xhr.responseType === "text") { + copyAttrs(["responseText"]); + } + } + if ( + xhr.readyState === FakeXMLHttpRequest.DONE && + (xhr.responseType === "" || xhr.responseType === "document") + ) { + copyAttrs(["responseXML"]); + } + }; + + var stateChangeEnd = function() { + if (fakeXhr.onreadystatechange) { + // eslint-disable-next-line no-useless-call + fakeXhr.onreadystatechange.call(fakeXhr, { + target: fakeXhr, + currentTarget: fakeXhr + }); + } + }; + + var stateChange = function stateChange() { + stateChangeStart(); + stateChangeEnd(); + }; + + if (xhr.addEventListener) { + xhr.addEventListener("readystatechange", stateChangeStart); + + Object.keys(fakeXhr.eventListeners).forEach(function(event) { + /*eslint-disable no-loop-func*/ + fakeXhr.eventListeners[event].forEach(function(handler) { + xhr.addEventListener(event, handler.listener, { + capture: handler.capture, + once: handler.once + }); + }); + /*eslint-enable no-loop-func*/ + }); + + xhr.addEventListener("readystatechange", stateChangeEnd); + } else { + xhr.onreadystatechange = stateChange; + } + apply(xhr, "open", xhrArgs); + }; + FakeXMLHttpRequest.useFilters = false; + + function verifyRequestOpened(xhr) { + if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { + throw new Error("INVALID_STATE_ERR - " + xhr.readyState); + } + } + + function verifyRequestSent(xhr) { + if (xhr.readyState === FakeXMLHttpRequest.DONE) { + throw new Error("Request done"); + } + } + + function verifyHeadersReceived(xhr) { + if ( + xhr.async && + xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED + ) { + throw new Error("No headers received"); + } + } + + function convertResponseBody(responseType, contentType, body) { + if (responseType === "" || responseType === "text") { + return body; + } else if (supportsArrayBuffer && responseType === "arraybuffer") { + return convertToArrayBuffer(body); + } else if (responseType === "json") { + try { + return JSON.parse(body); + } catch (e) { + // Return parsing failure as null + return null; + } + } else if (supportsBlob && responseType === "blob") { + var blobOptions = {}; + if (contentType) { + blobOptions.type = contentType; + } + return new Blob([convertToArrayBuffer(body)], blobOptions); + } else if (responseType === "document") { + if (isXmlContentType(contentType)) { + return FakeXMLHttpRequest.parseXML(body); + } + return null; + } + throw new Error("Invalid responseType " + responseType); + } + + /** + * Steps to follow when there is an error, according to: + * https://xhr.spec.whatwg.org/#request-error-steps + */ + function requestErrorSteps(xhr) { + clearResponse(xhr); + xhr.errorFlag = true; + xhr.requestHeaders = {}; + xhr.responseHeaders = {}; + + if ( + xhr.readyState !== FakeXMLHttpRequest.UNSENT && + xhr.sendFlag && + xhr.readyState !== FakeXMLHttpRequest.DONE + ) { + xhr.readyStateChange(FakeXMLHttpRequest.DONE); + xhr.sendFlag = false; + } + } + + FakeXMLHttpRequest.parseXML = function parseXML(text) { + // Treat empty string as parsing failure + if (text !== "") { + try { + if (typeof DOMParser !== "undefined") { + var parser = new DOMParser(); + var parsererrorNS = ""; + + try { + var parsererrors = parser + .parseFromString("INVALID", "text/xml") + .getElementsByTagName("parsererror"); + if (parsererrors.length) { + parsererrorNS = parsererrors[0].namespaceURI; + } + } catch (e) { + // passing invalid XML makes IE11 throw + // so no namespace needs to be determined + } + + var result; + try { + result = parser.parseFromString(text, "text/xml"); + } catch (err) { + return null; + } + + return result.getElementsByTagNameNS( + parsererrorNS, + "parsererror" + ).length + ? null + : result; + } + var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.async = "false"; + xmlDoc.loadXML(text); + return xmlDoc.parseError.errorCode !== 0 ? null : xmlDoc; + } catch (e) { + // Unable to parse XML - no biggie + } + } + + return null; + }; + + FakeXMLHttpRequest.statusCodes = { + 100: "Continue", + 101: "Switching Protocols", + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non-Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi-Status", + 300: "Multiple Choice", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 307: "Temporary Redirect", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request-URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 422: "Unprocessable Entity", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported" + }; + + extend(FakeXMLHttpRequest.prototype, sinonEvent.EventTarget, { + async: true, + + open: function open(method, url, async, username, password) { + this.method = method; + this.url = url; + this.async = typeof async === "boolean" ? async : true; + this.username = username; + this.password = password; + clearResponse(this); + this.requestHeaders = {}; + this.sendFlag = false; + + if (FakeXMLHttpRequest.useFilters === true) { + var xhrArgs = arguments; + var defake = FakeXMLHttpRequest.filters.some(function(filter) { + return filter.apply(this, xhrArgs); + }); + if (defake) { + FakeXMLHttpRequest.defake(this, arguments); + return; + } + } + this.readyStateChange(FakeXMLHttpRequest.OPENED); + }, + + readyStateChange: function readyStateChange(state) { + this.readyState = state; + + var readyStateChangeEvent = new sinonEvent.Event( + "readystatechange", + false, + false, + this + ); + var event, progress; + + if (typeof this.onreadystatechange === "function") { + try { + this.onreadystatechange(readyStateChangeEvent); + } catch (e) { + this.logError("Fake XHR onreadystatechange handler", e); + } + } + + if (this.readyState === FakeXMLHttpRequest.DONE) { + if (this.timedOut || this.aborted || this.status === 0) { + progress = { loaded: 0, total: 0 }; + event = + (this.timedOut && "timeout") || + (this.aborted && "abort") || + "error"; + } else { + progress = { loaded: 100, total: 100 }; + event = "load"; + } + + if (supportsProgress) { + this.upload.dispatchEvent( + new sinonEvent.ProgressEvent("progress", progress, this) + ); + this.upload.dispatchEvent( + new sinonEvent.ProgressEvent(event, progress, this) + ); + this.upload.dispatchEvent( + new sinonEvent.ProgressEvent("loadend", progress, this) + ); + } + + this.dispatchEvent( + new sinonEvent.ProgressEvent("progress", progress, this) + ); + this.dispatchEvent( + new sinonEvent.ProgressEvent(event, progress, this) + ); + this.dispatchEvent( + new sinonEvent.ProgressEvent("loadend", progress, this) + ); + } + + this.dispatchEvent(readyStateChangeEvent); + }, + + // Ref https://xhr.spec.whatwg.org/#the-setrequestheader()-method + setRequestHeader: function setRequestHeader(header, value) { + if (typeof value !== "string") { + throw new TypeError( + "By RFC7230, section 3.2.4, header values should be strings. Got " + + typeof value + ); + } + verifyState(this); + + var checkUnsafeHeaders = true; + if (typeof this.unsafeHeadersEnabled === "function") { + checkUnsafeHeaders = this.unsafeHeadersEnabled(); + } + + if ( + checkUnsafeHeaders && + (getHeader(unsafeHeaders, header) !== null || + /^(Sec-|Proxy-)/i.test(header)) + ) { + throw new Error( + // eslint-disable-next-line quotes + 'Refused to set unsafe header "' + header + '"' + ); + } + + // eslint-disable-next-line no-param-reassign + value = normalizeHeaderValue(value); + + var existingHeader = getHeader(this.requestHeaders, header); + if (existingHeader) { + this.requestHeaders[existingHeader] += ", " + value; + } else { + this.requestHeaders[header] = value; + } + }, + + setStatus: function setStatus(status) { + var sanitizedStatus = typeof status === "number" ? status : 200; + + verifyRequestOpened(this); + this.status = sanitizedStatus; + this.statusText = FakeXMLHttpRequest.statusCodes[sanitizedStatus]; + }, + + // Helps testing + setResponseHeaders: function setResponseHeaders(headers) { + verifyRequestOpened(this); + + var responseHeaders = (this.responseHeaders = {}); + + Object.keys(headers).forEach(function(header) { + responseHeaders[header] = headers[header]; + }); + + if (this.async) { + this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED); + } else { + this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED; + } + }, + + // Currently treats ALL data as a DOMString (i.e. no Document) + send: function send(data) { + verifyState(this); + + if (!/^(head)$/i.test(this.method)) { + var contentType = getHeader( + this.requestHeaders, + "Content-Type" + ); + if (this.requestHeaders[contentType]) { + var value = this.requestHeaders[contentType].split(";"); + this.requestHeaders[contentType] = + value[0] + ";charset=utf-8"; + } else if (supportsFormData && !(data instanceof FormData)) { + this.requestHeaders["Content-Type"] = + "text/plain;charset=utf-8"; + } + + this.requestBody = data; + } + + this.errorFlag = false; + this.sendFlag = this.async; + clearResponse(this); + + if (typeof this.onSend === "function") { + this.onSend(this); + } + + // Only listen if setInterval and Date are a stubbed. + if ( + sinonXhr.supportsTimeout && + typeof setInterval.clock === "object" && + typeof Date.clock === "object" + ) { + var initiatedTime = Date.now(); + var self = this; + + // Listen to any possible tick by fake timers and check to see if timeout has + // been exceeded. It's important to note that timeout can be changed while a request + // is in flight, so we must check anytime the end user forces a clock tick to make + // sure timeout hasn't changed. + // https://xhr.spec.whatwg.org/#dfnReturnLink-2 + var clearIntervalId = setInterval(function() { + // Check if the readyState has been reset or is done. If this is the case, there + // should be no timeout. This will also prevent aborted requests and + // fakeServerWithClock from triggering unnecessary responses. + if ( + self.readyState === FakeXMLHttpRequest.UNSENT || + self.readyState === FakeXMLHttpRequest.DONE + ) { + clearInterval(clearIntervalId); + } else if ( + typeof self.timeout === "number" && + self.timeout > 0 + ) { + if (Date.now() >= initiatedTime + self.timeout) { + self.triggerTimeout(); + clearInterval(clearIntervalId); + } + } + }, 1); + } + + this.dispatchEvent( + new sinonEvent.Event("loadstart", false, false, this) + ); + }, + + abort: function abort() { + this.aborted = true; + requestErrorSteps(this); + this.readyState = FakeXMLHttpRequest.UNSENT; + }, + + error: function() { + clearResponse(this); + this.errorFlag = true; + this.requestHeaders = {}; + this.responseHeaders = {}; + + this.readyStateChange(FakeXMLHttpRequest.DONE); + }, + + triggerTimeout: function triggerTimeout() { + if (sinonXhr.supportsTimeout) { + this.timedOut = true; + requestErrorSteps(this); + } + }, + + getResponseHeader: function getResponseHeader(header) { + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { + return null; + } + + if (/^Set-Cookie2?$/i.test(header)) { + return null; + } + + // eslint-disable-next-line no-param-reassign + header = getHeader(this.responseHeaders, header); + + return this.responseHeaders[header] || null; + }, + + getAllResponseHeaders: function getAllResponseHeaders() { + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { + return ""; + } + + var responseHeaders = this.responseHeaders; + var headers = Object.keys(responseHeaders) + .filter(excludeSetCookie2Header) + .reduce(function(prev, header) { + var value = responseHeaders[header]; + + return prev + (header + ": " + value + "\r\n"); + }, ""); + + return headers; + }, + + setResponseBody: function setResponseBody(body) { + verifyRequestSent(this); + verifyHeadersReceived(this); + verifyResponseBodyType(body, this.responseType); + var contentType = + this.overriddenMimeType || + this.getResponseHeader("Content-Type"); + + var isTextResponse = + this.responseType === "" || this.responseType === "text"; + clearResponse(this); + if (this.async) { + var chunkSize = this.chunkSize || 10; + var index = 0; + + do { + this.readyStateChange(FakeXMLHttpRequest.LOADING); + + if (isTextResponse) { + this.responseText = this.response += body.substring( + index, + index + chunkSize + ); + } + index += chunkSize; + } while (index < body.length); + } + + this.response = convertResponseBody( + this.responseType, + contentType, + body + ); + if (isTextResponse) { + this.responseText = this.response; + } + + if (this.responseType === "document") { + this.responseXML = this.response; + } else if ( + this.responseType === "" && + isXmlContentType(contentType) + ) { + this.responseXML = FakeXMLHttpRequest.parseXML( + this.responseText + ); + } + this.readyStateChange(FakeXMLHttpRequest.DONE); + }, + + respond: function respond(status, headers, body) { + this.setStatus(status); + this.setResponseHeaders(headers || {}); + this.setResponseBody(body || ""); + }, + + uploadProgress: function uploadProgress(progressEventRaw) { + if (supportsProgress) { + this.upload.dispatchEvent( + new sinonEvent.ProgressEvent( + "progress", + progressEventRaw, + this.upload + ) + ); + } + }, + + downloadProgress: function downloadProgress(progressEventRaw) { + if (supportsProgress) { + this.dispatchEvent( + new sinonEvent.ProgressEvent( + "progress", + progressEventRaw, + this + ) + ); + } + }, + + uploadError: function uploadError(error) { + if (supportsCustomEvent) { + this.upload.dispatchEvent( + new sinonEvent.CustomEvent("error", { detail: error }) + ); + } + }, + + overrideMimeType: function overrideMimeType(type) { + if (this.readyState >= FakeXMLHttpRequest.LOADING) { + throw new Error("INVALID_STATE_ERR"); + } + this.overriddenMimeType = type; + } + }); + + var states = { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4 + }; + + extend(FakeXMLHttpRequest, states); + extend(FakeXMLHttpRequest.prototype, states); + + function useFakeXMLHttpRequest() { + FakeXMLHttpRequest.restore = function restore(keepOnCreate) { + if (sinonXhr.supportsXHR) { + globalScope.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest; + } + + if (sinonXhr.supportsActiveX) { + globalScope.ActiveXObject = sinonXhr.GlobalActiveXObject; + } + + delete FakeXMLHttpRequest.restore; + + if (keepOnCreate !== true) { + delete FakeXMLHttpRequest.onCreate; + } + }; + if (sinonXhr.supportsXHR) { + globalScope.XMLHttpRequest = FakeXMLHttpRequest; + } + + if (sinonXhr.supportsActiveX) { + globalScope.ActiveXObject = function ActiveXObject(objId) { + if ( + objId === "Microsoft.XMLHTTP" || + /^Msxml2\.XMLHTTP/i.test(objId) + ) { + return new FakeXMLHttpRequest(); + } + + return new sinonXhr.GlobalActiveXObject(objId); + }; + } + + return FakeXMLHttpRequest; + } + + return { + xhr: sinonXhr, + FakeXMLHttpRequest: FakeXMLHttpRequest, + useFakeXMLHttpRequest: useFakeXMLHttpRequest + }; +} + +module.exports = extend(fakeXMLHttpRequestFor(globalObject), { + fakeXMLHttpRequestFor: fakeXMLHttpRequestFor +}); + +},{"../configure-logger":90,"../event":94,"./blob":99,"@sinonjs/commons":44,"@sinonjs/text-encoding":83,"just-extend":88}],101:[function(require,module,exports){ +"use strict"; + +module.exports = { + fakeServer: require("./fake-server"), + fakeServerWithClock: require("./fake-server/fake-server-with-clock"), + fakeXhr: require("./fake-xhr") +}; + +},{"./fake-server":97,"./fake-server/fake-server-with-clock":96,"./fake-xhr":100}],102:[function(require,module,exports){ +var isarray = require('isarray') + +/** + * Expose `pathToRegexp`. + */ +module.exports = pathToRegexp +module.exports.parse = parse +module.exports.compile = compile +module.exports.tokensToFunction = tokensToFunction +module.exports.tokensToRegExp = tokensToRegExp + +/** + * The main path matching regexp utility. + * + * @type {RegExp} + */ +var PATH_REGEXP = new RegExp([ + // Match escaped characters that would otherwise appear in future matches. + // This allows the user to escape special characters that won't transform. + '(\\\\.)', + // Match Express-style parameters and un-named parameters with a prefix + // and optional suffixes. Matches appear as: + // + // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] + // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] + // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] + '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))' +].join('|'), 'g') + +/** + * Parse a string for the raw tokens. + * + * @param {string} str + * @param {Object=} options + * @return {!Array} + */ +function parse (str, options) { + var tokens = [] + var key = 0 + var index = 0 + var path = '' + var defaultDelimiter = options && options.delimiter || '/' + var res + + while ((res = PATH_REGEXP.exec(str)) != null) { + var m = res[0] + var escaped = res[1] + var offset = res.index + path += str.slice(index, offset) + index = offset + m.length + + // Ignore already escaped sequences. + if (escaped) { + path += escaped[1] + continue + } + + var next = str[index] + var prefix = res[2] + var name = res[3] + var capture = res[4] + var group = res[5] + var modifier = res[6] + var asterisk = res[7] + + // Push the current path onto the tokens. + if (path) { + tokens.push(path) + path = '' + } + + var partial = prefix != null && next != null && next !== prefix + var repeat = modifier === '+' || modifier === '*' + var optional = modifier === '?' || modifier === '*' + var delimiter = res[2] || defaultDelimiter + var pattern = capture || group + + tokens.push({ + name: name || key++, + prefix: prefix || '', + delimiter: delimiter, + optional: optional, + repeat: repeat, + partial: partial, + asterisk: !!asterisk, + pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?') + }) + } + + // Match any characters still remaining. + if (index < str.length) { + path += str.substr(index) + } + + // If the path exists, push it onto the end. + if (path) { + tokens.push(path) + } + + return tokens +} + +/** + * Compile a string to a template function for the path. + * + * @param {string} str + * @param {Object=} options + * @return {!function(Object=, Object=)} + */ +function compile (str, options) { + return tokensToFunction(parse(str, options), options) +} + +/** + * Prettier encoding of URI path segments. + * + * @param {string} + * @return {string} + */ +function encodeURIComponentPretty (str) { + return encodeURI(str).replace(/[\/?#]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +/** + * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. + * + * @param {string} + * @return {string} + */ +function encodeAsterisk (str) { + return encodeURI(str).replace(/[?#]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +/** + * Expose a method for transforming tokens into the path function. + */ +function tokensToFunction (tokens, options) { + // Compile all the tokens into regexps. + var matches = new Array(tokens.length) + + // Compile all the patterns before compilation. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options)) + } + } + + return function (obj, opts) { + var path = '' + var data = obj || {} + var options = opts || {} + var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i] + + if (typeof token === 'string') { + path += token + + continue + } + + var value = data[token.name] + var segment + + if (value == null) { + if (token.optional) { + // Prepend partial segment prefixes. + if (token.partial) { + path += token.prefix + } + + continue + } else { + throw new TypeError('Expected "' + token.name + '" to be defined') + } + } + + if (isarray(value)) { + if (!token.repeat) { + throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`') + } + + if (value.length === 0) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to not be empty') + } + } + + for (var j = 0; j < value.length; j++) { + segment = encode(value[j]) + + if (!matches[i].test(segment)) { + throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`') + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment + } + + continue + } + + segment = token.asterisk ? encodeAsterisk(value) : encode(value) + + if (!matches[i].test(segment)) { + throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += token.prefix + segment + } + + return path + } +} + +/** + * Escape a regular expression string. + * + * @param {string} str + * @return {string} + */ +function escapeString (str) { + return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1') +} + +/** + * Escape the capturing group by escaping special characters and meaning. + * + * @param {string} group + * @return {string} + */ +function escapeGroup (group) { + return group.replace(/([=!:$\/()])/g, '\\$1') +} + +/** + * Attach the keys as a property of the regexp. + * + * @param {!RegExp} re + * @param {Array} keys + * @return {!RegExp} + */ +function attachKeys (re, keys) { + re.keys = keys + return re +} + +/** + * Get the flags for a regexp from the options. + * + * @param {Object} options + * @return {string} + */ +function flags (options) { + return options && options.sensitive ? '' : 'i' +} + +/** + * Pull out keys from a regexp. + * + * @param {!RegExp} path + * @param {!Array} keys + * @return {!RegExp} + */ +function regexpToRegexp (path, keys) { + // Use a negative lookahead to match only capturing groups. + var groups = path.source.match(/\((?!\?)/g) + + if (groups) { + for (var i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + partial: false, + asterisk: false, + pattern: null + }) + } + } + + return attachKeys(path, keys) +} + +/** + * Transform an array into a regexp. + * + * @param {!Array} path + * @param {Array} keys + * @param {!Object} options + * @return {!RegExp} + */ +function arrayToRegexp (path, keys, options) { + var parts = [] + + for (var i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source) + } + + var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)) + + return attachKeys(regexp, keys) +} + +/** + * Create a path regexp from string input. + * + * @param {string} path + * @param {!Array} keys + * @param {!Object} options + * @return {!RegExp} + */ +function stringToRegexp (path, keys, options) { + return tokensToRegExp(parse(path, options), keys, options) +} + +/** + * Expose a function for taking tokens and returning a RegExp. + * + * @param {!Array} tokens + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ +function tokensToRegExp (tokens, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options) + keys = [] + } + + options = options || {} + + var strict = options.strict + var end = options.end !== false + var route = '' + + // Iterate over the tokens and create our regexp string. + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i] + + if (typeof token === 'string') { + route += escapeString(token) + } else { + var prefix = escapeString(token.prefix) + var capture = '(?:' + token.pattern + ')' + + keys.push(token) + + if (token.repeat) { + capture += '(?:' + prefix + capture + ')*' + } + + if (token.optional) { + if (!token.partial) { + capture = '(?:' + prefix + '(' + capture + '))?' + } else { + capture = prefix + '(' + capture + ')?' + } + } else { + capture = prefix + '(' + capture + ')' + } + + route += capture + } + } + + var delimiter = escapeString(options.delimiter || '/') + var endsWithDelimiter = route.slice(-delimiter.length) === delimiter + + // In non-strict mode we allow a slash at the end of match. If the path to + // match already ends with a slash, we remove it for consistency. The slash + // is valid at the end of a path match, not in the middle. This is important + // in non-ending mode, where "/test/" shouldn't match "/test//route". + if (!strict) { + route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?' + } + + if (end) { + route += '$' + } else { + // In non-ending mode, we need the capturing groups to match as much as + // possible by using a positive lookahead to the end or next path segment. + route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)' + } + + return attachKeys(new RegExp('^' + route, flags(options)), keys) +} + +/** + * Normalize the given path string, returning a regular expression. + * + * An empty array can be passed in for the keys, which will hold the + * placeholder key descriptions. For example, using `/user/:id`, `keys` will + * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. + * + * @param {(string|RegExp|Array)} path + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ +function pathToRegexp (path, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options) + keys = [] + } + + options = options || {} + + if (path instanceof RegExp) { + return regexpToRegexp(path, /** @type {!Array} */ (keys)) + } + + if (isarray(path)) { + return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options) + } + + return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options) +} + +},{"isarray":87}],103:[function(require,module,exports){ +'use strict'; +module.exports = { + stdout: false, + stderr: false +}; + +},{}],104:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.typeDetect = factory()); +}(this, (function () { 'use strict'; + +/* ! + * type-detect + * Copyright(c) 2013 jake luer + * MIT Licensed + */ +var promiseExists = typeof Promise === 'function'; + +/* eslint-disable no-undef */ +var globalObject = typeof self === 'object' ? self : global; // eslint-disable-line id-blacklist + +var symbolExists = typeof Symbol !== 'undefined'; +var mapExists = typeof Map !== 'undefined'; +var setExists = typeof Set !== 'undefined'; +var weakMapExists = typeof WeakMap !== 'undefined'; +var weakSetExists = typeof WeakSet !== 'undefined'; +var dataViewExists = typeof DataView !== 'undefined'; +var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; +var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; +var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; +var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; +var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); +var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); +var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; +var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); +var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; +var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); +var toStringLeftSliceLength = 8; +var toStringRightSliceLength = -1; +/** + * ### typeOf (obj) + * + * Uses `Object.prototype.toString` to determine the type of an object, + * normalising behaviour across engine versions & well optimised. + * + * @param {Mixed} object + * @return {String} object type + * @api public + */ +function typeDetect(obj) { + /* ! Speed optimisation + * Pre: + * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled) + * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled) + * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled) + * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled) + * function x 2,556,769 ops/sec ±1.73% (77 runs sampled) + * Post: + * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled) + * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled) + * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled) + * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled) + * function x 31,296,870 ops/sec ±0.96% (83 runs sampled) + */ + var typeofObj = typeof obj; + if (typeofObj !== 'object') { + return typeofObj; + } + + /* ! Speed optimisation + * Pre: + * null x 28,645,765 ops/sec ±1.17% (82 runs sampled) + * Post: + * null x 36,428,962 ops/sec ±1.37% (84 runs sampled) + */ + if (obj === null) { + return 'null'; + } + + /* ! Spec Conformance + * Test: `Object.prototype.toString.call(window)`` + * - Node === "[object global]" + * - Chrome === "[object global]" + * - Firefox === "[object Window]" + * - PhantomJS === "[object Window]" + * - Safari === "[object Window]" + * - IE 11 === "[object Window]" + * - IE Edge === "[object Window]" + * Test: `Object.prototype.toString.call(this)`` + * - Chrome Worker === "[object global]" + * - Firefox Worker === "[object DedicatedWorkerGlobalScope]" + * - Safari Worker === "[object DedicatedWorkerGlobalScope]" + * - IE 11 Worker === "[object WorkerGlobalScope]" + * - IE Edge Worker === "[object WorkerGlobalScope]" + */ + if (obj === globalObject) { + return 'global'; + } + + /* ! Speed optimisation + * Pre: + * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled) + * Post: + * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled) + */ + if ( + Array.isArray(obj) && + (symbolToStringTagExists === false || !(Symbol.toStringTag in obj)) + ) { + return 'Array'; + } + + // Not caching existence of `window` and related properties due to potential + // for `window` to be unset before tests in quasi-browser environments. + if (typeof window === 'object' && window !== null) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/browsers.html#location) + * WhatWG HTML$7.7.3 - The `Location` interface + * Test: `Object.prototype.toString.call(window.location)`` + * - IE <=11 === "[object Object]" + * - IE Edge <=13 === "[object Object]" + */ + if (typeof window.location === 'object' && obj === window.location) { + return 'Location'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#document) + * WhatWG HTML$3.1.1 - The `Document` object + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * WhatWG HTML states: + * > For historical reasons, Window objects must also have a + * > writable, configurable, non-enumerable property named + * > HTMLDocument whose value is the Document interface object. + * Test: `Object.prototype.toString.call(document)`` + * - Chrome === "[object HTMLDocument]" + * - Firefox === "[object HTMLDocument]" + * - Safari === "[object HTMLDocument]" + * - IE <=10 === "[object Document]" + * - IE 11 === "[object HTMLDocument]" + * - IE Edge <=13 === "[object HTMLDocument]" + */ + if (typeof window.document === 'object' && obj === window.document) { + return 'Document'; + } + + if (typeof window.navigator === 'object') { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray + * Test: `Object.prototype.toString.call(navigator.mimeTypes)`` + * - IE <=10 === "[object MSMimeTypesCollection]" + */ + if (typeof window.navigator.mimeTypes === 'object' && + obj === window.navigator.mimeTypes) { + return 'MimeTypeArray'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray + * Test: `Object.prototype.toString.call(navigator.plugins)`` + * - IE <=10 === "[object MSPluginsCollection]" + */ + if (typeof window.navigator.plugins === 'object' && + obj === window.navigator.plugins) { + return 'PluginArray'; + } + } + + if ((typeof window.HTMLElement === 'function' || + typeof window.HTMLElement === 'object') && + obj instanceof window.HTMLElement) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement` + * Test: `Object.prototype.toString.call(document.createElement('blockquote'))`` + * - IE <=10 === "[object HTMLBlockElement]" + */ + if (obj.tagName === 'BLOCKQUOTE') { + return 'HTMLQuoteElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltabledatacellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('td')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TD') { + return 'HTMLTableDataCellElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltableheadercellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('th')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TH') { + return 'HTMLTableHeaderCellElement'; + } + } + } + + /* ! Speed optimisation + * Pre: + * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled) + * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled) + * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled) + * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled) + * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled) + * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled) + * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled) + * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled) + * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled) + * Post: + * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled) + * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled) + * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled) + * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled) + * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled) + * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled) + * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled) + * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled) + * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled) + */ + var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); + if (typeof stringTag === 'string') { + return stringTag; + } + + var objPrototype = Object.getPrototypeOf(obj); + /* ! Speed optimisation + * Pre: + * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled) + * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled) + * Post: + * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled) + * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled) + */ + if (objPrototype === RegExp.prototype) { + return 'RegExp'; + } + + /* ! Speed optimisation + * Pre: + * date x 2,130,074 ops/sec ±4.42% (68 runs sampled) + * Post: + * date x 3,953,779 ops/sec ±1.35% (77 runs sampled) + */ + if (objPrototype === Date.prototype) { + return 'Date'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag) + * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise": + * Test: `Object.prototype.toString.call(Promise.resolve())`` + * - Chrome <=47 === "[object Object]" + * - Edge <=20 === "[object Object]" + * - Firefox 29-Latest === "[object Promise]" + * - Safari 7.1-Latest === "[object Promise]" + */ + if (promiseExists && objPrototype === Promise.prototype) { + return 'Promise'; + } + + /* ! Speed optimisation + * Pre: + * set x 2,222,186 ops/sec ±1.31% (82 runs sampled) + * Post: + * set x 4,545,879 ops/sec ±1.13% (83 runs sampled) + */ + if (setExists && objPrototype === Set.prototype) { + return 'Set'; + } + + /* ! Speed optimisation + * Pre: + * map x 2,396,842 ops/sec ±1.59% (81 runs sampled) + * Post: + * map x 4,183,945 ops/sec ±6.59% (82 runs sampled) + */ + if (mapExists && objPrototype === Map.prototype) { + return 'Map'; + } + + /* ! Speed optimisation + * Pre: + * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled) + * Post: + * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled) + */ + if (weakSetExists && objPrototype === WeakSet.prototype) { + return 'WeakSet'; + } + + /* ! Speed optimisation + * Pre: + * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled) + * Post: + * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled) + */ + if (weakMapExists && objPrototype === WeakMap.prototype) { + return 'WeakMap'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag) + * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView": + * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))`` + * - Edge <=13 === "[object Object]" + */ + if (dataViewExists && objPrototype === DataView.prototype) { + return 'DataView'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag) + * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator": + * Test: `Object.prototype.toString.call(new Map().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (mapExists && objPrototype === mapIteratorPrototype) { + return 'Map Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag) + * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator": + * Test: `Object.prototype.toString.call(new Set().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (setExists && objPrototype === setIteratorPrototype) { + return 'Set Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag) + * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator": + * Test: `Object.prototype.toString.call([][Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { + return 'Array Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag) + * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator": + * Test: `Object.prototype.toString.call(''[Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (stringIteratorExists && objPrototype === stringIteratorPrototype) { + return 'String Iterator'; + } + + /* ! Speed optimisation + * Pre: + * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled) + * Post: + * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled) + */ + if (objPrototype === null) { + return 'Object'; + } + + return Object + .prototype + .toString + .call(obj) + .slice(toStringLeftSliceLength, toStringRightSliceLength); +} + +return typeDetect; + +}))); + +},{}],105:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],106:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],107:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +},{"./support/isBuffer":106,"inherits":105}]},{},[1])(1) +}); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvc2lub24uanMiLCJsaWIvc2lub24vYXNzZXJ0LmpzIiwibGliL3Npbm9uL2JlaGF2aW9yLmpzIiwibGliL3Npbm9uL2NvbGxlY3Qtb3duLW1ldGhvZHMuanMiLCJsaWIvc2lub24vY29sb3IuanMiLCJsaWIvc2lub24vY3JlYXRlLXNhbmRib3guanMiLCJsaWIvc2lub24vZGVmYXVsdC1iZWhhdmlvcnMuanMiLCJsaWIvc2lub24vZmFrZS5qcyIsImxpYi9zaW5vbi9tb2NrLWV4cGVjdGF0aW9uLmpzIiwibGliL3Npbm9uL21vY2suanMiLCJsaWIvc2lub24vcHJveHktY2FsbC11dGlsLmpzIiwibGliL3Npbm9uL3Byb3h5LWNhbGwuanMiLCJsaWIvc2lub24vcHJveHktaW52b2tlLmpzIiwibGliL3Npbm9uL3Byb3h5LmpzIiwibGliL3Npbm9uL3Jlc3RvcmUtb2JqZWN0LmpzIiwibGliL3Npbm9uL3NhbmRib3guanMiLCJsaWIvc2lub24vc3B5LWZvcm1hdHRlcnMuanMiLCJsaWIvc2lub24vc3B5LmpzIiwibGliL3Npbm9uL3N0dWIuanMiLCJsaWIvc2lub24vdGhyb3ctb24tZmFsc3ktb2JqZWN0LmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9kZWZhdWx0LWNvbmZpZy5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZXhwb3J0LWFzeW5jLWJlaGF2aW9ycy5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZXh0ZW5kLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9mb3JtYXQuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZ2V0LW5leHQtdGljay5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2lzLWVzLW1vZHVsZS5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvaXMtbm9uLWV4aXN0ZW50LXByb3BlcnR5LmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9pcy1wcm9wZXJ0eS1jb25maWd1cmFibGUuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL25leHQtdGljay5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvdGltZXMtaW4td29yZHMuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL3VzZS1wcm9taXNlLWxpYnJhcnkuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL3dhbGstb2JqZWN0LmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS93YWxrLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS93cmFwLW1ldGhvZC5qcyIsImxpYi9zaW5vbi91dGlsL2Zha2UtdGltZXJzLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL2NhbGxlZC1pbi1vcmRlci5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9jbGFzcy1uYW1lLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL2RlcHJlY2F0ZWQuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvZXZlcnkuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvZnVuY3Rpb24tbmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvb3JkZXItYnktZmlyc3QtY2FsbC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9wcm90b3R5cGVzL2FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvY29weS1wcm90b3R5cGUuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9wcm90b3R5cGVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvbWFwLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvc2V0LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvdmFsdWUtdG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2Zha2UtdGltZXJzL3NyYy9mYWtlLXRpbWVycy1zcmMuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9hcnJheS10eXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2NyZWF0ZS1tYXRjaGVyLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvYXNzZXJ0LW1hdGNoZXIuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9hc3NlcnQtbWV0aG9kLWV4aXN0cy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2NyZWF0ZS1tYXRjaGVyL2Fzc2VydC10eXBlLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvaXMtaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci9pcy1tYXRjaGVyLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvbWF0Y2gtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvY3JlYXRlLW1hdGNoZXIvbWF0Y2hlci1wcm90b3R5cGUuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9jcmVhdGUtbWF0Y2hlci90eXBlLW1hcC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2RlZXAtZXF1YWwuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9nZXQtY2xhc3MuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pZGVudGljYWwuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1hcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1hcnJheS10eXBlLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXMtZGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLWVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1tYXAuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1uYW4uanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1uZWctemVyby5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLXNldC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLXN1YnNldC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2l0ZXJhYmxlLXRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL21hdGNoLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvc2Ftc2FtLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3RleHQtZW5jb2RpbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvdGV4dC1lbmNvZGluZy9saWIvZW5jb2RpbmctaW5kZXhlcy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy90ZXh0LWVuY29kaW5nL2xpYi9lbmNvZGluZy5qcyIsIm5vZGVfbW9kdWxlcy9kaWZmL2Rpc3QvZGlmZi5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2p1c3QtZXh0ZW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC5nZXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvY29uZmlndXJlLWxvZ2dlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9uaXNlL2xpYi9ldmVudC9jdXN0b20tZXZlbnQuanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZXZlbnQvZXZlbnQtdGFyZ2V0LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2V2ZW50L2V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2V2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2V2ZW50L3Byb2dyZXNzLWV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2Zha2Utc2VydmVyL2Zha2Utc2VydmVyLXdpdGgtY2xvY2suanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZmFrZS1zZXJ2ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZmFrZS1zZXJ2ZXIvbG9nLmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2Zha2UteGhyL2Jsb2IuanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZmFrZS14aHIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGF0aC10by1yZWdleHAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3VwcG9ydHMtY29sb3IvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy90eXBlLWRldGVjdC90eXBlLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0eUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2h2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqakRBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ242QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6NEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBiZWhhdmlvciA9IHJlcXVpcmUoXCIuL3Npbm9uL2JlaGF2aW9yXCIpO1xudmFyIGNyZWF0ZVNhbmRib3ggPSByZXF1aXJlKFwiLi9zaW5vbi9jcmVhdGUtc2FuZGJveFwiKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGZha2VUaW1lcnMgPSByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2Zha2UtdGltZXJzXCIpO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoXCIuL3Npbm9uL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgbmlzZSA9IHJlcXVpcmUoXCJuaXNlXCIpO1xudmFyIFNhbmRib3ggPSByZXF1aXJlKFwiLi9zaW5vbi9zYW5kYm94XCIpO1xudmFyIHN0dWIgPSByZXF1aXJlKFwiLi9zaW5vbi9zdHViXCIpO1xuXG52YXIgYXBpTWV0aG9kcyA9IHtcbiAgICBjcmVhdGVTYW5kYm94OiBjcmVhdGVTYW5kYm94LFxuICAgIGFzc2VydDogcmVxdWlyZShcIi4vc2lub24vYXNzZXJ0XCIpLFxuICAgIG1hdGNoOiByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXIsXG4gICAgcmVzdG9yZU9iamVjdDogcmVxdWlyZShcIi4vc2lub24vcmVzdG9yZS1vYmplY3RcIiksXG5cbiAgICBleHBlY3RhdGlvbjogcmVxdWlyZShcIi4vc2lub24vbW9jay1leHBlY3RhdGlvblwiKSxcbiAgICBkZWZhdWx0Q29uZmlnOiByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2NvcmUvZGVmYXVsdC1jb25maWdcIiksXG5cbiAgICBzZXRGb3JtYXR0ZXI6IGZvcm1hdC5zZXRGb3JtYXR0ZXIsXG5cbiAgICAvLyBmYWtlIHRpbWVyc1xuICAgIHRpbWVyczogZmFrZVRpbWVycy50aW1lcnMsXG5cbiAgICAvLyBmYWtlIFhIUlxuICAgIHhocjogbmlzZS5mYWtlWGhyLnhocixcbiAgICBGYWtlWE1MSHR0cFJlcXVlc3Q6IG5pc2UuZmFrZVhoci5GYWtlWE1MSHR0cFJlcXVlc3QsXG5cbiAgICAvLyBmYWtlIHNlcnZlclxuICAgIGZha2VTZXJ2ZXI6IG5pc2UuZmFrZVNlcnZlcixcbiAgICBmYWtlU2VydmVyV2l0aENsb2NrOiBuaXNlLmZha2VTZXJ2ZXJXaXRoQ2xvY2ssXG4gICAgY3JlYXRlRmFrZVNlcnZlcjogbmlzZS5mYWtlU2VydmVyLmNyZWF0ZS5iaW5kKG5pc2UuZmFrZVNlcnZlciksXG4gICAgY3JlYXRlRmFrZVNlcnZlcldpdGhDbG9jazogbmlzZS5mYWtlU2VydmVyV2l0aENsb2NrLmNyZWF0ZS5iaW5kKG5pc2UuZmFrZVNlcnZlcldpdGhDbG9jayksXG5cbiAgICBhZGRCZWhhdmlvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICAgICAgYmVoYXZpb3IuYWRkQmVoYXZpb3Ioc3R1YiwgbmFtZSwgZm4pO1xuICAgIH1cbn07XG5cbnZhciBzYW5kYm94ID0gbmV3IFNhbmRib3goKTtcblxudmFyIGFwaSA9IGV4dGVuZChzYW5kYm94LCBhcGlNZXRob2RzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhcGk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNhbGxlZEluT3JkZXIgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5jYWxsZWRJbk9yZGVyO1xudmFyIGNyZWF0ZU1hdGNoZXIgPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXI7XG52YXIgb3JkZXJCeUZpcnN0Q2FsbCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLm9yZGVyQnlGaXJzdENhbGw7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3RpbWVzLWluLXdvcmRzXCIpO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgc3RyaW5nU2xpY2UgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZy5zbGljZTtcbnZhciBnbG9iYWxPYmplY3QgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5nbG9iYWw7XG5cbnZhciBhcnJheVNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcbnZhciBjb25jYXQgPSBhcnJheVByb3RvLmNvbmNhdDtcbnZhciBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xudmFyIGpvaW4gPSBhcnJheVByb3RvLmpvaW47XG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbmZ1bmN0aW9uIGNyZWF0ZUFzc2VydE9iamVjdCgpIHtcbiAgICB2YXIgYXNzZXJ0O1xuXG4gICAgZnVuY3Rpb24gdmVyaWZ5SXNTdHViKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcblxuICAgICAgICBmb3JFYWNoKGFyZ3MsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChcImZha2UgaXMgbm90IGEgc3B5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWV0aG9kLnByb3h5ICYmIG1ldGhvZC5wcm94eS5pc1Npbm9uUHJveHkpIHtcbiAgICAgICAgICAgICAgICB2ZXJpZnlJc1N0dWIobWV0aG9kLnByb3h5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChtZXRob2QgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5nZXRDYWxsICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwobWV0aG9kICsgXCIgaXMgbm90IHN0dWJiZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2ZXJpZnlJc1ZhbGlkQXNzZXJ0aW9uKGFzc2VydGlvbk1ldGhvZCwgYXNzZXJ0aW9uQXJncykge1xuICAgICAgICBzd2l0Y2ggKGFzc2VydGlvbk1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSBcIm5vdENhbGxlZFwiOlxuICAgICAgICAgICAgY2FzZSBcImNhbGxlZFwiOlxuICAgICAgICAgICAgY2FzZSBcImNhbGxlZE9uY2VcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjYWxsZWRUd2ljZVwiOlxuICAgICAgICAgICAgY2FzZSBcImNhbGxlZFRocmljZVwiOlxuICAgICAgICAgICAgICAgIGlmIChhc3NlcnRpb25BcmdzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbk1ldGhvZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgdGFrZXMgMSBhcmd1bWVudCBidXQgd2FzIGNhbGxlZCB3aXRoIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzZXJ0aW9uQXJncy5sZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgYXJndW1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmFpbEFzc2VydGlvbihvYmplY3QsIG1zZykge1xuICAgICAgICB2YXIgb2JqID0gb2JqZWN0IHx8IGdsb2JhbE9iamVjdDtcbiAgICAgICAgdmFyIGZhaWxNZXRob2QgPSBvYmouZmFpbCB8fCBhc3NlcnQuZmFpbDtcbiAgICAgICAgZmFpbE1ldGhvZC5jYWxsKG9iaiwgbXNnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXJyb3JQcm9wQXNBc3NlcnRpb24obmFtZSwgbWV0aG9kLCBtZXNzYWdlKSB7XG4gICAgICAgIHZhciBtc2cgPSBtZXNzYWdlO1xuICAgICAgICB2YXIgbWV0aCA9IG1ldGhvZDtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIG1zZyA9IG1ldGhvZDtcbiAgICAgICAgICAgIG1ldGggPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0W25hbWVdID0gZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICAgICAgdmVyaWZ5SXNTdHViKGZha2UpO1xuXG4gICAgICAgICAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgIHZhciBmYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgdmVyaWZ5SXNWYWxpZEFzc2VydGlvbihuYW1lLCBhcmdzKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQgPSAhbWV0aChmYWtlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkID0gdHlwZW9mIGZha2VbbWV0aF0gPT09IFwiZnVuY3Rpb25cIiA/ICFmYWtlW21ldGhdLmFwcGx5KGZha2UsIGFyZ3MpIDogIWZha2VbbWV0aF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgICAgICBmYWlsQXNzZXJ0aW9uKHRoaXMsIChmYWtlLnByaW50ZiB8fCBmYWtlLnByb3h5LnByaW50ZikuYXBwbHkoZmFrZSwgY29uY2F0KFttc2ddLCBhcmdzKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQucGFzcyhuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBvc2VkTmFtZShwcmVmaXgsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuICFwcmVmaXggfHwgL15mYWlsLy50ZXN0KHByb3ApXG4gICAgICAgICAgICA/IHByb3BcbiAgICAgICAgICAgIDogcHJlZml4ICsgc3RyaW5nU2xpY2UocHJvcCwgMCwgMSkudG9VcHBlckNhc2UoKSArIHN0cmluZ1NsaWNlKHByb3AsIDEpO1xuICAgIH1cblxuICAgIGFzc2VydCA9IHtcbiAgICAgICAgZmFpbEV4Y2VwdGlvbjogXCJBc3NlcnRFcnJvclwiLFxuXG4gICAgICAgIGZhaWw6IGZ1bmN0aW9uIGZhaWwobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgZXJyb3IubmFtZSA9IHRoaXMuZmFpbEV4Y2VwdGlvbiB8fCBhc3NlcnQuZmFpbEV4Y2VwdGlvbjtcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFzczogZnVuY3Rpb24gcGFzcygpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSxcblxuICAgICAgICBjYWxsT3JkZXI6IGZ1bmN0aW9uIGFzc2VydENhbGxPcmRlcigpIHtcbiAgICAgICAgICAgIHZlcmlmeUlzU3R1Yi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBhY3R1YWwgPSBcIlwiO1xuXG4gICAgICAgICAgICBpZiAoIWNhbGxlZEluT3JkZXIoYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gam9pbihhcmd1bWVudHMsIFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYWxscyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBjYWxscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxzWy0taV0uY2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlKGNhbGxzLCBpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBqb2luKG9yZGVyQnlGaXJzdENhbGwoY2FsbHMpLCBcIiwgXCIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBmYWlscywgd2UnbGwganVzdCBmYWxsIGJhY2sgdG8gdGhlIGJsYW5rIHN0cmluZ1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZhaWxBc3NlcnRpb24odGhpcywgXCJleHBlY3RlZCBcIiArIGV4cGVjdGVkICsgXCIgdG8gYmUgY2FsbGVkIGluIG9yZGVyIGJ1dCB3ZXJlIGNhbGxlZCBhcyBcIiArIGFjdHVhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzc2VydC5wYXNzKFwiY2FsbE9yZGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNhbGxDb3VudDogZnVuY3Rpb24gYXNzZXJ0Q2FsbENvdW50KG1ldGhvZCwgY291bnQpIHtcbiAgICAgICAgICAgIHZlcmlmeUlzU3R1YihtZXRob2QpO1xuXG4gICAgICAgICAgICBpZiAobWV0aG9kLmNhbGxDb3VudCAhPT0gY291bnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgXCIgKyB0aW1lc0luV29yZHMoY291bnQpICsgXCIgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiO1xuICAgICAgICAgICAgICAgIGZhaWxBc3NlcnRpb24odGhpcywgbWV0aG9kLnByaW50Zihtc2cpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnBhc3MoXCJjYWxsQ291bnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXhwb3NlOiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ0YXJnZXQgaXMgbnVsbCBvciB1bmRlZmluZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIHZhciBwcmVmaXggPSAodHlwZW9mIG8ucHJlZml4ID09PSBcInVuZGVmaW5lZFwiICYmIFwiYXNzZXJ0XCIpIHx8IG8ucHJlZml4O1xuICAgICAgICAgICAgdmFyIGluY2x1ZGVGYWlsID0gdHlwZW9mIG8uaW5jbHVkZUZhaWwgPT09IFwidW5kZWZpbmVkXCIgfHwgQm9vbGVhbihvLmluY2x1ZGVGYWlsKTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW5zdGFuY2UpLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSBcImV4cG9zZVwiICYmIChpbmNsdWRlRmFpbCB8fCAhL14oZmFpbCkvLnRlc3QobWV0aG9kKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2V4cG9zZWROYW1lKHByZWZpeCwgbWV0aG9kKV0gPSBpbnN0YW5jZVttZXRob2RdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9LFxuXG4gICAgICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaChhY3R1YWwsIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IGNyZWF0ZU1hdGNoZXIoZXhwZWN0YXRpb24pO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIudGVzdChhY3R1YWwpKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnBhc3MoXCJtYXRjaFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IFtcbiAgICAgICAgICAgICAgICAgICAgXCJleHBlY3RlZCB2YWx1ZSB0byBtYXRjaFwiLFxuICAgICAgICAgICAgICAgICAgICBcIiAgICBleHBlY3RlZCA9IFwiICsgZm9ybWF0KGV4cGVjdGF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgXCIgICAgYWN0dWFsID0gXCIgKyBmb3JtYXQoYWN0dWFsKVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBmYWlsQXNzZXJ0aW9uKHRoaXMsIGpvaW4oZm9ybWF0dGVkLCBcIlxcblwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkXCIsIFwiZXhwZWN0ZWQgJW4gdG8gaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIGJ1dCB3YXMgbmV2ZXIgY2FsbGVkXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcbiAgICAgICAgXCJub3RDYWxsZWRcIixcbiAgICAgICAgZnVuY3Rpb24oc3B5KSB7XG4gICAgICAgICAgICByZXR1cm4gIXNweS5jYWxsZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZXhwZWN0ZWQgJW4gdG8gbm90IGhhdmUgYmVlbiBjYWxsZWQgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiXG4gICAgKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRPbmNlXCIsIFwiZXhwZWN0ZWQgJW4gdG8gYmUgY2FsbGVkIG9uY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRUd2ljZVwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB0d2ljZSBidXQgd2FzIGNhbGxlZCAlYyVDXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFRocmljZVwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB0aHJpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRPblwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoICUxIGFzIHRoaXMgYnV0IHdhcyBjYWxsZWQgd2l0aCAldFwiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJhbHdheXNDYWxsZWRPblwiLCBcImV4cGVjdGVkICVuIHRvIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCAlMSBhcyB0aGlzIGJ1dCB3YXMgY2FsbGVkIHdpdGggJXRcIik7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkV2l0aE5ld1wiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIG5ld1wiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG5ld1wiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRXaXRoXCIsIFwiZXhwZWN0ZWQgJW4gdG8gYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzICVEXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFdpdGhNYXRjaFwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIG1hdGNoICVEXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c0NhbGxlZFdpdGhcIiwgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzICVEXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c0NhbGxlZFdpdGhNYXRjaFwiLCBcImV4cGVjdGVkICVuIHRvIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBtYXRjaCAlRFwiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRXaXRoRXhhY3RseVwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIGV4YWN0IGFyZ3VtZW50cyAlRFwiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRPbmNlV2l0aEV4YWN0bHlcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgb25jZSBhbmQgd2l0aCBleGFjdCBhcmd1bWVudHMgJURcIik7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkT25jZVdpdGhNYXRjaFwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCBvbmNlIGFuZCB3aXRoIG1hdGNoICVEXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c0NhbGxlZFdpdGhFeGFjdGx5XCIsIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIGV4YWN0IGFyZ3VtZW50cyAlRFwiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJuZXZlckNhbGxlZFdpdGhcIiwgXCJleHBlY3RlZCAlbiB0byBuZXZlciBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgJSolQ1wiKTtcbiAgICBtaXJyb3JQcm9wQXNBc3NlcnRpb24oXCJuZXZlckNhbGxlZFdpdGhNYXRjaFwiLCBcImV4cGVjdGVkICVuIHRvIG5ldmVyIGJlIGNhbGxlZCB3aXRoIG1hdGNoICUqJUNcIik7XG4gICAgbWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwidGhyZXdcIiwgXCIlbiBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiVDXCIpO1xuICAgIG1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c1RocmV3XCIsIFwiJW4gZGlkIG5vdCBhbHdheXMgdGhyb3cgZXhjZXB0aW9uJUNcIik7XG5cbiAgICByZXR1cm4gYXNzZXJ0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFzc2VydE9iamVjdCgpO1xubW9kdWxlLmV4cG9ydHMuY3JlYXRlQXNzZXJ0T2JqZWN0ID0gY3JlYXRlQXNzZXJ0T2JqZWN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciBuZXh0VGljayA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9uZXh0LXRpY2tcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG52YXIgZXhwb3J0QXN5bmNCZWhhdmlvcnMgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZXhwb3J0LWFzeW5jLWJlaGF2aW9yc1wiKTtcblxudmFyIGNvbmNhdCA9IGFycmF5UHJvdG8uY29uY2F0O1xudmFyIGpvaW4gPSBhcnJheVByb3RvLmpvaW47XG52YXIgcmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbnZhciB1c2VMZWZ0TW9zdENhbGxiYWNrID0gLTE7XG52YXIgdXNlUmlnaHRNb3N0Q2FsbGJhY2sgPSAtMjtcblxuZnVuY3Rpb24gZ2V0Q2FsbGJhY2soYmVoYXZpb3IsIGFyZ3MpIHtcbiAgICB2YXIgY2FsbEFyZ0F0ID0gYmVoYXZpb3IuY2FsbEFyZ0F0O1xuXG4gICAgaWYgKGNhbGxBcmdBdCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2NhbGxBcmdBdF07XG4gICAgfVxuXG4gICAgdmFyIGFyZ3VtZW50TGlzdDtcblxuICAgIGlmIChjYWxsQXJnQXQgPT09IHVzZUxlZnRNb3N0Q2FsbGJhY2spIHtcbiAgICAgICAgYXJndW1lbnRMaXN0ID0gYXJncztcbiAgICB9XG5cbiAgICBpZiAoY2FsbEFyZ0F0ID09PSB1c2VSaWdodE1vc3RDYWxsYmFjaykge1xuICAgICAgICBhcmd1bWVudExpc3QgPSByZXZlcnNlKHNsaWNlKGFyZ3MpKTtcbiAgICB9XG5cbiAgICB2YXIgY2FsbEFyZ1Byb3AgPSBiZWhhdmlvci5jYWxsQXJnUHJvcDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRMaXN0Lmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBpZiAoIWNhbGxBcmdQcm9wICYmIHR5cGVvZiBhcmd1bWVudExpc3RbaV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50TGlzdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWxsQXJnUHJvcCAmJiBhcmd1bWVudExpc3RbaV0gJiYgdHlwZW9mIGFyZ3VtZW50TGlzdFtpXVtjYWxsQXJnUHJvcF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50TGlzdFtpXVtjYWxsQXJnUHJvcF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tFcnJvcihiZWhhdmlvciwgZnVuYywgYXJncykge1xuICAgIGlmIChiZWhhdmlvci5jYWxsQXJnQXQgPCAwKSB7XG4gICAgICAgIHZhciBtc2c7XG5cbiAgICAgICAgaWYgKGJlaGF2aW9yLmNhbGxBcmdQcm9wKSB7XG4gICAgICAgICAgICBtc2cgPVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZShiZWhhdmlvci5zdHViKSArXG4gICAgICAgICAgICAgICAgXCIgZXhwZWN0ZWQgdG8geWllbGQgdG8gJ1wiICtcbiAgICAgICAgICAgICAgICB2YWx1ZVRvU3RyaW5nKGJlaGF2aW9yLmNhbGxBcmdQcm9wKSArXG4gICAgICAgICAgICAgICAgXCInLCBidXQgbm8gb2JqZWN0IHdpdGggc3VjaCBhIHByb3BlcnR5IHdhcyBwYXNzZWQuXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtc2cgPSBmdW5jdGlvbk5hbWUoYmVoYXZpb3Iuc3R1YikgKyBcIiBleHBlY3RlZCB0byB5aWVsZCwgYnV0IG5vIGNhbGxiYWNrIHdhcyBwYXNzZWQuXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtc2cgKz0gXCIgUmVjZWl2ZWQgW1wiICsgam9pbihhcmdzLCBcIiwgXCIpICsgXCJdXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXNnO1xuICAgIH1cblxuICAgIHJldHVybiBcImFyZ3VtZW50IGF0IGluZGV4IFwiICsgYmVoYXZpb3IuY2FsbEFyZ0F0ICsgXCIgaXMgbm90IGEgZnVuY3Rpb246IFwiICsgZnVuYztcbn1cblxuZnVuY3Rpb24gZW5zdXJlQXJncyhuYW1lLCBiZWhhdmlvciwgYXJncykge1xuICAgIC8vIG1hcCBmdW5jdGlvbiBuYW1lIHRvIGludGVybmFsIHByb3BlcnR5XG4gICAgLy8gICBjYWxsc0FyZyA9PiBjYWxsQXJnQXRcbiAgICB2YXIgcHJvcGVydHkgPSBuYW1lLnJlcGxhY2UoL3NBcmcvLCBcIkFyZ0F0XCIpO1xuICAgIHZhciBpbmRleCA9IGJlaGF2aW9yW3Byb3BlcnR5XTtcblxuICAgIGlmIChpbmRleCA+PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgbmFtZSArIFwiIGZhaWxlZDogXCIgKyAoaW5kZXggKyAxKSArIFwiIGFyZ3VtZW50cyByZXF1aXJlZCBidXQgb25seSBcIiArIGFyZ3MubGVuZ3RoICsgXCIgcHJlc2VudFwiXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ2FsbGJhY2soYmVoYXZpb3IsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGJlaGF2aW9yLmNhbGxBcmdBdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBlbnN1cmVBcmdzKFwiY2FsbHNBcmdcIiwgYmVoYXZpb3IsIGFyZ3MpO1xuICAgICAgICB2YXIgZnVuYyA9IGdldENhbGxiYWNrKGJlaGF2aW9yLCBhcmdzKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihnZXRDYWxsYmFja0Vycm9yKGJlaGF2aW9yLCBmdW5jLCBhcmdzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVoYXZpb3IuY2FsbGJhY2tBc3luYykge1xuICAgICAgICAgICAgbmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZnVuYy5hcHBseShiZWhhdmlvci5jYWxsYmFja0NvbnRleHQsIGJlaGF2aW9yLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoYmVoYXZpb3IuY2FsbGJhY2tDb250ZXh0LCBiZWhhdmlvci5jYWxsYmFja0FyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG52YXIgcHJvdG8gPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoc3R1Yikge1xuICAgICAgICB2YXIgYmVoYXZpb3IgPSBleHRlbmQoe30sIHByb3RvKTtcbiAgICAgICAgZGVsZXRlIGJlaGF2aW9yLmNyZWF0ZTtcbiAgICAgICAgZGVsZXRlIGJlaGF2aW9yLmFkZEJlaGF2aW9yO1xuICAgICAgICBkZWxldGUgYmVoYXZpb3IuY3JlYXRlQmVoYXZpb3I7XG4gICAgICAgIGJlaGF2aW9yLnN0dWIgPSBzdHViO1xuXG4gICAgICAgIGlmIChzdHViLmRlZmF1bHRCZWhhdmlvciAmJiBzdHViLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeSkge1xuICAgICAgICAgICAgYmVoYXZpb3IucHJvbWlzZUxpYnJhcnkgPSBzdHViLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZWhhdmlvcjtcbiAgICB9LFxuXG4gICAgaXNQcmVzZW50OiBmdW5jdGlvbiBpc1ByZXNlbnQoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5jYWxsQXJnQXQgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uIHx8XG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbkNyZWF0b3IgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJldHVybkFyZ0F0ID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0aGlzLnJldHVyblRoaXMgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJlc29sdmVBcmdBdCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVGhpcyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudGhyb3dBcmdBdCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdGhpcy5mYWtlRm4gfHxcbiAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWVEZWZpbmVkXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8qZXNsaW50IGNvbXBsZXhpdHk6IFtcImVycm9yXCIsIDIwXSovXG4gICAgaW52b2tlOiBmdW5jdGlvbiBpbnZva2UoY29udGV4dCwgYXJncykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBjYWxsQ2FsbGJhY2sgKGNvbmRpdGlvbmFsbHkpIGNhbGxzIGVuc3VyZUFyZ3NcbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogY2FsbENhbGxiYWNrIGludGVudGlvbmFsbHkgaGFwcGVucyBiZWZvcmVcbiAgICAgICAgICogZXZlcnl0aGluZyBlbHNlIGFuZCBjYW5ub3QgYmUgbW92ZWQgbG93ZXJcbiAgICAgICAgICovXG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGNhbGxDYWxsYmFjayh0aGlzLCBhcmdzKTtcblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMuZXhjZXB0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXhjZXB0aW9uQ3JlYXRvcikge1xuICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gPSB0aGlzLmV4Y2VwdGlvbkNyZWF0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uQ3JlYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuZXhjZXB0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJldHVybkFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBlbnN1cmVBcmdzKFwicmV0dXJuc0FyZ1wiLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBhcmdzW3RoaXMucmV0dXJuQXJnQXRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmV0dXJuVGhpcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMudGhyb3dBcmdBdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZW5zdXJlQXJncyhcInRocm93c0FyZ1wiLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHRocm93IGFyZ3NbdGhpcy50aHJvd0FyZ0F0XTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZha2VGbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFrZUZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlc29sdmVBcmdBdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZW5zdXJlQXJncyhcInJlc29sdmVzQXJnXCIsIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlc29sdmUoYXJnc1t0aGlzLnJlc29sdmVBcmdBdF0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZVRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5wcm9taXNlTGlicmFyeSB8fCBQcm9taXNlKS5yZXNvbHZlKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZSkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlc29sdmUodGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5wcm9taXNlTGlicmFyeSB8fCBQcm9taXNlKS5yZWplY3QodGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsc1Rocm91Z2gpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVkTWV0aG9kID0gdGhpcy5lZmZlY3RpdmVXcmFwcGVkTWV0aG9kKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkTWV0aG9kLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FsbHNUaHJvdWdoV2l0aE5ldykge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBvcmlnaW5hbCBtZXRob2QgKGFzc3VtZWQgdG8gYmUgYSBjb25zdHJ1Y3RvciBpbiB0aGlzIGNhc2UpXG4gICAgICAgICAgICB2YXIgV3JhcHBlZENsYXNzID0gdGhpcy5lZmZlY3RpdmVXcmFwcGVkTWV0aG9kKCk7XG4gICAgICAgICAgICAvLyBUdXJuIHRoZSBhcmd1bWVudHMgb2JqZWN0IGludG8gYSBub3JtYWwgYXJyYXlcbiAgICAgICAgICAgIHZhciBhcmdzQXJyYXkgPSBzbGljZShhcmdzKTtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICB2YXIgRiA9IFdyYXBwZWRDbGFzcy5iaW5kLmFwcGx5KFdyYXBwZWRDbGFzcywgY29uY2F0KFtudWxsXSwgYXJnc0FycmF5KSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEYoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY2FsbEFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5WYWx1ZTtcbiAgICB9LFxuXG4gICAgZWZmZWN0aXZlV3JhcHBlZE1ldGhvZDogZnVuY3Rpb24gZWZmZWN0aXZlV3JhcHBlZE1ldGhvZCgpIHtcbiAgICAgICAgZm9yICh2YXIgc3R1YmIgPSB0aGlzLnN0dWI7IHN0dWJiOyBzdHViYiA9IHN0dWJiLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHN0dWJiLndyYXBwZWRNZXRob2QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R1YmIud3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCB3cmFwcGVkIG1ldGhvZFwiKTtcbiAgICB9LFxuXG4gICAgb25DYWxsOiBmdW5jdGlvbiBvbkNhbGwoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vbkNhbGwoaW5kZXgpO1xuICAgIH0sXG5cbiAgICBvbkZpcnN0Q2FsbDogZnVuY3Rpb24gb25GaXJzdENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0dWIub25GaXJzdENhbGwoKTtcbiAgICB9LFxuXG4gICAgb25TZWNvbmRDYWxsOiBmdW5jdGlvbiBvblNlY29uZENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0dWIub25TZWNvbmRDYWxsKCk7XG4gICAgfSxcblxuICAgIG9uVGhpcmRDYWxsOiBmdW5jdGlvbiBvblRoaXJkQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vblRoaXJkQ2FsbCgpO1xuICAgIH0sXG5cbiAgICB3aXRoQXJnczogZnVuY3Rpb24gd2l0aEFyZ3MoLyogYXJndW1lbnRzICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdEZWZpbmluZyBhIHN0dWIgYnkgaW52b2tpbmcgXCJzdHViLm9uQ2FsbCguLi4pLndpdGhBcmdzKC4uLilcIiAnICtcbiAgICAgICAgICAgICAgICAnaXMgbm90IHN1cHBvcnRlZC4gVXNlIFwic3R1Yi53aXRoQXJncyguLi4pLm9uQ2FsbCguLi4pXCIgJyArXG4gICAgICAgICAgICAgICAgXCJ0byBkZWZpbmUgc2VxdWVudGlhbCBiZWhhdmlvciBmb3IgY2FsbHMgd2l0aCBjZXJ0YWluIGFyZ3VtZW50cy5cIlxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJlaGF2aW9yKGJlaGF2aW9yTWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvciA9IHRoaXMuZGVmYXVsdEJlaGF2aW9yIHx8IHByb3RvLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QmVoYXZpb3JbYmVoYXZpb3JNZXRob2RdLmFwcGx5KHRoaXMuZGVmYXVsdEJlaGF2aW9yLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRCZWhhdmlvcihzdHViLCBuYW1lLCBmbikge1xuICAgIHByb3RvW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGNvbmNhdChbdGhpc10sIHNsaWNlKGFyZ3VtZW50cykpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1YiB8fCB0aGlzO1xuICAgIH07XG5cbiAgICBzdHViW25hbWVdID0gY3JlYXRlQmVoYXZpb3IobmFtZSk7XG59XG5cbnByb3RvLmFkZEJlaGF2aW9yID0gYWRkQmVoYXZpb3I7XG5wcm90by5jcmVhdGVCZWhhdmlvciA9IGNyZWF0ZUJlaGF2aW9yO1xuXG52YXIgYXN5bmNCZWhhdmlvcnMgPSBleHBvcnRBc3luY0JlaGF2aW9ycyhwcm90byk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kLm5vbkVudW0oe30sIHByb3RvLCBhc3luY0JlaGF2aW9ycyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHdhbGsgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvd2Fsa1wiKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwdXNoID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5wdXNoO1xuXG5mdW5jdGlvbiBjb2xsZWN0TWV0aG9kKG1ldGhvZHMsIG9iamVjdCwgcHJvcCwgcHJvcE93bmVyKSB7XG4gICAgaWYgKHR5cGVvZiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcE93bmVyLCBwcm9wKS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIGhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgcHVzaChtZXRob2RzLCBvYmplY3RbcHJvcF0pO1xuICAgIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgb3duIG1ldGhvZHMgb24gdGhlIHBhc3NlZCBvYmplY3RcbmZ1bmN0aW9uIGNvbGxlY3RPd25NZXRob2RzKG9iamVjdCkge1xuICAgIHZhciBtZXRob2RzID0gW107XG5cbiAgICB3YWxrKG9iamVjdCwgY29sbGVjdE1ldGhvZC5iaW5kKG51bGwsIG1ldGhvZHMsIG9iamVjdCkpO1xuXG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGVjdE93bk1ldGhvZHM7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKFwic3VwcG9ydHMtY29sb3JcIik7XG5cbmZ1bmN0aW9uIGNvbG9yaXplKHN0ciwgY29sb3IpIHtcbiAgICBpZiAoc3VwcG9ydHNDb2xvci5zdGRvdXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXFx4MWJbXCIgKyBjb2xvciArIFwibVwiICsgc3RyICsgXCJcXHgxYlswbVwiO1xufVxuXG5leHBvcnRzLnJlZCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiBjb2xvcml6ZShzdHIsIDMxKTtcbn07XG5cbmV4cG9ydHMuZ3JlZW4gPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gY29sb3JpemUoc3RyLCAzMik7XG59O1xuXG5leHBvcnRzLmN5YW4gPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gY29sb3JpemUoc3RyLCA5Nik7XG59O1xuXG5leHBvcnRzLndoaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIGNvbG9yaXplKHN0ciwgMzkpO1xufTtcblxuZXhwb3J0cy5ib2xkID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIGNvbG9yaXplKHN0ciwgMSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBTYW5kYm94ID0gcmVxdWlyZShcIi4vc2FuZGJveFwiKTtcblxudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcblxuZnVuY3Rpb24gcHJlcGFyZVNhbmRib3hGcm9tQ29uZmlnKGNvbmZpZykge1xuICAgIHZhciBzYW5kYm94ID0gbmV3IFNhbmRib3goKTtcblxuICAgIGlmIChjb25maWcudXNlRmFrZVNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy51c2VGYWtlU2VydmVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBzYW5kYm94LnNlcnZlclByb3RvdHlwZSA9IGNvbmZpZy51c2VGYWtlU2VydmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FuZGJveC51c2VGYWtlU2VydmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy51c2VGYWtlVGltZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnVzZUZha2VUaW1lcnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHNhbmRib3gudXNlRmFrZVRpbWVycyhjb25maWcudXNlRmFrZVRpbWVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzYW5kYm94LnVzZUZha2VUaW1lcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzYW5kYm94O1xufVxuXG5mdW5jdGlvbiBleHBvc2VWYWx1ZShzYW5kYm94LCBjb25maWcsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmluamVjdEludG8gJiYgIShrZXkgaW4gY29uZmlnLmluamVjdEludG8pKSB7XG4gICAgICAgIGNvbmZpZy5pbmplY3RJbnRvW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcHVzaChzYW5kYm94LmluamVjdGVkS2V5cywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKHNhbmRib3guYXJncywgdmFsdWUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FuZGJveChjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3goKTtcbiAgICB9XG5cbiAgICB2YXIgY29uZmlndXJlZFNhbmRib3ggPSBwcmVwYXJlU2FuZGJveEZyb21Db25maWcoY29uZmlnKTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5hcmdzID0gY29uZmlndXJlZFNhbmRib3guYXJncyB8fCBbXTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5pbmplY3RlZEtleXMgPSBbXTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5pbmplY3RJbnRvID0gY29uZmlnLmluamVjdEludG87XG4gICAgdmFyIGV4cG9zZWQgPSBjb25maWd1cmVkU2FuZGJveC5pbmplY3Qoe30pO1xuXG4gICAgaWYgKGNvbmZpZy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvckVhY2goY29uZmlnLnByb3BlcnRpZXMsIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGV4cG9zZWRbcHJvcF0gfHwgKHByb3AgPT09IFwic2FuZGJveFwiICYmIGNvbmZpZ3VyZWRTYW5kYm94KTtcbiAgICAgICAgICAgIGV4cG9zZVZhbHVlKGNvbmZpZ3VyZWRTYW5kYm94LCBjb25maWcsIHByb3AsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXhwb3NlVmFsdWUoY29uZmlndXJlZFNhbmRib3gsIGNvbmZpZywgXCJzYW5kYm94XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWd1cmVkU2FuZGJveDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVTYW5kYm94O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBpc1Byb3BlcnR5Q29uZmlndXJhYmxlID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2lzLXByb3BlcnR5LWNvbmZpZ3VyYWJsZVwiKTtcbnZhciBleHBvcnRBc3luY0JlaGF2aW9ycyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHBvcnQtYXN5bmMtYmVoYXZpb3JzXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG5cbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbnZhciB1c2VMZWZ0TW9zdENhbGxiYWNrID0gLTE7XG52YXIgdXNlUmlnaHRNb3N0Q2FsbGJhY2sgPSAtMjtcblxuZnVuY3Rpb24gdGhyb3dzRXhjZXB0aW9uKGZha2UsIGVycm9yLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IGVycm9yO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG5ld0V4Y2VwdGlvbiA9IG5ldyBFcnJvcihtZXNzYWdlIHx8IFwiXCIpO1xuICAgICAgICAgICAgbmV3RXhjZXB0aW9uLm5hbWUgPSBlcnJvcjtcbiAgICAgICAgICAgIHJldHVybiBuZXdFeGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiRXJyb3JcIik7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFrZS5leGNlcHRpb24gPSBlcnJvcjtcbiAgICB9XG59XG5cbnZhciBkZWZhdWx0QmVoYXZpb3JzID0ge1xuICAgIGNhbGxzRmFrZTogZnVuY3Rpb24gY2FsbHNGYWtlKGZha2UsIGZuKSB7XG4gICAgICAgIGZha2UuZmFrZUZuID0gZm47XG4gICAgfSxcblxuICAgIGNhbGxzQXJnOiBmdW5jdGlvbiBjYWxsc0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gaW5kZXg7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ09uOiBmdW5jdGlvbiBjYWxsc0FyZ09uKGZha2UsIGluZGV4LCBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBpbmRleCBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSBpbmRleDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IFtdO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ1dpdGg6IGZ1bmN0aW9uIGNhbGxzQXJnV2l0aChmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gaW5kZXg7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxzQXJnT25XaXRoOiBmdW5jdGlvbiBjYWxsc0FyZ1dpdGgoZmFrZSwgaW5kZXgsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IGluZGV4O1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAzKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgdXNpbmdQcm9taXNlOiBmdW5jdGlvbiB1c2luZ1Byb21pc2UoZmFrZSwgcHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgZmFrZS5wcm9taXNlTGlicmFyeSA9IHByb21pc2VMaWJyYXJ5O1xuICAgIH0sXG5cbiAgICB5aWVsZHM6IGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSB1c2VMZWZ0TW9zdENhbGxiYWNrO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNSaWdodDogZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZVJpZ2h0TW9zdENhbGxiYWNrO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNPbjogZnVuY3Rpb24oZmFrZSwgY29udGV4dCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUbzogZnVuY3Rpb24oZmFrZSwgcHJvcCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHByb3A7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUb09uOiBmdW5jdGlvbihmYWtlLCBwcm9wLCBjb250ZXh0KSB7XG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gdXNlTGVmdE1vc3RDYWxsYmFjaztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlKGFyZ3VtZW50cywgMyk7XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHByb3A7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB0aHJvd3M6IHRocm93c0V4Y2VwdGlvbixcbiAgICB0aHJvd3NFeGNlcHRpb246IHRocm93c0V4Y2VwdGlvbixcblxuICAgIHJldHVybnM6IGZ1bmN0aW9uIHJldHVybnMoZmFrZSwgdmFsdWUpIHtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZWplY3QgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSB0cnVlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgcmV0dXJuc0FyZzogZnVuY3Rpb24gcmV0dXJuc0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UucmV0dXJuQXJnQXQgPSBpbmRleDtcbiAgICB9LFxuXG4gICAgdGhyb3dzQXJnOiBmdW5jdGlvbiB0aHJvd3NBcmcoZmFrZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLnRocm93QXJnQXQgPSBpbmRleDtcbiAgICB9LFxuXG4gICAgcmV0dXJuc1RoaXM6IGZ1bmN0aW9uIHJldHVybnNUaGlzKGZha2UpIHtcbiAgICAgICAgZmFrZS5yZXR1cm5UaGlzID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZXM6IGZ1bmN0aW9uIHJlc29sdmVzKGZha2UsIHZhbHVlKSB7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlVGhpcyA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlamVjdCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlRGVmaW5lZCA9IHRydWU7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZXNvbHZlc0FyZzogZnVuY3Rpb24gcmVzb2x2ZXNBcmcoZmFrZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZmFrZS5yZXNvbHZlQXJnQXQgPSBpbmRleDtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5yZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlVGhpcyA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlamVjdCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlRGVmaW5lZCA9IGZhbHNlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgcmVqZWN0czogZnVuY3Rpb24gcmVqZWN0cyhmYWtlLCBlcnJvciwgbWVzc2FnZSkge1xuICAgICAgICB2YXIgcmVhc29uO1xuICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZWFzb24gPSBuZXcgRXJyb3IobWVzc2FnZSB8fCBcIlwiKTtcbiAgICAgICAgICAgIHJlYXNvbi5uYW1lID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZWFzb24gPSBuZXcgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYXNvbiA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWUgPSByZWFzb247XG4gICAgICAgIGZha2UucmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlc29sdmVUaGlzID0gZmFsc2U7XG4gICAgICAgIGZha2UucmVqZWN0ID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSB0cnVlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZXNUaGlzOiBmdW5jdGlvbiByZXNvbHZlc1RoaXMoZmFrZSkge1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlVGhpcyA9IHRydWU7XG4gICAgICAgIGZha2UucmVqZWN0ID0gZmFsc2U7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWVEZWZpbmVkID0gZmFsc2U7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBjYWxsVGhyb3VnaDogZnVuY3Rpb24gY2FsbFRocm91Z2goZmFrZSkge1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IHRydWU7XG4gICAgfSxcblxuICAgIGNhbGxUaHJvdWdoV2l0aE5ldzogZnVuY3Rpb24gY2FsbFRocm91Z2hXaXRoTmV3KGZha2UpIHtcbiAgICAgICAgZmFrZS5jYWxsc1Rocm91Z2hXaXRoTmV3ID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoZmFrZSwgZ2V0dGVyRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHJvb3RTdHViID0gZmFrZS5zdHViIHx8IGZha2U7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lLCB7XG4gICAgICAgICAgICBnZXQ6IGdldHRlckZ1bmN0aW9uLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoZmFrZSwgc2V0dGVyRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHJvb3RTdHViID0gZmFrZS5zdHViIHx8IGZha2U7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgcm9vdFN0dWIucm9vdE9iaixcbiAgICAgICAgICAgIHJvb3RTdHViLnByb3BOYW1lLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFjY2Vzc29yLXBhaXJzXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXJGdW5jdGlvbixcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGlzUHJvcGVydHlDb25maWd1cmFibGUocm9vdFN0dWIucm9vdE9iaiwgcm9vdFN0dWIucHJvcE5hbWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGZha2U7XG4gICAgfSxcblxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShmYWtlLCBuZXdWYWwpIHtcbiAgICAgICAgdmFyIHJvb3RTdHViID0gZmFrZS5zdHViIHx8IGZha2U7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lLCB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3VmFsLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogcm9vdFN0dWIuc2hhZG93c1Byb3BPblByb3RvdHlwZSB8fCBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9XG59O1xuXG52YXIgYXN5bmNCZWhhdmlvcnMgPSBleHBvcnRBc3luY0JlaGF2aW9ycyhkZWZhdWx0QmVoYXZpb3JzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHRlbmQoe30sIGRlZmF1bHRCZWhhdmlvcnMsIGFzeW5jQmVoYXZpb3JzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgY3JlYXRlUHJveHkgPSByZXF1aXJlKFwiLi9wcm94eVwiKTtcbnZhciBuZXh0VGljayA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9uZXh0LXRpY2tcIik7XG5cbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbmZ1bmN0aW9uIGdldEVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgPyB2YWx1ZSA6IG5ldyBFcnJvcih2YWx1ZSk7XG59XG5cbnZhciB1dWlkID0gMDtcbmZ1bmN0aW9uIHdyYXBGdW5jKGYpIHtcbiAgICB2YXIgcHJveHk7XG4gICAgdmFyIGZha2VJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmlyc3RBcmcsIGxhc3RBcmc7XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaXJzdEFyZyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIGxhc3RBcmcgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbGxiYWNrID0gbGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gXCJmdW5jdGlvblwiID8gbGFzdEFyZyA6IHVuZGVmaW5lZDtcblxuICAgICAgICBwcm94eS5maXJzdEFyZyA9IGZpcnN0QXJnO1xuICAgICAgICBwcm94eS5sYXN0QXJnID0gbGFzdEFyZztcbiAgICAgICAgcHJveHkuY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgICByZXR1cm4gZiAmJiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBwcm94eSA9IGNyZWF0ZVByb3h5KGZha2VJbnN0YW5jZSwgZiB8fCBmYWtlSW5zdGFuY2UpO1xuXG4gICAgcHJveHkuZGlzcGxheU5hbWUgPSBcImZha2VcIjtcbiAgICBwcm94eS5pZCA9IFwiZmFrZSNcIiArIHV1aWQrKztcblxuICAgIHJldHVybiBwcm94eTtcbn1cblxuZnVuY3Rpb24gZmFrZUNsYXNzKCkge1xuICAgIHZhciBwcm9taXNlTGliID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIFByb21pc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBwcm9taXNlTGliID0gUHJvbWlzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmYWtlKGYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBmIGFyZ3VtZW50IHRvIGJlIGEgRnVuY3Rpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd3JhcEZ1bmMoZik7XG4gICAgfVxuXG4gICAgZmFrZS5yZXR1cm5zID0gZnVuY3Rpb24gcmV0dXJucyh2YWx1ZSkge1xuICAgICAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xuICAgIH07XG5cbiAgICBmYWtlLnRocm93cyA9IGZ1bmN0aW9uIHRocm93cyh2YWx1ZSkge1xuICAgICAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICAgICAgdGhyb3cgZ2V0RXJyb3IodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xuICAgIH07XG5cbiAgICBmYWtlLnJlc29sdmVzID0gZnVuY3Rpb24gcmVzb2x2ZXModmFsdWUpIHtcbiAgICAgICAgZnVuY3Rpb24gZigpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlTGliLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xuICAgIH07XG5cbiAgICBmYWtlLnJlamVjdHMgPSBmdW5jdGlvbiByZWplY3RzKHZhbHVlKSB7XG4gICAgICAgIGZ1bmN0aW9uIGYoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZUxpYi5yZWplY3QoZ2V0RXJyb3IodmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3cmFwRnVuYyhmKTtcbiAgICB9O1xuXG4gICAgZmFrZS51c2luZ1Byb21pc2UgPSBmdW5jdGlvbiB1c2luZ1Byb21pc2UocHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgcHJvbWlzZUxpYiA9IHByb21pc2VMaWJyYXJ5O1xuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24geWllbGRJbnRlcm5hbChhc3luYywgdmFsdWVzKSB7XG4gICAgICAgIGZ1bmN0aW9uIGYoKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGxhc3QgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgICAgIG5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xuICAgIH1cblxuICAgIGZha2UueWllbGRzID0gZnVuY3Rpb24geWllbGRzKCkge1xuICAgICAgICByZXR1cm4geWllbGRJbnRlcm5hbChmYWxzZSwgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGZha2UueWllbGRzQXN5bmMgPSBmdW5jdGlvbiB5aWVsZHNBc3luYygpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkSW50ZXJuYWwodHJ1ZSwgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBmYWtlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZha2VDbGFzcygpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBwcm94eUludm9rZSA9IHJlcXVpcmUoXCIuL3Byb3h5LWludm9rZVwiKTtcbnZhciBwcm94eUNhbGxUb1N0cmluZyA9IHJlcXVpcmUoXCIuL3Byb3h5LWNhbGxcIikudG9TdHJpbmc7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3RpbWVzLWluLXdvcmRzXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgbWF0Y2ggPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXI7XG52YXIgc3R1YiA9IHJlcXVpcmUoXCIuL3N0dWJcIik7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZShcIi4vYXNzZXJ0XCIpO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCJAc2lub25qcy9zYW1zYW1cIikuZGVlcEVxdWFsO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBldmVyeSA9IGFycmF5UHJvdG8uZXZlcnk7XG52YXIgZm9yRWFjaCA9IGFycmF5UHJvdG8uZm9yRWFjaDtcbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcblxuZnVuY3Rpb24gY2FsbENvdW50SW5Xb3JkcyhjYWxsQ291bnQpIHtcbiAgICBpZiAoY2FsbENvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcIm5ldmVyIGNhbGxlZFwiO1xuICAgIH1cblxuICAgIHJldHVybiBcImNhbGxlZCBcIiArIHRpbWVzSW5Xb3JkcyhjYWxsQ291bnQpO1xufVxuXG5mdW5jdGlvbiBleHBlY3RlZENhbGxDb3VudEluV29yZHMoZXhwZWN0YXRpb24pIHtcbiAgICB2YXIgbWluID0gZXhwZWN0YXRpb24ubWluQ2FsbHM7XG4gICAgdmFyIG1heCA9IGV4cGVjdGF0aW9uLm1heENhbGxzO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB2YXIgc3RyID0gdGltZXNJbldvcmRzKG1pbik7XG5cbiAgICAgICAgaWYgKG1pbiAhPT0gbWF4KSB7XG4gICAgICAgICAgICBzdHIgPSBcImF0IGxlYXN0IFwiICsgc3RyICsgXCIgYW5kIGF0IG1vc3QgXCIgKyB0aW1lc0luV29yZHMobWF4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXQgbGVhc3QgXCIgKyB0aW1lc0luV29yZHMobWluKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJhdCBtb3N0IFwiICsgdGltZXNJbldvcmRzKG1heCk7XG59XG5cbmZ1bmN0aW9uIHJlY2VpdmVkTWluQ2FsbHMoZXhwZWN0YXRpb24pIHtcbiAgICB2YXIgaGFzTWluTGltaXQgPSB0eXBlb2YgZXhwZWN0YXRpb24ubWluQ2FsbHMgPT09IFwibnVtYmVyXCI7XG4gICAgcmV0dXJuICFoYXNNaW5MaW1pdCB8fCBleHBlY3RhdGlvbi5jYWxsQ291bnQgPj0gZXhwZWN0YXRpb24ubWluQ2FsbHM7XG59XG5cbmZ1bmN0aW9uIHJlY2VpdmVkTWF4Q2FsbHMoZXhwZWN0YXRpb24pIHtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGF0aW9uLm1heENhbGxzICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwZWN0YXRpb24uY2FsbENvdW50ID09PSBleHBlY3RhdGlvbi5tYXhDYWxscztcbn1cblxuZnVuY3Rpb24gdmVyaWZ5TWF0Y2hlcihwb3NzaWJsZU1hdGNoZXIsIGFyZykge1xuICAgIHZhciBpc01hdGNoZXIgPSBtYXRjaC5pc01hdGNoZXIocG9zc2libGVNYXRjaGVyKTtcblxuICAgIHJldHVybiAoaXNNYXRjaGVyICYmIHBvc3NpYmxlTWF0Y2hlci50ZXN0KGFyZykpIHx8IHRydWU7XG59XG5cbnZhciBtb2NrRXhwZWN0YXRpb24gPSB7XG4gICAgbWluQ2FsbHM6IDEsXG4gICAgbWF4Q2FsbHM6IDEsXG5cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZShtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbiA9IGV4dGVuZC5ub25FbnVtKHN0dWIoKSwgbW9ja0V4cGVjdGF0aW9uKTtcbiAgICAgICAgZGVsZXRlIGV4cGVjdGF0aW9uLmNyZWF0ZTtcbiAgICAgICAgZXhwZWN0YXRpb24ubWV0aG9kID0gbWV0aG9kTmFtZTtcblxuICAgICAgICByZXR1cm4gZXhwZWN0YXRpb247XG4gICAgfSxcblxuICAgIGludm9rZTogZnVuY3Rpb24gaW52b2tlKGZ1bmMsIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICB0aGlzLnZlcmlmeUNhbGxBbGxvd2VkKHRoaXNWYWx1ZSwgYXJncyk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5SW52b2tlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIGF0TGVhc3Q6IGZ1bmN0aW9uIGF0TGVhc3QobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiJ1wiICsgdmFsdWVUb1N0cmluZyhudW0pICsgXCInIGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubGltaXRzU2V0KSB7XG4gICAgICAgICAgICB0aGlzLm1heENhbGxzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubGltaXRzU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWluQ2FsbHMgPSBudW07XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGF0TW9zdDogZnVuY3Rpb24gYXRNb3N0KG51bSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidcIiArIHZhbHVlVG9TdHJpbmcobnVtKSArIFwiJyBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpbWl0c1NldCkge1xuICAgICAgICAgICAgdGhpcy5taW5DYWxscyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxpbWl0c1NldCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1heENhbGxzID0gbnVtO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBuZXZlcjogZnVuY3Rpb24gbmV2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMCk7XG4gICAgfSxcblxuICAgIG9uY2U6IGZ1bmN0aW9uIG9uY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMSk7XG4gICAgfSxcblxuICAgIHR3aWNlOiBmdW5jdGlvbiB0d2ljZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhhY3RseSgyKTtcbiAgICB9LFxuXG4gICAgdGhyaWNlOiBmdW5jdGlvbiB0aHJpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMyk7XG4gICAgfSxcblxuICAgIGV4YWN0bHk6IGZ1bmN0aW9uIGV4YWN0bHkobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiJ1wiICsgdmFsdWVUb1N0cmluZyhudW0pICsgXCInIGlzIG5vdCBhIG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXRMZWFzdChudW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5hdE1vc3QobnVtKTtcbiAgICB9LFxuXG4gICAgbWV0OiBmdW5jdGlvbiBtZXQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5mYWlsZWQgJiYgcmVjZWl2ZWRNaW5DYWxscyh0aGlzKTtcbiAgICB9LFxuXG4gICAgdmVyaWZ5Q2FsbEFsbG93ZWQ6IGZ1bmN0aW9uIHZlcmlmeUNhbGxBbGxvd2VkKHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICB2YXIgZXhwZWN0ZWRBcmd1bWVudHMgPSB0aGlzLmV4cGVjdGVkQXJndW1lbnRzO1xuXG4gICAgICAgIGlmIChyZWNlaXZlZE1heENhbGxzKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbCh0aGlzLm1ldGhvZCArIFwiIGFscmVhZHkgY2FsbGVkIFwiICsgdGltZXNJbldvcmRzKHRoaXMubWF4Q2FsbHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcImV4cGVjdGVkVGhpc1wiIGluIHRoaXMgJiYgdGhpcy5leHBlY3RlZFRoaXMgIT09IHRoaXNWYWx1ZSkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoXG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2QgK1xuICAgICAgICAgICAgICAgICAgICBcIiBjYWxsZWQgd2l0aCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlVG9TdHJpbmcodGhpc1ZhbHVlKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIGFzIHRoaXNWYWx1ZSwgZXhwZWN0ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvU3RyaW5nKHRoaXMuZXhwZWN0ZWRUaGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKFwiZXhwZWN0ZWRBcmd1bWVudHNcIiBpbiB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbCh0aGlzLm1ldGhvZCArIFwiIHJlY2VpdmVkIG5vIGFyZ3VtZW50cywgZXhwZWN0ZWQgXCIgKyBmb3JtYXQoZXhwZWN0ZWRBcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IGV4cGVjdGVkQXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoXG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2QgK1xuICAgICAgICAgICAgICAgICAgICBcIiByZWNlaXZlZCB0b28gZmV3IGFyZ3VtZW50cyAoXCIgK1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQoYXJncykgK1xuICAgICAgICAgICAgICAgICAgICBcIiksIGV4cGVjdGVkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0KGV4cGVjdGVkQXJndW1lbnRzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4cGVjdHNFeGFjdEFyZ0NvdW50ICYmIGFyZ3MubGVuZ3RoICE9PSBleHBlY3RlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kICtcbiAgICAgICAgICAgICAgICAgICAgXCIgcmVjZWl2ZWQgdG9vIG1hbnkgYXJndW1lbnRzIChcIiArXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdChhcmdzKSArXG4gICAgICAgICAgICAgICAgICAgIFwiKSwgZXhwZWN0ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQoZXhwZWN0ZWRBcmd1bWVudHMpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgIGV4cGVjdGVkQXJndW1lbnRzLFxuICAgICAgICAgICAgZnVuY3Rpb24oZXhwZWN0ZWRBcmd1bWVudCwgaSkge1xuICAgICAgICAgICAgICAgIGlmICghdmVyaWZ5TWF0Y2hlcihleHBlY3RlZEFyZ3VtZW50LCBhcmdzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiByZWNlaXZlZCB3cm9uZyBhcmd1bWVudHMgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChhcmdzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIsIGRpZG4ndCBtYXRjaCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKGV4cGVjdGVkQXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGFyZ3NbaV0sIGV4cGVjdGVkQXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRob2QgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHJlY2VpdmVkIHdyb25nIGFyZ3VtZW50cyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KGFyZ3MpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiwgZXhwZWN0ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChleHBlY3RlZEFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBhbGxvd3NDYWxsOiBmdW5jdGlvbiBhbGxvd3NDYWxsKHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICB2YXIgZXhwZWN0ZWRBcmd1bWVudHMgPSB0aGlzLmV4cGVjdGVkQXJndW1lbnRzO1xuXG4gICAgICAgIGlmICh0aGlzLm1ldCgpICYmIHJlY2VpdmVkTWF4Q2FsbHModGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcImV4cGVjdGVkVGhpc1wiIGluIHRoaXMgJiYgdGhpcy5leHBlY3RlZFRoaXMgIT09IHRoaXNWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEoXCJleHBlY3RlZEFyZ3VtZW50c1wiIGluIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICB2YXIgX2FyZ3MgPSBhcmdzIHx8IFtdO1xuXG4gICAgICAgIGlmIChfYXJncy5sZW5ndGggPCBleHBlY3RlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4cGVjdHNFeGFjdEFyZ0NvdW50ICYmIF9hcmdzLmxlbmd0aCAhPT0gZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXZlcnkoZXhwZWN0ZWRBcmd1bWVudHMsIGZ1bmN0aW9uKGV4cGVjdGVkQXJndW1lbnQsIGkpIHtcbiAgICAgICAgICAgIGlmICghdmVyaWZ5TWF0Y2hlcihleHBlY3RlZEFyZ3VtZW50LCBfYXJnc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKF9hcmdzW2ldLCBleHBlY3RlZEFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB3aXRoQXJnczogZnVuY3Rpb24gd2l0aEFyZ3MoKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgd2l0aEV4YWN0QXJnczogZnVuY3Rpb24gd2l0aEV4YWN0QXJncygpIHtcbiAgICAgICAgdGhpcy53aXRoQXJncy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmV4cGVjdHNFeGFjdEFyZ0NvdW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIG9uOiBmdW5jdGlvbiBvbih0aGlzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RlZFRoaXMgPSB0aGlzVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UodGhpcy5leHBlY3RlZEFyZ3VtZW50cyB8fCBbXSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4cGVjdHNFeGFjdEFyZ0NvdW50KSB7XG4gICAgICAgICAgICBwdXNoKGFyZ3MsIFwiWy4uLl1cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FsbFN0ciA9IHByb3h5Q2FsbFRvU3RyaW5nLmNhbGwoe1xuICAgICAgICAgICAgcHJveHk6IHRoaXMubWV0aG9kIHx8IFwiYW5vbnltb3VzIG1vY2sgZXhwZWN0YXRpb25cIixcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBjYWxsU3RyLnJlcGxhY2UoXCIsIFsuLi5cIiwgXCJbLCAuLi5cIikgKyBcIiBcIiArIGV4cGVjdGVkQ2FsbENvdW50SW5Xb3Jkcyh0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5tZXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiRXhwZWN0YXRpb24gbWV0OiBcIiArIG1lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJFeHBlY3RlZCBcIiArIG1lc3NhZ2UgKyBcIiAoXCIgKyBjYWxsQ291bnRJbldvcmRzKHRoaXMuY2FsbENvdW50KSArIFwiKVwiO1xuICAgIH0sXG5cbiAgICB2ZXJpZnk6IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1ldCgpKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChTdHJpbmcodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLnBhc3MoU3RyaW5nKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBwYXNzOiBmdW5jdGlvbiBwYXNzKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0LnBhc3MobWVzc2FnZSk7XG4gICAgfSxcblxuICAgIGZhaWw6IGZ1bmN0aW9uIGZhaWwobWVzc2FnZSkge1xuICAgICAgICB2YXIgZXhjZXB0aW9uID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBleGNlcHRpb24ubmFtZSA9IFwiRXhwZWN0YXRpb25FcnJvclwiO1xuXG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vY2tFeHBlY3RhdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgbW9ja0V4cGVjdGF0aW9uID0gcmVxdWlyZShcIi4vbW9jay1leHBlY3RhdGlvblwiKTtcbnZhciBwcm94eUNhbGxUb1N0cmluZyA9IHJlcXVpcmUoXCIuL3Byb3h5LWNhbGxcIikudG9TdHJpbmc7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2V4dGVuZFwiKTtcbnZhciBkZWVwRXF1YWwgPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmRlZXBFcXVhbDtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dyYXAtbWV0aG9kXCIpO1xudmFyIHVzZVByb21pc2VMaWJyYXJ5ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3VzZS1wcm9taXNlLWxpYnJhcnlcIik7XG5cbnZhciBjb25jYXQgPSBhcnJheVByb3RvLmNvbmNhdDtcbnZhciBmaWx0ZXIgPSBhcnJheVByb3RvLmZpbHRlcjtcbnZhciBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xudmFyIGV2ZXJ5ID0gYXJyYXlQcm90by5ldmVyeTtcbnZhciBqb2luID0gYXJyYXlQcm90by5qb2luO1xudmFyIHB1c2ggPSBhcnJheVByb3RvLnB1c2g7XG52YXIgc2xpY2UgPSBhcnJheVByb3RvLnNsaWNlO1xudmFyIHVuc2hpZnQgPSBhcnJheVByb3RvLnVuc2hpZnQ7XG5cbmZ1bmN0aW9uIG1vY2sob2JqZWN0KSB7XG4gICAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gbW9ja0V4cGVjdGF0aW9uLmNyZWF0ZShvYmplY3QgPyBvYmplY3QgOiBcIkFub255bW91cyBtb2NrXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2NrLmNyZWF0ZShvYmplY3QpO1xufVxuXG5mdW5jdGlvbiBlYWNoKGNvbGxlY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGNvbCA9IGNvbGxlY3Rpb24gfHwgW107XG5cbiAgICBmb3JFYWNoKGNvbCwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBhcnJheUVxdWFscyhhcnIxLCBhcnIyLCBjb21wYXJlTGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmVMZW5ndGggJiYgYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlcnkoYXJyMSwgZnVuY3Rpb24oZWxlbWVudCwgaSkge1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGFycjJbaV0sIGVsZW1lbnQpO1xuICAgIH0pO1xufVxuXG5leHRlbmQobW9jaywge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKG9iamVjdCkge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9iamVjdCBpcyBudWxsXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1vY2tPYmplY3QgPSBleHRlbmQubm9uRW51bSh7fSwgbW9jaywgeyBvYmplY3Q6IG9iamVjdCB9KTtcbiAgICAgICAgZGVsZXRlIG1vY2tPYmplY3QuY3JlYXRlO1xuXG4gICAgICAgIHJldHVybiBtb2NrT2JqZWN0O1xuICAgIH0sXG5cbiAgICBleHBlY3RzOiBmdW5jdGlvbiBleHBlY3RzKG1ldGhvZCkge1xuICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1ldGhvZCBpcyBmYWxzeVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5leHBlY3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0YXRpb25zID0ge307XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbHVyZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSkge1xuICAgICAgICAgICAgdGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSA9IFtdO1xuICAgICAgICAgICAgdmFyIG1vY2tPYmplY3QgPSB0aGlzO1xuXG4gICAgICAgICAgICB3cmFwTWV0aG9kKHRoaXMub2JqZWN0LCBtZXRob2QsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2NrT2JqZWN0Lmludm9rZU1ldGhvZChtZXRob2QsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHVzaCh0aGlzLnByb3hpZXMsIG1ldGhvZCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXhwZWN0YXRpb24gPSBtb2NrRXhwZWN0YXRpb24uY3JlYXRlKG1ldGhvZCk7XG4gICAgICAgIGV4cGVjdGF0aW9uLndyYXBwZWRNZXRob2QgPSB0aGlzLm9iamVjdFttZXRob2RdLndyYXBwZWRNZXRob2Q7XG4gICAgICAgIHB1c2godGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSwgZXhwZWN0YXRpb24pO1xuICAgICAgICB1c2VQcm9taXNlTGlicmFyeSh0aGlzLnByb21pc2VMaWJyYXJ5LCBleHBlY3RhdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uO1xuICAgIH0sXG5cbiAgICByZXN0b3JlOiBmdW5jdGlvbiByZXN0b3JlKCkge1xuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5vYmplY3Q7XG5cbiAgICAgICAgZWFjaCh0aGlzLnByb3hpZXMsIGZ1bmN0aW9uKHByb3h5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdFtwcm94eV0ucmVzdG9yZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W3Byb3h5XS5yZXN0b3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB2ZXJpZnk6IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9ucyA9IHRoaXMuZXhwZWN0YXRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgbWVzc2FnZXMgPSB0aGlzLmZhaWx1cmVzID8gc2xpY2UodGhpcy5mYWlsdXJlcykgOiBbXTtcbiAgICAgICAgdmFyIG1ldCA9IFtdO1xuXG4gICAgICAgIGVhY2godGhpcy5wcm94aWVzLCBmdW5jdGlvbihwcm94eSkge1xuICAgICAgICAgICAgZWFjaChleHBlY3RhdGlvbnNbcHJveHldLCBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICghZXhwZWN0YXRpb24ubWV0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaChtZXNzYWdlcywgU3RyaW5nKGV4cGVjdGF0aW9uKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaChtZXQsIFN0cmluZyhleHBlY3RhdGlvbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcblxuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoam9pbihjb25jYXQobWVzc2FnZXMsIG1ldCksIFwiXFxuXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLnBhc3Moam9pbihjb25jYXQobWVzc2FnZXMsIG1ldCksIFwiXFxuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICB1c2luZ1Byb21pc2U6IGZ1bmN0aW9uIHVzaW5nUHJvbWlzZShwcm9taXNlTGlicmFyeSkge1xuICAgICAgICB0aGlzLnByb21pc2VMaWJyYXJ5ID0gcHJvbWlzZUxpYnJhcnk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGludm9rZU1ldGhvZDogZnVuY3Rpb24gaW52b2tlTWV0aG9kKG1ldGhvZCwgdGhpc1ZhbHVlLCBhcmdzKSB7XG4gICAgICAgIC8qIGlmIHdlIGNhbm5vdCBmaW5kIGFueSBtYXRjaGluZyBmaWxlcyB3ZSB3aWxsIGV4cGxpY2l0bHkgY2FsbCBtb2NrRXhwZWN0aW9uI2ZhaWwgd2l0aCBlcnJvciBtZXNzYWdlcyAqL1xuICAgICAgICAvKiBlc2xpbnQgY29uc2lzdGVudC1yZXR1cm46IFwib2ZmXCIgKi9cbiAgICAgICAgdmFyIGV4cGVjdGF0aW9ucyA9IHRoaXMuZXhwZWN0YXRpb25zICYmIHRoaXMuZXhwZWN0YXRpb25zW21ldGhvZF0gPyB0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdIDogW107XG4gICAgICAgIHZhciBjdXJyZW50QXJncyA9IGFyZ3MgfHwgW107XG4gICAgICAgIHZhciBhdmFpbGFibGU7XG5cbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uc1dpdGhNYXRjaGluZ0FyZ3MgPSBmaWx0ZXIoZXhwZWN0YXRpb25zLCBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgdmFyIGV4cGVjdGVkQXJncyA9IGV4cGVjdGF0aW9uLmV4cGVjdGVkQXJndW1lbnRzIHx8IFtdO1xuXG4gICAgICAgICAgICByZXR1cm4gYXJyYXlFcXVhbHMoZXhwZWN0ZWRBcmdzLCBjdXJyZW50QXJncywgZXhwZWN0YXRpb24uZXhwZWN0c0V4YWN0QXJnQ291bnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZXhwZWN0YXRpb25zVG9BcHBseSA9IGZpbHRlcihleHBlY3RhdGlvbnNXaXRoTWF0Y2hpbmdBcmdzLCBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICFleHBlY3RhdGlvbi5tZXQoKSAmJiBleHBlY3RhdGlvbi5hbGxvd3NDYWxsKHRoaXNWYWx1ZSwgYXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChleHBlY3RhdGlvbnNUb0FwcGx5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbnNUb0FwcGx5WzBdLmFwcGx5KHRoaXNWYWx1ZSwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWVzc2FnZXMgPSBbXTtcbiAgICAgICAgdmFyIGV4aGF1c3RlZCA9IDA7XG5cbiAgICAgICAgZm9yRWFjaChleHBlY3RhdGlvbnNXaXRoTWF0Y2hpbmdBcmdzLCBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgaWYgKGV4cGVjdGF0aW9uLmFsbG93c0NhbGwodGhpc1ZhbHVlLCBhcmdzKSkge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGF2YWlsYWJsZSB8fCBleHBlY3RhdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhoYXVzdGVkICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhdmFpbGFibGUgJiYgZXhoYXVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlLmFwcGx5KHRoaXNWYWx1ZSwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKGV4cGVjdGF0aW9ucywgZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIHB1c2gobWVzc2FnZXMsIFwiICAgIFwiICsgU3RyaW5nKGV4cGVjdGF0aW9uKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHVuc2hpZnQoXG4gICAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAgIFwiVW5leHBlY3RlZCBjYWxsOiBcIiArXG4gICAgICAgICAgICAgICAgcHJveHlDYWxsVG9TdHJpbmcuY2FsbCh7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5OiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIC8vIFBoYW50b21KUyBkb2VzIG5vdCBzZXJpYWxpemUgdGhlIHN0YWNrIHRyYWNlIHVudGlsIHRoZSBlcnJvciBoYXMgYmVlbiB0aHJvd25cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8qIGVtcHR5ICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHVzaChcbiAgICAgICAgICAgIHRoaXMuZmFpbHVyZXMsXG4gICAgICAgICAgICBcIlVuZXhwZWN0ZWQgY2FsbDogXCIgK1xuICAgICAgICAgICAgICAgIHByb3h5Q2FsbFRvU3RyaW5nLmNhbGwoe1xuICAgICAgICAgICAgICAgICAgICBwcm94eTogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChqb2luKG1lc3NhZ2VzLCBcIlxcblwiKSk7XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbW9jaztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgcHVzaCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXkucHVzaDtcblxuZXhwb3J0cy5pbmNyZW1lbnRDYWxsQ291bnQgPSBmdW5jdGlvbiBpbmNyZW1lbnRDYWxsQ291bnQocHJveHkpIHtcbiAgICBwcm94eS5jYWxsZWQgPSB0cnVlO1xuICAgIHByb3h5LmNhbGxDb3VudCArPSAxO1xuICAgIHByb3h5Lm5vdENhbGxlZCA9IGZhbHNlO1xuICAgIHByb3h5LmNhbGxlZE9uY2UgPSBwcm94eS5jYWxsQ291bnQgPT09IDE7XG4gICAgcHJveHkuY2FsbGVkVHdpY2UgPSBwcm94eS5jYWxsQ291bnQgPT09IDI7XG4gICAgcHJveHkuY2FsbGVkVGhyaWNlID0gcHJveHkuY2FsbENvdW50ID09PSAzO1xufTtcblxuZXhwb3J0cy5jcmVhdGVDYWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIGNyZWF0ZUNhbGxQcm9wZXJ0aWVzKHByb3h5KSB7XG4gICAgcHJveHkuZmlyc3RDYWxsID0gcHJveHkuZ2V0Q2FsbCgwKTtcbiAgICBwcm94eS5zZWNvbmRDYWxsID0gcHJveHkuZ2V0Q2FsbCgxKTtcbiAgICBwcm94eS50aGlyZENhbGwgPSBwcm94eS5nZXRDYWxsKDIpO1xuICAgIHByb3h5Lmxhc3RDYWxsID0gcHJveHkuZ2V0Q2FsbChwcm94eS5jYWxsQ291bnQgLSAxKTtcbn07XG5cbmV4cG9ydHMuZGVsZWdhdGVUb0NhbGxzID0gZnVuY3Rpb24gZGVsZWdhdGVUb0NhbGxzKFxuICAgIHByb3h5LFxuICAgIG1ldGhvZCxcbiAgICBtYXRjaEFueSxcbiAgICBhY3R1YWwsXG4gICAgcmV0dXJuc1ZhbHVlcyxcbiAgICBub3RDYWxsZWQsXG4gICAgdG90YWxDYWxsQ291bnRcbikge1xuICAgIHByb3h5W21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCkge1xuICAgICAgICAgICAgaWYgKG5vdENhbGxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3RDYWxsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b3RhbENhbGxDb3VudCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY2FsbENvdW50ICE9PSB0b3RhbENhbGxDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnJlbnRDYWxsO1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IDA7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuY2FsbENvdW50OyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjdXJyZW50Q2FsbCA9IHRoaXMuZ2V0Q2FsbChpKTtcbiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGN1cnJlbnRDYWxsW2FjdHVhbCB8fCBtZXRob2RdLmFwcGx5KGN1cnJlbnRDYWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcHVzaChyZXR1cm5WYWx1ZXMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaEFueSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0dXJuc1ZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcyA9PT0gdGhpcy5jYWxsQ291bnQ7XG4gICAgfTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIG1hdGNoID0gcmVxdWlyZShcIkBzaW5vbmpzL3NhbXNhbVwiKS5jcmVhdGVNYXRjaGVyO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCJAc2lub25qcy9zYW1zYW1cIikuZGVlcEVxdWFsO1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciBzaW5vbkZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBjb25jYXQgPSBhcnJheVByb3RvLmNvbmNhdDtcbnZhciBmaWx0ZXIgPSBhcnJheVByb3RvLmZpbHRlcjtcbnZhciBqb2luID0gYXJyYXlQcm90by5qb2luO1xudmFyIG1hcCA9IGFycmF5UHJvdG8ubWFwO1xudmFyIHJlZHVjZSA9IGFycmF5UHJvdG8ucmVkdWNlO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcblxuZnVuY3Rpb24gdGhyb3dZaWVsZEVycm9yKHByb3h5LCB0ZXh0LCBhcmdzKSB7XG4gICAgdmFyIG1zZyA9IGZ1bmN0aW9uTmFtZShwcm94eSkgKyB0ZXh0O1xuICAgIGlmIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBtc2cgKz0gXCIgUmVjZWl2ZWQgW1wiICsgam9pbihzbGljZShhcmdzKSwgXCIsIFwiKSArIFwiXVwiO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxudmFyIGNhbGxQcm90byA9IHtcbiAgICBjYWxsZWRPbjogZnVuY3Rpb24gY2FsbGVkT24odGhpc1ZhbHVlKSB7XG4gICAgICAgIGlmIChtYXRjaC5pc01hdGNoZXIodGhpc1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNWYWx1ZS50ZXN0KHRoaXMudGhpc1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50aGlzVmFsdWUgPT09IHRoaXNWYWx1ZTtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aDogZnVuY3Rpb24gY2FsbGVkV2l0aCgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY2FsbGVkV2l0aEFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoQXJncy5sZW5ndGggPiBzZWxmLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgICAgICAgY2FsbGVkV2l0aEFyZ3MsXG4gICAgICAgICAgICBmdW5jdGlvbihwcmV2LCBhcmcsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiAmJiBkZWVwRXF1YWwoc2VsZi5hcmdzW2ldLCBhcmcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aE1hdGNoOiBmdW5jdGlvbiBjYWxsZWRXaXRoTWF0Y2goKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGNhbGxlZFdpdGhNYXRjaEFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoTWF0Y2hBcmdzLmxlbmd0aCA+IHNlbGYuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWR1Y2UoXG4gICAgICAgICAgICBjYWxsZWRXaXRoTWF0Y2hBcmdzLFxuICAgICAgICAgICAgZnVuY3Rpb24ocHJldiwgZXhwZWN0YXRpb24sIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gc2VsZi5hcmdzW2ldO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgJiYgbWF0Y2goZXhwZWN0YXRpb24pLnRlc3QoYWN0dWFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGNhbGxlZFdpdGhFeGFjdGx5OiBmdW5jdGlvbiBjYWxsZWRXaXRoRXhhY3RseSgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IHRoaXMuYXJncy5sZW5ndGggJiYgdGhpcy5jYWxsZWRXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIG5vdENhbGxlZFdpdGg6IGZ1bmN0aW9uIG5vdENhbGxlZFdpdGgoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jYWxsZWRXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIG5vdENhbGxlZFdpdGhNYXRjaDogZnVuY3Rpb24gbm90Q2FsbGVkV2l0aE1hdGNoKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2FsbGVkV2l0aE1hdGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIHJldHVybmVkOiBmdW5jdGlvbiByZXR1cm5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKHRoaXMucmV0dXJuVmFsdWUsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgdGhyZXc6IGZ1bmN0aW9uIHRocmV3KGVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09IFwidW5kZWZpbmVkXCIgfHwgIXRoaXMuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmV4Y2VwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb24gPT09IGVycm9yIHx8IHRoaXMuZXhjZXB0aW9uLm5hbWUgPT09IGVycm9yO1xuICAgIH0sXG5cbiAgICBjYWxsZWRXaXRoTmV3OiBmdW5jdGlvbiBjYWxsZWRXaXRoTmV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5wcm90b3R5cGUgJiYgdGhpcy50aGlzVmFsdWUgaW5zdGFuY2VvZiB0aGlzLnByb3h5O1xuICAgIH0sXG5cbiAgICBjYWxsZWRCZWZvcmU6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA8IG90aGVyLmNhbGxJZDtcbiAgICB9LFxuXG4gICAgY2FsbGVkQWZ0ZXI6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA+IG90aGVyLmNhbGxJZDtcbiAgICB9LFxuXG4gICAgY2FsbGVkSW1tZWRpYXRlbHlCZWZvcmU6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA9PT0gb3RoZXIuY2FsbElkIC0gMTtcbiAgICB9LFxuXG4gICAgY2FsbGVkSW1tZWRpYXRlbHlBZnRlcjogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbElkID09PSBvdGhlci5jYWxsSWQgKyAxO1xuICAgIH0sXG5cbiAgICBjYWxsQXJnOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVBcmdJc0FGdW5jdGlvbihwb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzW3Bvc10oKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ09uOiBmdW5jdGlvbihwb3MsIHRoaXNWYWx1ZSkge1xuICAgICAgICB0aGlzLmVuc3VyZUFyZ0lzQUZ1bmN0aW9uKHBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3NbcG9zXS5hcHBseSh0aGlzVmFsdWUpO1xuICAgIH0sXG5cbiAgICBjYWxsQXJnV2l0aDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcmdPbldpdGguYXBwbHkodGhpcywgY29uY2F0KFtwb3MsIG51bGxdLCBzbGljZShhcmd1bWVudHMsIDEpKSk7XG4gICAgfSxcblxuICAgIGNhbGxBcmdPbldpdGg6IGZ1bmN0aW9uKHBvcywgdGhpc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlQXJnSXNBRnVuY3Rpb24ocG9zKTtcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzW3Bvc10uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICB9LFxuXG4gICAgdGhyb3dBcmc6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICBpZiAocG9zID4gdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIiArIHBvcyArIFwiIHJlcXVpcmVkIGJ1dCBvbmx5IFwiICsgdGhpcy5hcmdzLmxlbmd0aCArIFwiIHByZXNlbnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyB0aGlzLmFyZ3NbcG9zXTtcbiAgICB9LFxuXG4gICAgeWllbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZE9uLmFwcGx5KHRoaXMsIGNvbmNhdChbbnVsbF0sIHNsaWNlKGFyZ3VtZW50cywgMCkpKTtcbiAgICB9LFxuXG4gICAgeWllbGRPbjogZnVuY3Rpb24odGhpc1ZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UodGhpcy5hcmdzKTtcbiAgICAgICAgdmFyIHlpZWxkRm4gPSBmaWx0ZXIoYXJncywgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9KVswXTtcblxuICAgICAgICBpZiAoIXlpZWxkRm4pIHtcbiAgICAgICAgICAgIHRocm93WWllbGRFcnJvcih0aGlzLnByb3h5LCBcIiBjYW5ub3QgeWllbGQgc2luY2Ugbm8gY2FsbGJhY2sgd2FzIHBhc3NlZC5cIiwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geWllbGRGbi5hcHBseSh0aGlzVmFsdWUsIHNsaWNlKGFyZ3VtZW50cywgMSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZFRvOiBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkVG9Pbi5hcHBseSh0aGlzLCBjb25jYXQoW3Byb3AsIG51bGxdLCBzbGljZShhcmd1bWVudHMsIDEpKSk7XG4gICAgfSxcblxuICAgIHlpZWxkVG9PbjogZnVuY3Rpb24ocHJvcCwgdGhpc1ZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UodGhpcy5hcmdzKTtcbiAgICAgICAgdmFyIHlpZWxkQXJnID0gZmlsdGVyKGFyZ3MsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnW3Byb3BdID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICB2YXIgeWllbGRGbiA9IHlpZWxkQXJnICYmIHlpZWxkQXJnW3Byb3BdO1xuXG4gICAgICAgIGlmICgheWllbGRGbikge1xuICAgICAgICAgICAgdGhyb3dZaWVsZEVycm9yKFxuICAgICAgICAgICAgICAgIHRoaXMucHJveHksXG4gICAgICAgICAgICAgICAgXCIgY2Fubm90IHlpZWxkIHRvICdcIiArIHZhbHVlVG9TdHJpbmcocHJvcCkgKyBcIicgc2luY2Ugbm8gY2FsbGJhY2sgd2FzIHBhc3NlZC5cIixcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHlpZWxkRm4uYXBwbHkodGhpc1ZhbHVlLCBzbGljZShhcmd1bWVudHMsIDIpKTtcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2FsbFN0ciA9IHRoaXMucHJveHkgPyBTdHJpbmcodGhpcy5wcm94eSkgKyBcIihcIiA6IFwiXCI7XG4gICAgICAgIHZhciBmb3JtYXR0ZWRBcmdzO1xuXG4gICAgICAgIGlmICghdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI6KFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0dGVkQXJncyA9IG1hcCh0aGlzLmFyZ3MsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHNpbm9uRm9ybWF0KGFyZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxTdHIgPSBjYWxsU3RyICsgam9pbihmb3JtYXR0ZWRBcmdzLCBcIiwgXCIpICsgXCIpXCI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJldHVyblZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjYWxsU3RyICs9IFwiID0+IFwiICsgc2lub25Gb3JtYXQodGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIGNhbGxTdHIgKz0gXCIgIVwiICsgdGhpcy5leGNlcHRpb24ubmFtZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjYWxsU3RyICs9IFwiKFwiICsgdGhpcy5leGNlcHRpb24ubWVzc2FnZSArIFwiKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YWNrKSB7XG4gICAgICAgICAgICAvLyBPbWl0IHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgdHdvIHRvcCBzdGFjayBmcmFtZXMgaW4gc2lub24gaXRzZWxmOlxuICAgICAgICAgICAgY2FsbFN0ciArPSAodGhpcy5zdGFjay5zcGxpdChcIlxcblwiKVszXSB8fCBcInVua25vd25cIikucmVwbGFjZSgvXlxccyooPzphdFxccyt8QCk/LywgXCIgYXQgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxTdHI7XG4gICAgfSxcblxuICAgIGVuc3VyZUFyZ0lzQUZ1bmN0aW9uOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFyZ3NbcG9zXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgYXJndW1lbnQgYXQgcG9zaXRpb24gXCIgKyBwb3MgKyBcIiB0byBiZSBhIEZ1bmN0aW9uLCBidXQgd2FzIFwiICsgdHlwZW9mIHRoaXMuYXJnc1twb3NdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYWxsUHJvdG8sIFwic3RhY2tcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5lcnJvcldpdGhDYWxsU3RhY2sgJiYgdGhpcy5lcnJvcldpdGhDYWxsU3RhY2suc3RhY2spIHx8IFwiXCI7XG4gICAgfVxufSk7XG5cbmNhbGxQcm90by5pbnZva2VDYWxsYmFjayA9IGNhbGxQcm90by55aWVsZDtcblxuZnVuY3Rpb24gY3JlYXRlUHJveHlDYWxsKHByb3h5LCB0aGlzVmFsdWUsIGFyZ3MsIHJldHVyblZhbHVlLCBleGNlcHRpb24sIGlkLCBlcnJvcldpdGhDYWxsU3RhY2spIHtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYWxsIGlkIGlzIG5vdCBhIG51bWJlclwiKTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RBcmcsIGxhc3RBcmc7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpcnN0QXJnID0gYXJnc1swXTtcbiAgICAgICAgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICB2YXIgcHJveHlDYWxsID0gT2JqZWN0LmNyZWF0ZShjYWxsUHJvdG8pO1xuICAgIHZhciBjYWxsYmFjayA9IGxhc3RBcmcgJiYgdHlwZW9mIGxhc3RBcmcgPT09IFwiZnVuY3Rpb25cIiA/IGxhc3RBcmcgOiB1bmRlZmluZWQ7XG5cbiAgICBwcm94eUNhbGwucHJveHkgPSBwcm94eTtcbiAgICBwcm94eUNhbGwudGhpc1ZhbHVlID0gdGhpc1ZhbHVlO1xuICAgIHByb3h5Q2FsbC5hcmdzID0gYXJncztcbiAgICBwcm94eUNhbGwuZmlyc3RBcmcgPSBmaXJzdEFyZztcbiAgICBwcm94eUNhbGwubGFzdEFyZyA9IGxhc3RBcmc7XG4gICAgcHJveHlDYWxsLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgcHJveHlDYWxsLnJldHVyblZhbHVlID0gcmV0dXJuVmFsdWU7XG4gICAgcHJveHlDYWxsLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICBwcm94eUNhbGwuY2FsbElkID0gaWQ7XG4gICAgcHJveHlDYWxsLmVycm9yV2l0aENhbGxTdGFjayA9IGVycm9yV2l0aENhbGxTdGFjaztcblxuICAgIHJldHVybiBwcm94eUNhbGw7XG59XG5jcmVhdGVQcm94eUNhbGwudG9TdHJpbmcgPSBjYWxsUHJvdG8udG9TdHJpbmc7IC8vIHVzZWQgYnkgbW9ja3NcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVQcm94eUNhbGw7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIHByb3h5Q2FsbFV0aWwgPSByZXF1aXJlKFwiLi9wcm94eS1jYWxsLXV0aWxcIik7XG5cbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgY29uY2F0ID0gYXJyYXlQcm90by5jb25jYXQ7XG52YXIgRXJyb3JDb25zdHJ1Y3RvciA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7XG5cbnZhciBjYWxsSWQgPSAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGludm9rZShmdW5jLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICB2YXIgbWF0Y2hpbmdzID0gdGhpcy5tYXRjaGluZ0Zha2VzKGFyZ3MpO1xuICAgIHZhciBjdXJyZW50Q2FsbElkID0gY2FsbElkKys7XG4gICAgdmFyIGV4Y2VwdGlvbiwgcmV0dXJuVmFsdWU7XG5cbiAgICBwcm94eUNhbGxVdGlsLmluY3JlbWVudENhbGxDb3VudCh0aGlzKTtcbiAgICBwdXNoKHRoaXMudGhpc1ZhbHVlcywgdGhpc1ZhbHVlKTtcbiAgICBwdXNoKHRoaXMuYXJncywgYXJncyk7XG4gICAgcHVzaCh0aGlzLmNhbGxJZHMsIGN1cnJlbnRDYWxsSWQpO1xuICAgIGZvckVhY2gobWF0Y2hpbmdzLCBmdW5jdGlvbihtYXRjaGluZykge1xuICAgICAgICBwcm94eUNhbGxVdGlsLmluY3JlbWVudENhbGxDb3VudChtYXRjaGluZyk7XG4gICAgICAgIHB1c2gobWF0Y2hpbmcudGhpc1ZhbHVlcywgdGhpc1ZhbHVlKTtcbiAgICAgICAgcHVzaChtYXRjaGluZy5hcmdzLCBhcmdzKTtcbiAgICAgICAgcHVzaChtYXRjaGluZy5jYWxsSWRzLCBjdXJyZW50Q2FsbElkKTtcbiAgICB9KTtcblxuICAgIC8vIE1ha2UgY2FsbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBmcm9tIHdpdGhpbiB0aGUgc3BpZWQgZnVuY3Rpb246XG4gICAgcHJveHlDYWxsVXRpbC5jcmVhdGVDYWxsUHJvcGVydGllcyh0aGlzKTtcbiAgICBmb3JFYWNoKG1hdGNoaW5ncywgcHJveHlDYWxsVXRpbC5jcmVhdGVDYWxsUHJvcGVydGllcyk7XG5cbiAgICB0cnkge1xuICAgICAgICB0aGlzLmludm9raW5nID0gdHJ1ZTtcblxuICAgICAgICB2YXIgdGhpc0NhbGwgPSB0aGlzLmdldENhbGwodGhpcy5jYWxsQ291bnQgLSAxKTtcblxuICAgICAgICBpZiAodGhpc0NhbGwuY2FsbGVkV2l0aE5ldygpKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRocm91Z2ggd2l0aCBgbmV3YFxuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBuZXcgKGJpbmQuYXBwbHkodGhpcy5mdW5jIHx8IGZ1bmMsIGNvbmNhdChbdGhpc1ZhbHVlXSwgYXJncykpKSgpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9ICh0aGlzLmZ1bmMgfHwgZnVuYykuYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXhjZXB0aW9uID0gZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgdGhpcy5pbnZva2luZztcbiAgICB9XG5cbiAgICBwdXNoKHRoaXMuZXhjZXB0aW9ucywgZXhjZXB0aW9uKTtcbiAgICBwdXNoKHRoaXMucmV0dXJuVmFsdWVzLCByZXR1cm5WYWx1ZSk7XG4gICAgZm9yRWFjaChtYXRjaGluZ3MsIGZ1bmN0aW9uKG1hdGNoaW5nKSB7XG4gICAgICAgIHB1c2gobWF0Y2hpbmcuZXhjZXB0aW9ucywgZXhjZXB0aW9uKTtcbiAgICAgICAgcHVzaChtYXRjaGluZy5yZXR1cm5WYWx1ZXMsIHJldHVyblZhbHVlKTtcbiAgICB9KTtcblxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3JDb25zdHJ1Y3RvcigpO1xuICAgIC8vIDEuIFBsZWFzZSBkbyBub3QgZ2V0IHN0YWNrIGF0IHRoaXMgcG9pbnQuIEl0IG1heSBiZSBzbyB2ZXJ5IHNsb3csIGFuZCBub3QgYWN0dWFsbHkgdXNlZFxuICAgIC8vIDIuIFBoYW50b21KUyBkb2VzIG5vdCBzZXJpYWxpemUgdGhlIHN0YWNrIHRyYWNlIHVudGlsIHRoZSBlcnJvciBoYXMgYmVlbiB0aHJvd246XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IvU3RhY2tcbiAgICB0cnkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgIH1cbiAgICBwdXNoKHRoaXMuZXJyb3JzV2l0aENhbGxTdGFjaywgZXJyKTtcbiAgICBmb3JFYWNoKG1hdGNoaW5ncywgZnVuY3Rpb24obWF0Y2hpbmcpIHtcbiAgICAgICAgcHVzaChtYXRjaGluZy5lcnJvcnNXaXRoQ2FsbFN0YWNrLCBlcnIpO1xuICAgIH0pO1xuXG4gICAgLy8gTWFrZSByZXR1cm4gdmFsdWUgYW5kIGV4Y2VwdGlvbiBhdmFpbGFibGUgaW4gdGhlIGNhbGxzOlxuICAgIHByb3h5Q2FsbFV0aWwuY3JlYXRlQ2FsbFByb3BlcnRpZXModGhpcyk7XG4gICAgZm9yRWFjaChtYXRjaGluZ3MsIHByb3h5Q2FsbFV0aWwuY3JlYXRlQ2FsbFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGV4Y2VwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZnVuY3Rpb24tdG8tc3RyaW5nXCIpO1xudmFyIHByb3h5Q2FsbCA9IHJlcXVpcmUoXCIuL3Byb3h5LWNhbGxcIik7XG52YXIgcHJveHlDYWxsVXRpbCA9IHJlcXVpcmUoXCIuL3Byb3h5LWNhbGwtdXRpbFwiKTtcbnZhciBwcm94eUludm9rZSA9IHJlcXVpcmUoXCIuL3Byb3h5LWludm9rZVwiKTtcbnZhciBzaW5vbkZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG5cbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgc2xpY2UgPSBhcnJheVByb3RvLnNsaWNlO1xuXG52YXIgZW1wdHlGYWtlcyA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4vLyBQdWJsaWMgQVBJXG52YXIgcHJveHlBcGkgPSB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uVG9TdHJpbmcsXG5cbiAgICBuYW1lZDogZnVuY3Rpb24gbmFtZWQobmFtZSkge1xuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgdmFyIG5hbWVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBcIm5hbWVcIik7XG4gICAgICAgIGlmIChuYW1lRGVzY3JpcHRvciAmJiBuYW1lRGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgIC8vIElFIDExIGZ1bmN0aW9ucyBkb24ndCBoYXZlIGEgbmFtZS5cbiAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBuYW1lcyB0aGF0IGFyZSBub3QgY29uZmlndXJhYmxlLlxuICAgICAgICAgICAgbmFtZURlc2NyaXB0b3IudmFsdWUgPSBuYW1lO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCBuYW1lRGVzY3JpcHRvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGludm9rZTogcHJveHlJbnZva2UsXG5cbiAgICAvKlxuICAgICAqIEhvb2sgZm9yIGRlcml2ZWQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGZha2UgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZVxuICAgICAqIGdpdmVuIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBtYXRjaGluZ0Zha2VzOiBmdW5jdGlvbigvKmFyZ3MsIHN0cmljdCovKSB7XG4gICAgICAgIHJldHVybiBlbXB0eUZha2VzO1xuICAgIH0sXG5cbiAgICBnZXRDYWxsOiBmdW5jdGlvbiBnZXRDYWxsKGluZGV4KSB7XG4gICAgICAgIHZhciBpID0gaW5kZXg7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgLy8gTmVnYXRpdmUgaW5kaWNlcyBtZWFucyBjb3VudGluZyBiYWNrd2FyZHMgZnJvbSB0aGUgbGFzdCBjYWxsXG4gICAgICAgICAgICBpICs9IHRoaXMuY2FsbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuY2FsbENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm94eUNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy50aGlzVmFsdWVzW2ldLFxuICAgICAgICAgICAgdGhpcy5hcmdzW2ldLFxuICAgICAgICAgICAgdGhpcy5yZXR1cm5WYWx1ZXNbaV0sXG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbnNbaV0sXG4gICAgICAgICAgICB0aGlzLmNhbGxJZHNbaV0sXG4gICAgICAgICAgICB0aGlzLmVycm9yc1dpdGhDYWxsU3RhY2tbaV1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0Q2FsbHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2FsbHMgPSBbXTtcbiAgICAgICAgdmFyIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY2FsbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHB1c2goY2FsbHMsIHRoaXMuZ2V0Q2FsbChpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsbHM7XG4gICAgfSxcblxuICAgIGNhbGxlZEJlZm9yZTogZnVuY3Rpb24gY2FsbGVkQmVmb3JlKHByb3h5KSB7XG4gICAgICAgIGlmICghdGhpcy5jYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJveHkuY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZHNbMF0gPCBwcm94eS5jYWxsSWRzW3Byb3h5LmNhbGxJZHMubGVuZ3RoIC0gMV07XG4gICAgfSxcblxuICAgIGNhbGxlZEFmdGVyOiBmdW5jdGlvbiBjYWxsZWRBZnRlcihwcm94eSkge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbGVkIHx8ICFwcm94eS5jYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZHNbdGhpcy5jYWxsQ291bnQgLSAxXSA+IHByb3h5LmNhbGxJZHNbMF07XG4gICAgfSxcblxuICAgIGNhbGxlZEltbWVkaWF0ZWx5QmVmb3JlOiBmdW5jdGlvbiBjYWxsZWRJbW1lZGlhdGVseUJlZm9yZShwcm94eSkge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbGVkIHx8ICFwcm94eS5jYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZHNbdGhpcy5jYWxsQ291bnQgLSAxXSA9PT0gcHJveHkuY2FsbElkc1twcm94eS5jYWxsQ291bnQgLSAxXSAtIDE7XG4gICAgfSxcblxuICAgIGNhbGxlZEltbWVkaWF0ZWx5QWZ0ZXI6IGZ1bmN0aW9uIGNhbGxlZEltbWVkaWF0ZWx5QWZ0ZXIocHJveHkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCB8fCAhcHJveHkuY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzW3RoaXMuY2FsbENvdW50IC0gMV0gPT09IHByb3h5LmNhbGxJZHNbcHJveHkuY2FsbENvdW50IC0gMV0gKyAxO1xuICAgIH0sXG5cbiAgICBmb3JtYXR0ZXJzOiByZXF1aXJlKFwiLi9zcHktZm9ybWF0dGVyc1wiKSxcbiAgICBwcmludGY6IGZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgc3B5SW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciBmb3JtYXR0ZXI7XG5cbiAgICAgICAgcmV0dXJuIChmb3JtYXQgfHwgXCJcIikucmVwbGFjZSgvJSguKS9nLCBmdW5jdGlvbihtYXRjaCwgc3BlY2lmeWVyKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBwcm94eUFwaS5mb3JtYXR0ZXJzW3NwZWNpZnllcl07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGZvcm1hdHRlcihzcHlJbnN0YW5jZSwgYXJncykpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4ocGFyc2VJbnQoc3BlY2lmeWVyLCAxMCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbm9uRm9ybWF0KGFyZ3Nbc3BlY2lmeWVyIC0gMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gXCIlXCIgKyBzcGVjaWZ5ZXI7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICByZXNldEhpc3Rvcnk6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pbnZva2luZykge1xuICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNhbm5vdCByZXNldCBTaW5vbiBmdW5jdGlvbiB3aGlsZSBpbnZva2luZyBpdC4gXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIk1vdmUgdGhlIGNhbGwgdG8gLnJlc2V0SGlzdG9yeSBvdXRzaWRlIG9mIHRoZSBjYWxsYmFjay5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gXCJJbnZhbGlkUmVzZXRFeGNlcHRpb25cIjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYWxsZWRPbmNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbGVkVHdpY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsZWRUaHJpY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmZpcnN0Q2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2Vjb25kQ2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMudGhpcmRDYWxsID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0Q2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMuYXJncyA9IFtdO1xuICAgICAgICB0aGlzLmZpcnN0QXJnID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0QXJnID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXR1cm5WYWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy50aGlzVmFsdWVzID0gW107XG4gICAgICAgIHRoaXMuZXhjZXB0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNhbGxJZHMgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvcnNXaXRoQ2FsbFN0YWNrID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuZmFrZXMpIHtcbiAgICAgICAgICAgIGZvckVhY2godGhpcy5mYWtlcywgZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICAgICAgICAgIGZha2UucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbnZhciBkZWxlZ2F0ZVRvQ2FsbHMgPSBwcm94eUNhbGxVdGlsLmRlbGVnYXRlVG9DYWxscztcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJjYWxsZWRPblwiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJhbHdheXNDYWxsZWRPblwiLCBmYWxzZSwgXCJjYWxsZWRPblwiKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJjYWxsZWRXaXRoXCIsIHRydWUpO1xuZGVsZWdhdGVUb0NhbGxzKHByb3h5QXBpLCBcImNhbGxlZE9uY2VXaXRoXCIsIHRydWUsIFwiY2FsbGVkV2l0aFwiLCBmYWxzZSwgdW5kZWZpbmVkLCAxKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJjYWxsZWRXaXRoTWF0Y2hcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiYWx3YXlzQ2FsbGVkV2l0aFwiLCBmYWxzZSwgXCJjYWxsZWRXaXRoXCIpO1xuZGVsZWdhdGVUb0NhbGxzKHByb3h5QXBpLCBcImFsd2F5c0NhbGxlZFdpdGhNYXRjaFwiLCBmYWxzZSwgXCJjYWxsZWRXaXRoTWF0Y2hcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkV2l0aEV4YWN0bHlcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkT25jZVdpdGhFeGFjdGx5XCIsIHRydWUsIFwiY2FsbGVkV2l0aEV4YWN0bHlcIiwgZmFsc2UsIHVuZGVmaW5lZCwgMSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkT25jZVdpdGhNYXRjaFwiLCB0cnVlLCBcImNhbGxlZFdpdGhNYXRjaFwiLCBmYWxzZSwgdW5kZWZpbmVkLCAxKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJhbHdheXNDYWxsZWRXaXRoRXhhY3RseVwiLCBmYWxzZSwgXCJjYWxsZWRXaXRoRXhhY3RseVwiKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJuZXZlckNhbGxlZFdpdGhcIiwgZmFsc2UsIFwibm90Q2FsbGVkV2l0aFwiLCBmYWxzZSwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRydWU7XG59KTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJuZXZlckNhbGxlZFdpdGhNYXRjaFwiLCBmYWxzZSwgXCJub3RDYWxsZWRXaXRoTWF0Y2hcIiwgZmFsc2UsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwidGhyZXdcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiYWx3YXlzVGhyZXdcIiwgZmFsc2UsIFwidGhyZXdcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwicmV0dXJuZWRcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiYWx3YXlzUmV0dXJuZWRcIiwgZmFsc2UsIFwicmV0dXJuZWRcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMocHJveHlBcGksIFwiY2FsbGVkV2l0aE5ld1wiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhwcm94eUFwaSwgXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsIGZhbHNlLCBcImNhbGxlZFdpdGhOZXdcIik7XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3h5KGZ1bmMsIG9yaWdpbmFsRnVuYykge1xuICAgIHZhciBwcm94eSA9IHdyYXBGdW5jdGlvbihmdW5jLCBvcmlnaW5hbEZ1bmMpO1xuXG4gICAgLy8gSW5oZXJpdCBmdW5jdGlvbiBwcm9wZXJ0aWVzOlxuICAgIGV4dGVuZChwcm94eSwgZnVuYyk7XG5cbiAgICBwcm94eS5wcm90b3R5cGUgPSBmdW5jLnByb3RvdHlwZTtcblxuICAgIGV4dGVuZC5ub25FbnVtKHByb3h5LCBwcm94eUFwaSk7XG5cbiAgICByZXR1cm4gcHJveHk7XG59XG5cbmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jLCBvcmlnaW5hbEZ1bmMpIHtcbiAgICB2YXIgYXJpdHkgPSBvcmlnaW5hbEZ1bmMubGVuZ3RoO1xuICAgIHZhciBwO1xuICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyB0byB1c2UgYW4gZXZhbC4gUHJvamVjdHMgdGhhdCBkZXBlbmQgb24gc2lub24gYmxvY2sgdGhlIHVzZSBvZiBldmFsLlxuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Npbm9uanMvc2lub24vaXNzdWVzLzcxMFxuICAgIHN3aXRjaCAoYXJpdHkpIHtcbiAgICAgICAgLyplc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycywgbWF4LWxlbiovXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvKmVzbGludC1lbmFibGUqL1xuICAgIH1cbiAgICB2YXIgbmFtZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9yaWdpbmFsRnVuYywgXCJuYW1lXCIpO1xuICAgIGlmIChuYW1lRGVzY3JpcHRvciAmJiBuYW1lRGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgLy8gSUUgMTEgZnVuY3Rpb25zIGRvbid0IGhhdmUgYSBuYW1lLlxuICAgICAgICAvLyBTYWZhcmkgOSBoYXMgbmFtZXMgdGhhdCBhcmUgbm90IGNvbmZpZ3VyYWJsZS5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHAsIFwibmFtZVwiLCBuYW1lRGVzY3JpcHRvcik7XG4gICAgfVxuICAgIGV4dGVuZC5ub25FbnVtKHAsIHtcbiAgICAgICAgaXNTaW5vblByb3h5OiB0cnVlLFxuXG4gICAgICAgIGNhbGxlZDogZmFsc2UsXG4gICAgICAgIG5vdENhbGxlZDogdHJ1ZSxcbiAgICAgICAgY2FsbGVkT25jZTogZmFsc2UsXG4gICAgICAgIGNhbGxlZFR3aWNlOiBmYWxzZSxcbiAgICAgICAgY2FsbGVkVGhyaWNlOiBmYWxzZSxcbiAgICAgICAgY2FsbENvdW50OiAwLFxuICAgICAgICBmaXJzdENhbGw6IG51bGwsXG4gICAgICAgIGZpcnN0QXJnOiBudWxsLFxuICAgICAgICBzZWNvbmRDYWxsOiBudWxsLFxuICAgICAgICB0aGlyZENhbGw6IG51bGwsXG4gICAgICAgIGxhc3RDYWxsOiBudWxsLFxuICAgICAgICBsYXN0QXJnOiBudWxsLFxuICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgcmV0dXJuVmFsdWVzOiBbXSxcbiAgICAgICAgdGhpc1ZhbHVlczogW10sXG4gICAgICAgIGV4Y2VwdGlvbnM6IFtdLFxuICAgICAgICBjYWxsSWRzOiBbXSxcbiAgICAgICAgZXJyb3JzV2l0aENhbGxTdGFjazogW11cbiAgICB9KTtcbiAgICByZXR1cm4gcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVQcm94eTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgd2Fsa09iamVjdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS93YWxrLW9iamVjdFwiKTtcblxuZnVuY3Rpb24gZmlsdGVyKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5XS5yZXN0b3JlICYmIG9iamVjdFtwcm9wZXJ0eV0ucmVzdG9yZS5zaW5vbjtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZShvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgb2JqZWN0W3Byb3BlcnR5XS5yZXN0b3JlKCk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVPYmplY3Qob2JqZWN0KSB7XG4gICAgcmV0dXJuIHdhbGtPYmplY3QocmVzdG9yZSwgb2JqZWN0LCBmaWx0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc3RvcmVPYmplY3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNvbGxlY3RPd25NZXRob2RzID0gcmVxdWlyZShcIi4vY29sbGVjdC1vd24tbWV0aG9kc1wiKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZSA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9pcy1wcm9wZXJ0eS1jb25maWd1cmFibGVcIik7XG52YXIgbWF0Y2ggPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXI7XG52YXIgc2lub25Bc3NlcnQgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG52YXIgc2lub25DbG9jayA9IHJlcXVpcmUoXCIuL3V0aWwvZmFrZS10aW1lcnNcIik7XG52YXIgc2lub25Nb2NrID0gcmVxdWlyZShcIi4vbW9ja1wiKTtcbnZhciBzaW5vblNweSA9IHJlcXVpcmUoXCIuL3NweVwiKTtcbnZhciBzaW5vblN0dWIgPSByZXF1aXJlKFwiLi9zdHViXCIpO1xudmFyIHNpbm9uRmFrZSA9IHJlcXVpcmUoXCIuL2Zha2VcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG52YXIgZmFrZVNlcnZlciA9IHJlcXVpcmUoXCJuaXNlXCIpLmZha2VTZXJ2ZXI7XG52YXIgZmFrZVhociA9IHJlcXVpcmUoXCJuaXNlXCIpLmZha2VYaHI7XG52YXIgdXNlUHJvbWlzZUxpYnJhcnkgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdXNlLXByb21pc2UtbGlicmFyeVwiKTtcblxudmFyIGZpbHRlciA9IGFycmF5UHJvdG8uZmlsdGVyO1xudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcbnZhciByZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG5mdW5jdGlvbiBhcHBseU9uRWFjaChmYWtlcywgbWV0aG9kKSB7XG4gICAgdmFyIG1hdGNoaW5nRmFrZXMgPSBmaWx0ZXIoZmFrZXMsIGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBmYWtlW21ldGhvZF0gPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9KTtcblxuICAgIGZvckVhY2gobWF0Y2hpbmdGYWtlcywgZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICBmYWtlW21ldGhvZF0oKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gU2FuZGJveCgpIHtcbiAgICB2YXIgc2FuZGJveCA9IHRoaXM7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSBbXTtcbiAgICB2YXIgZmFrZVJlc3RvcmVycyA9IFtdO1xuICAgIHZhciBwcm9taXNlTGliO1xuXG4gICAgc2FuZGJveC5hc3NlcnQgPSBzaW5vbkFzc2VydC5jcmVhdGVBc3NlcnRPYmplY3QoKTtcblxuICAgIHNhbmRib3guc2VydmVyUHJvdG90eXBlID0gZmFrZVNlcnZlcjtcblxuICAgIC8vIHRoaXMgaXMgZm9yIHRlc3Rpbmcgb25seVxuICAgIHNhbmRib3guZ2V0RmFrZXMgPSBmdW5jdGlvbiBnZXRGYWtlcygpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfTtcblxuICAgIC8vIHRoaXMgaXMgZm9yIHRlc3Rpbmcgb25seVxuICAgIHNhbmRib3guZ2V0UmVzdG9yZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWtlUmVzdG9yZXJzO1xuICAgIH07XG5cbiAgICBzYW5kYm94LmNyZWF0ZVN0dWJJbnN0YW5jZSA9IGZ1bmN0aW9uIGNyZWF0ZVN0dWJJbnN0YW5jZSgpIHtcbiAgICAgICAgdmFyIHN0dWJiZWQgPSBzaW5vblN0dWIuY3JlYXRlU3R1Ykluc3RhbmNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgdmFyIG93bk1ldGhvZHMgPSBjb2xsZWN0T3duTWV0aG9kcyhzdHViYmVkKTtcblxuICAgICAgICBmb3JFYWNoKG93bk1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgcHVzaChjb2xsZWN0aW9uLCBtZXRob2QpO1xuICAgICAgICB9KTtcblxuICAgICAgICB1c2VQcm9taXNlTGlicmFyeShwcm9taXNlTGliLCBvd25NZXRob2RzKTtcblxuICAgICAgICByZXR1cm4gc3R1YmJlZDtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5pbmplY3QgPSBmdW5jdGlvbiBpbmplY3Qob2JqKSB7XG4gICAgICAgIG9iai5zcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LnNweS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5zdHViID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5zdHViLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLm1vY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94Lm1vY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmouY3JlYXRlU3R1Ykluc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5jcmVhdGVTdHViSW5zdGFuY2UuYXBwbHkoc2FuZGJveCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmouZmFrZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3guZmFrZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5yZXBsYWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5yZXBsYWNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLnJlcGxhY2VTZXR0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LnJlcGxhY2VTZXR0ZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmoucmVwbGFjZUdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3gucmVwbGFjZUdldHRlci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzYW5kYm94LmNsb2NrKSB7XG4gICAgICAgICAgICBvYmouY2xvY2sgPSBzYW5kYm94LmNsb2NrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNhbmRib3guc2VydmVyKSB7XG4gICAgICAgICAgICBvYmouc2VydmVyID0gc2FuZGJveC5zZXJ2ZXI7XG4gICAgICAgICAgICBvYmoucmVxdWVzdHMgPSBzYW5kYm94LnNlcnZlci5yZXF1ZXN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIG9iai5tYXRjaCA9IG1hdGNoO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIHNhbmRib3gubW9jayA9IGZ1bmN0aW9uIG1vY2soKSB7XG4gICAgICAgIHZhciBtID0gc2lub25Nb2NrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgcHVzaChjb2xsZWN0aW9uLCBtKTtcbiAgICAgICAgdXNlUHJvbWlzZUxpYnJhcnkocHJvbWlzZUxpYiwgbSk7XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgYXBwbHlPbkVhY2goY29sbGVjdGlvbiwgXCJyZXNldFwiKTtcbiAgICAgICAgYXBwbHlPbkVhY2goY29sbGVjdGlvbiwgXCJyZXNldEhpc3RvcnlcIik7XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVzZXRCZWhhdmlvciA9IGZ1bmN0aW9uIHJlc2V0QmVoYXZpb3IoKSB7XG4gICAgICAgIGFwcGx5T25FYWNoKGNvbGxlY3Rpb24sIFwicmVzZXRCZWhhdmlvclwiKTtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5yZXNldEhpc3RvcnkgPSBmdW5jdGlvbiByZXNldEhpc3RvcnkoKSB7XG4gICAgICAgIGZ1bmN0aW9uIHByaXZhdGVSZXNldEhpc3RvcnkoZikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IGYucmVzZXRIaXN0b3J5IHx8IGYucmVzZXQ7XG4gICAgICAgICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwoZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmFrZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcHJpdmF0ZVJlc2V0SGlzdG9yeShmYWtlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtZXRob2RzID0gW107XG4gICAgICAgICAgICBpZiAoZmFrZS5nZXQpIHtcbiAgICAgICAgICAgICAgICBwdXNoKG1ldGhvZHMsIGZha2UuZ2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZha2Uuc2V0KSB7XG4gICAgICAgICAgICAgICAgcHVzaChtZXRob2RzLCBmYWtlLnNldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvckVhY2gobWV0aG9kcywgcHJpdmF0ZVJlc2V0SGlzdG9yeSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2FuZGJveC5yZXN0b3JlKCkgZG9lcyBub3QgdGFrZSBhbnkgcGFyYW1ldGVycy4gUGVyaGFwcyB5b3UgbWVhbnQgc3R1Yi5yZXN0b3JlKClcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXZlcnNlKGNvbGxlY3Rpb24pO1xuICAgICAgICBhcHBseU9uRWFjaChjb2xsZWN0aW9uLCBcInJlc3RvcmVcIik7XG4gICAgICAgIGNvbGxlY3Rpb24gPSBbXTtcblxuICAgICAgICBmb3JFYWNoKGZha2VSZXN0b3JlcnMsIGZ1bmN0aW9uKHJlc3RvcmVyKSB7XG4gICAgICAgICAgICByZXN0b3JlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZmFrZVJlc3RvcmVycyA9IFtdO1xuXG4gICAgICAgIHNhbmRib3gucmVzdG9yZUNvbnRleHQoKTtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5yZXN0b3JlQ29udGV4dCA9IGZ1bmN0aW9uIHJlc3RvcmVDb250ZXh0KCkge1xuICAgICAgICB2YXIgaW5qZWN0ZWRLZXlzID0gc2FuZGJveC5pbmplY3RlZEtleXM7XG4gICAgICAgIHZhciBpbmplY3RJbnRvID0gc2FuZGJveC5pbmplY3RJbnRvO1xuXG4gICAgICAgIGlmICghaW5qZWN0ZWRLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKGluamVjdGVkS2V5cywgZnVuY3Rpb24oaW5qZWN0ZWRLZXkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBpbmplY3RJbnRvW2luamVjdGVkS2V5XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5qZWN0ZWRLZXlzID0gW107XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldEZha2VSZXN0b3JlcihvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlc3RvcmVyKCkge1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNPd24pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3RvcmVyLm9iamVjdCA9IG9iamVjdDtcbiAgICAgICAgcmVzdG9yZXIucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHJlc3RvcmVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZlcmlmeU5vdFJlcGxhY2VkKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICAgICAgZm9yRWFjaChmYWtlUmVzdG9yZXJzLCBmdW5jdGlvbihmYWtlUmVzdG9yZXIpIHtcbiAgICAgICAgICAgIGlmIChmYWtlUmVzdG9yZXIub2JqZWN0ID09PSBvYmplY3QgJiYgZmFrZVJlc3RvcmVyLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBdHRlbXB0ZWQgdG8gcmVwbGFjZSBcIiArIHByb3BlcnR5ICsgXCIgd2hpY2ggaXMgYWxyZWFkeSByZXBsYWNlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2FuZGJveC5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShvYmplY3QsIHByb3BlcnR5LCByZXBsYWNlbWVudCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVwbGFjZSBub24tZXhpc3RlbnQgcHJvcGVydHkgXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgcmVwbGFjZW1lbnQgYXJndW1lbnQgdG8gYmUgZGVmaW5lZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIHNhbmRib3gucmVwbGFjZUdldHRlciBmb3IgcmVwbGFjaW5nIGdldHRlcnNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3Iuc2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBzYW5kYm94LnJlcGxhY2VTZXR0ZXIgZm9yIHJlcGxhY2luZyBzZXR0ZXJzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcGVydHldICE9PSB0eXBlb2YgcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVwbGFjZSBcIiArIHR5cGVvZiBvYmplY3RbcHJvcGVydHldICsgXCIgd2l0aCBcIiArIHR5cGVvZiByZXBsYWNlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJpZnlOb3RSZXBsYWNlZChvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICAvLyBzdG9yZSBhIGZ1bmN0aW9uIGZvciByZXN0b3JpbmcgdGhlIHJlcGxhY2VkIHByb3BlcnR5XG4gICAgICAgIHB1c2goZmFrZVJlc3RvcmVycywgZ2V0RmFrZVJlc3RvcmVyKG9iamVjdCwgcHJvcGVydHkpKTtcblxuICAgICAgICBvYmplY3RbcHJvcGVydHldID0gcmVwbGFjZW1lbnQ7XG5cbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlcGxhY2VHZXR0ZXIgPSBmdW5jdGlvbiByZXBsYWNlR2V0dGVyKG9iamVjdCwgcHJvcGVydHksIHJlcGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZXBsYWNlIG5vbi1leGlzdGVudCBwcm9wZXJ0eSBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIHJlcGxhY2VtZW50IGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBvYmplY3QucHJvcGVydHlgIGlzIG5vdCBhIGdldHRlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcmlmeU5vdFJlcGxhY2VkKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIC8vIHN0b3JlIGEgZnVuY3Rpb24gZm9yIHJlc3RvcmluZyB0aGUgcmVwbGFjZWQgcHJvcGVydHlcbiAgICAgICAgcHVzaChmYWtlUmVzdG9yZXJzLCBnZXRGYWtlUmVzdG9yZXIob2JqZWN0LCBwcm9wZXJ0eSkpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG4gICAgICAgICAgICBnZXQ6IHJlcGxhY2VtZW50LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5yZXBsYWNlU2V0dGVyID0gZnVuY3Rpb24gcmVwbGFjZVNldHRlcihvYmplY3QsIHByb3BlcnR5LCByZXBsYWNlbWVudCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVwbGFjZSBub24tZXhpc3RlbnQgcHJvcGVydHkgXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VtZW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCByZXBsYWNlbWVudCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgb2JqZWN0LnByb3BlcnR5YCBpcyBub3QgYSBzZXR0ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJpZnlOb3RSZXBsYWNlZChvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICAvLyBzdG9yZSBhIGZ1bmN0aW9uIGZvciByZXN0b3JpbmcgdGhlIHJlcGxhY2VkIHByb3BlcnR5XG4gICAgICAgIHB1c2goZmFrZVJlc3RvcmVycywgZ2V0RmFrZVJlc3RvcmVyKG9iamVjdCwgcHJvcGVydHkpKTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYWNjZXNzb3ItcGFpcnNcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcbiAgICAgICAgICAgIHNldDogcmVwbGFjZW1lbnQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGlzUHJvcGVydHlDb25maWd1cmFibGUob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjb21tb25Qb3N0SW5pdFNldHVwKGFyZ3MsIHNweSkge1xuICAgICAgICB2YXIgb2JqZWN0ID0gYXJnc1swXTtcbiAgICAgICAgdmFyIHByb3BlcnR5ID0gYXJnc1sxXTtcblxuICAgICAgICB2YXIgaXNTcHlpbmdPbkVudGlyZU9iamVjdCA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiO1xuXG4gICAgICAgIGlmIChpc1NweWluZ09uRW50aXJlT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgb3duTWV0aG9kcyA9IGNvbGxlY3RPd25NZXRob2RzKHNweSk7XG5cbiAgICAgICAgICAgIGZvckVhY2gob3duTWV0aG9kcywgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgcHVzaChjb2xsZWN0aW9uLCBtZXRob2QpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHVzZVByb21pc2VMaWJyYXJ5KHByb21pc2VMaWIsIG93bk1ldGhvZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHVzaChjb2xsZWN0aW9uLCBzcHkpO1xuICAgICAgICAgICAgdXNlUHJvbWlzZUxpYnJhcnkocHJvbWlzZUxpYiwgc3B5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcHk7XG4gICAgfVxuXG4gICAgc2FuZGJveC5zcHkgPSBmdW5jdGlvbiBzcHkoKSB7XG4gICAgICAgIHZhciBjcmVhdGVkU3B5ID0gc2lub25TcHkuYXBwbHkoc2lub25TcHksIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBjb21tb25Qb3N0SW5pdFNldHVwKGFyZ3VtZW50cywgY3JlYXRlZFNweSk7XG4gICAgfTtcblxuICAgIHNhbmRib3guc3R1YiA9IGZ1bmN0aW9uIHN0dWIoKSB7XG4gICAgICAgIHZhciBjcmVhdGVkU3R1YiA9IHNpbm9uU3R1Yi5hcHBseShzaW5vblN0dWIsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBjb21tb25Qb3N0SW5pdFNldHVwKGFyZ3VtZW50cywgY3JlYXRlZFN0dWIpO1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBzYW5kYm94LmZha2UgPSBmdW5jdGlvbiBmYWtlKGYpIHtcbiAgICAgICAgdmFyIHMgPSBzaW5vbkZha2UuYXBwbHkoc2lub25GYWtlLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHB1c2goY29sbGVjdGlvbiwgcyk7XG5cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcblxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoc2lub25GYWtlKSwgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHZhciBmYWtlQmVoYXZpb3IgPSBzaW5vbkZha2Vba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWtlQmVoYXZpb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgc2FuZGJveC5mYWtlW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGZha2VCZWhhdmlvci5hcHBseShmYWtlQmVoYXZpb3IsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIHMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBzYW5kYm94LnVzZUZha2VUaW1lcnMgPSBmdW5jdGlvbiB1c2VGYWtlVGltZXJzKGFyZ3MpIHtcbiAgICAgICAgdmFyIGNsb2NrID0gc2lub25DbG9jay51c2VGYWtlVGltZXJzLmNhbGwobnVsbCwgYXJncyk7XG5cbiAgICAgICAgc2FuZGJveC5jbG9jayA9IGNsb2NrO1xuICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIGNsb2NrKTtcblxuICAgICAgICByZXR1cm4gY2xvY2s7XG4gICAgfTtcblxuICAgIHNhbmRib3gudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KCkge1xuICAgICAgICBhcHBseU9uRWFjaChjb2xsZWN0aW9uLCBcInZlcmlmeVwiKTtcbiAgICB9O1xuXG4gICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlID0gZnVuY3Rpb24gdmVyaWZ5QW5kUmVzdG9yZSgpIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvbjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2FuZGJveC52ZXJpZnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhjZXB0aW9uID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuXG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzYW5kYm94LnVzZUZha2VTZXJ2ZXIgPSBmdW5jdGlvbiB1c2VGYWtlU2VydmVyKCkge1xuICAgICAgICB2YXIgcHJvdG8gPSBzYW5kYm94LnNlcnZlclByb3RvdHlwZSB8fCBmYWtlU2VydmVyO1xuXG4gICAgICAgIGlmICghcHJvdG8gfHwgIXByb3RvLmNyZWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzYW5kYm94LnNlcnZlciA9IHByb3RvLmNyZWF0ZSgpO1xuICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIHNhbmRib3guc2VydmVyKTtcblxuICAgICAgICByZXR1cm4gc2FuZGJveC5zZXJ2ZXI7XG4gICAgfTtcblxuICAgIHNhbmRib3gudXNlRmFrZVhNTEh0dHBSZXF1ZXN0ID0gZnVuY3Rpb24gdXNlRmFrZVhNTEh0dHBSZXF1ZXN0KCkge1xuICAgICAgICB2YXIgeGhyID0gZmFrZVhoci51c2VGYWtlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcHVzaChjb2xsZWN0aW9uLCB4aHIpO1xuICAgICAgICByZXR1cm4geGhyO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnVzaW5nUHJvbWlzZSA9IGZ1bmN0aW9uIHVzaW5nUHJvbWlzZShwcm9taXNlTGlicmFyeSkge1xuICAgICAgICBwcm9taXNlTGliID0gcHJvbWlzZUxpYnJhcnk7XG4gICAgICAgIGNvbGxlY3Rpb24ucHJvbWlzZUxpYnJhcnkgPSBwcm9taXNlTGlicmFyeTtcblxuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICB9O1xufVxuXG5TYW5kYm94LnByb3RvdHlwZS5tYXRjaCA9IG1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNhbmRib3g7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNvbG9yID0gcmVxdWlyZShcIi4vY29sb3JcIik7XG52YXIgbWF0Y2ggPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXI7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3RpbWVzLWluLXdvcmRzXCIpO1xudmFyIHNpbm9uRm9ybWF0ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2Zvcm1hdFwiKTtcbnZhciBqc0RpZmYgPSByZXF1aXJlKFwiZGlmZlwiKTtcblxudmFyIGpvaW4gPSBhcnJheVByb3RvLmpvaW47XG52YXIgbWFwID0gYXJyYXlQcm90by5tYXA7XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbmZ1bmN0aW9uIGNvbG9yU2lub25NYXRjaFRleHQobWF0Y2hlciwgY2FsbGVkQXJnLCBjYWxsZWRBcmdNZXNzYWdlKSB7XG4gICAgdmFyIGNhbGxlZEFyZ3VtZW50TWVzc2FnZSA9IGNhbGxlZEFyZ01lc3NhZ2U7XG4gICAgaWYgKCFtYXRjaGVyLnRlc3QoY2FsbGVkQXJnKSkge1xuICAgICAgICBtYXRjaGVyLm1lc3NhZ2UgPSBjb2xvci5yZWQobWF0Y2hlci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGNhbGxlZEFyZ3VtZW50TWVzc2FnZSkge1xuICAgICAgICAgICAgY2FsbGVkQXJndW1lbnRNZXNzYWdlID0gY29sb3IuZ3JlZW4oY2FsbGVkQXJndW1lbnRNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FsbGVkQXJndW1lbnRNZXNzYWdlICsgXCIgXCIgKyBtYXRjaGVyLm1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGNvbG9yRGlmZlRleHQoZGlmZikge1xuICAgIHZhciBvYmplY3RzID0gbWFwKGRpZmYsIGZ1bmN0aW9uKHBhcnQpIHtcbiAgICAgICAgdmFyIHRleHQgPSBwYXJ0LnZhbHVlO1xuICAgICAgICBpZiAocGFydC5hZGRlZCkge1xuICAgICAgICAgICAgdGV4dCA9IGNvbG9yLmdyZWVuKHRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnQucmVtb3ZlZCkge1xuICAgICAgICAgICAgdGV4dCA9IGNvbG9yLnJlZCh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHRleHQgKz0gXCIgXCI7IC8vIGZvcm1hdCBzaW1wbGUgZGlmZnNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9KTtcbiAgICByZXR1cm4gam9pbihvYmplY3RzLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcXVvdGVTdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjOiBmdW5jdGlvbihzcHlJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdGltZXNJbldvcmRzKHNweUluc3RhbmNlLmNhbGxDb3VudCk7XG4gICAgfSxcblxuICAgIG46IGZ1bmN0aW9uKHNweUluc3RhbmNlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc2lub25qcy9uby1wcm90b3R5cGUtbWV0aG9kcy9uby1wcm90b3R5cGUtbWV0aG9kc1xuICAgICAgICByZXR1cm4gc3B5SW5zdGFuY2UudG9TdHJpbmcoKTtcbiAgICB9LFxuXG4gICAgRDogZnVuY3Rpb24oc3B5SW5zdGFuY2UsIGFyZ3MpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIlwiO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3B5SW5zdGFuY2UuY2FsbENvdW50OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyBkZXNjcmliZSBtdWx0aXBsZSBjYWxsc1xuICAgICAgICAgICAgaWYgKGwgPiAxKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIlxcbkNhbGwgXCIgKyAoaSArIDEpICsgXCI6XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2FsbGVkQXJncyA9IHNweUluc3RhbmNlLmdldENhbGwoaSkuYXJncztcbiAgICAgICAgICAgIHZhciBleHBlY3RlZEFyZ3MgPSBzbGljZShhcmdzKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYWxsZWRBcmdzLmxlbmd0aCB8fCBqIDwgZXhwZWN0ZWRBcmdzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxlZEFyZ3Nbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGVkQXJnc1tqXSA9IHF1b3RlU3RyaW5nVmFsdWUoY2FsbGVkQXJnc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkQXJnc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEFyZ3Nbal0gPSBxdW90ZVN0cmluZ1ZhbHVlKGV4cGVjdGVkQXJnc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIlxcblwiO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNhbGxlZEFyZ01lc3NhZ2UgPSBqIDwgY2FsbGVkQXJncy5sZW5ndGggPyBzaW5vbkZvcm1hdChjYWxsZWRBcmdzW2pdKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzTWF0Y2hlcihleHBlY3RlZEFyZ3Nbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gY29sb3JTaW5vbk1hdGNoVGV4dChleHBlY3RlZEFyZ3Nbal0sIGNhbGxlZEFyZ3Nbal0sIGNhbGxlZEFyZ01lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleHBlY3RlZEFyZ01lc3NhZ2UgPSBqIDwgZXhwZWN0ZWRBcmdzLmxlbmd0aCA/IHNpbm9uRm9ybWF0KGV4cGVjdGVkQXJnc1tqXSkgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGpzRGlmZi5kaWZmSnNvbihjYWxsZWRBcmdNZXNzYWdlLCBleHBlY3RlZEFyZ01lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGNvbG9yRGlmZlRleHQoZGlmZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcblxuICAgIEM6IGZ1bmN0aW9uKHNweUluc3RhbmNlKSB7XG4gICAgICAgIHZhciBjYWxscyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3B5SW5zdGFuY2UuY2FsbENvdW50OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHNpbm9uanMvbm8tcHJvdG90eXBlLW1ldGhvZHMvbm8tcHJvdG90eXBlLW1ldGhvZHNcbiAgICAgICAgICAgIHZhciBzdHJpbmdpZmllZENhbGwgPSBcIiAgICBcIiArIHNweUluc3RhbmNlLmdldENhbGwoaSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmICgvXFxuLy50ZXN0KGNhbGxzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZENhbGwgPSBcIlxcblwiICsgc3RyaW5naWZpZWRDYWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHVzaChjYWxscywgc3RyaW5naWZpZWRDYWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxscy5sZW5ndGggPiAwID8gXCJcXG5cIiArIGpvaW4oY2FsbHMsIFwiXFxuXCIpIDogXCJcIjtcbiAgICB9LFxuXG4gICAgdDogZnVuY3Rpb24oc3B5SW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHNweUluc3RhbmNlLmNhbGxDb3VudDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgcHVzaChvYmplY3RzLCBzaW5vbkZvcm1hdChzcHlJbnN0YW5jZS50aGlzVmFsdWVzW2ldKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gam9pbihvYmplY3RzLCBcIiwgXCIpO1xuICAgIH0sXG5cbiAgICBcIipcIjogZnVuY3Rpb24oc3B5SW5zdGFuY2UsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oXG4gICAgICAgICAgICBtYXAoYXJncywgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbm9uRm9ybWF0KGFyZyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFwiLCBcIlxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNyZWF0ZVByb3h5ID0gcmVxdWlyZShcIi4vcHJveHlcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2V4dGVuZFwiKTtcbnZhciBmdW5jdGlvbk5hbWUgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5mdW5jdGlvbk5hbWU7XG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCJAc2lub25qcy9zYW1zYW1cIikuZGVlcEVxdWFsO1xudmFyIGlzRXNNb2R1bGUgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvaXMtZXMtbW9kdWxlXCIpO1xudmFyIHByb3h5Q2FsbFV0aWwgPSByZXF1aXJlKFwiLi9wcm94eS1jYWxsLXV0aWxcIik7XG52YXIgd2Fsa09iamVjdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS93YWxrLW9iamVjdFwiKTtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dyYXAtbWV0aG9kXCIpO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xuXG4vKiBjYWNoZSByZWZlcmVuY2VzIHRvIGxpYnJhcnkgbWV0aG9kcyBzbyB0aGF0IHRoZXkgYWxzbyBjYW4gYmUgc3R1YmJlZCB3aXRob3V0IHByb2JsZW1zICovXG52YXIgZm9yRWFjaCA9IGFycmF5UHJvdG8uZm9yRWFjaDtcbnZhciBwb3AgPSBhcnJheVByb3RvLnBvcDtcbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG52YXIgdXVpZCA9IDA7XG5cbmZ1bmN0aW9uIG1hdGNoZXMoZmFrZSwgYXJncywgc3RyaWN0KSB7XG4gICAgdmFyIG1hcmdzID0gZmFrZS5tYXRjaGluZ0FyZ3VtZW50cztcbiAgICBpZiAobWFyZ3MubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoICYmIGRlZXBFcXVhbChzbGljZShhcmdzLCAwLCBtYXJncy5sZW5ndGgpLCBtYXJncykpIHtcbiAgICAgICAgcmV0dXJuICFzdHJpY3QgfHwgbWFyZ3MubGVuZ3RoID09PSBhcmdzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBQdWJsaWMgQVBJXG52YXIgc3B5QXBpID0ge1xuICAgIHdpdGhBcmdzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuICAgICAgICB2YXIgbWF0Y2hpbmcgPSBwb3AodGhpcy5tYXRjaGluZ0Zha2VzKGFyZ3MsIHRydWUpKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3JpZ2luYWwgPSB0aGlzO1xuICAgICAgICB2YXIgZmFrZSA9IHRoaXMuaW5zdGFudGlhdGVGYWtlKCk7XG4gICAgICAgIGZha2UubWF0Y2hpbmdBcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICBmYWtlLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIHB1c2godGhpcy5mYWtlcywgZmFrZSk7XG5cbiAgICAgICAgZmFrZS53aXRoQXJncyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLndpdGhBcmdzLmFwcGx5KG9yaWdpbmFsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvckVhY2gob3JpZ2luYWwuYXJncywgZnVuY3Rpb24oYXJnLCBpKSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoZmFrZSwgYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJveHlDYWxsVXRpbC5pbmNyZW1lbnRDYWxsQ291bnQoZmFrZSk7XG4gICAgICAgICAgICBwdXNoKGZha2UudGhpc1ZhbHVlcywgb3JpZ2luYWwudGhpc1ZhbHVlc1tpXSk7XG4gICAgICAgICAgICBwdXNoKGZha2UuYXJncywgYXJnKTtcbiAgICAgICAgICAgIHB1c2goZmFrZS5yZXR1cm5WYWx1ZXMsIG9yaWdpbmFsLnJldHVyblZhbHVlc1tpXSk7XG4gICAgICAgICAgICBwdXNoKGZha2UuZXhjZXB0aW9ucywgb3JpZ2luYWwuZXhjZXB0aW9uc1tpXSk7XG4gICAgICAgICAgICBwdXNoKGZha2UuY2FsbElkcywgb3JpZ2luYWwuY2FsbElkc1tpXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb3h5Q2FsbFV0aWwuY3JlYXRlQ2FsbFByb3BlcnRpZXMoZmFrZSk7XG5cbiAgICAgICAgcmV0dXJuIGZha2U7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHByb3h5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICBtYXRjaGluZ0Zha2VzOiBmdW5jdGlvbihhcmdzLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuZmFrZXMsIGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzKGZha2UsIGFyZ3MsIHN0cmljdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIEBzaW5vbmpzL25vLXByb3RvdHlwZS1tZXRob2RzL25vLXByb3RvdHlwZS1tZXRob2RzICovXG52YXIgZGVsZWdhdGVUb0NhbGxzID0gcHJveHlDYWxsVXRpbC5kZWxlZ2F0ZVRvQ2FsbHM7XG5kZWxlZ2F0ZVRvQ2FsbHMoc3B5QXBpLCBcImNhbGxBcmdcIiwgZmFsc2UsIFwiY2FsbEFyZ1dpdGhcIiwgdHJ1ZSwgZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCBjYWxsIGFyZyBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuc3B5QXBpLmNhbGxBcmdXaXRoID0gc3B5QXBpLmNhbGxBcmc7XG5kZWxlZ2F0ZVRvQ2FsbHMoc3B5QXBpLCBcImNhbGxBcmdPblwiLCBmYWxzZSwgXCJjYWxsQXJnT25XaXRoXCIsIHRydWUsIGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgY2FsbCBhcmcgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIik7XG59KTtcbnNweUFwaS5jYWxsQXJnT25XaXRoID0gc3B5QXBpLmNhbGxBcmdPbjtcbmRlbGVnYXRlVG9DYWxscyhzcHlBcGksIFwidGhyb3dBcmdcIiwgZmFsc2UsIFwidGhyb3dBcmdcIiwgZmFsc2UsIGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgdGhyb3cgYXJnIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuXCIpO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoc3B5QXBpLCBcInlpZWxkXCIsIGZhbHNlLCBcInlpZWxkXCIsIHRydWUsIGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgeWllbGQgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIik7XG59KTtcbi8vIFwiaW52b2tlQ2FsbGJhY2tcIiBpcyBhbiBhbGlhcyBmb3IgXCJ5aWVsZFwiIHNpbmNlIFwieWllbGRcIiBpcyBpbnZhbGlkIGluIHN0cmljdCBtb2RlLlxuc3B5QXBpLmludm9rZUNhbGxiYWNrID0gc3B5QXBpLnlpZWxkO1xuZGVsZWdhdGVUb0NhbGxzKHNweUFwaSwgXCJ5aWVsZE9uXCIsIGZhbHNlLCBcInlpZWxkT25cIiwgdHJ1ZSwgZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuZGVsZWdhdGVUb0NhbGxzKHNweUFwaSwgXCJ5aWVsZFRvXCIsIGZhbHNlLCBcInlpZWxkVG9cIiwgdHJ1ZSwgZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCB0byAnXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiJyBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiXG4gICAgKTtcbn0pO1xuZGVsZWdhdGVUb0NhbGxzKHNweUFwaSwgXCJ5aWVsZFRvT25cIiwgZmFsc2UsIFwieWllbGRUb09uXCIsIHRydWUsIGZ1bmN0aW9uKHByb3BlcnR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICB0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgeWllbGQgdG8gJ1wiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgKyBcIicgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIlxuICAgICk7XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlU3B5KGZ1bmMpIHtcbiAgICB2YXIgbmFtZTtcbiAgICB2YXIgZnVuayA9IGZ1bmM7XG5cbiAgICBpZiAodHlwZW9mIGZ1bmsgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBmdW5rID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGZ1bmN0aW9uTmFtZShmdW5rKTtcbiAgICB9XG5cbiAgICB2YXIgcHJveHkgPSBjcmVhdGVQcm94eShmdW5rLCBmdW5rKTtcblxuICAgIC8vIEluaGVyaXQgc3B5IEFQSTpcbiAgICBleHRlbmQubm9uRW51bShwcm94eSwgc3B5QXBpKTtcbiAgICBleHRlbmQubm9uRW51bShwcm94eSwge1xuICAgICAgICBkaXNwbGF5TmFtZTogbmFtZSB8fCBcInNweVwiLFxuICAgICAgICBmYWtlczogW10sXG4gICAgICAgIGluc3RhbnRpYXRlRmFrZTogY3JlYXRlU3B5LFxuICAgICAgICBpZDogXCJzcHkjXCIgKyB1dWlkKytcbiAgICB9KTtcbiAgICByZXR1cm4gcHJveHk7XG59XG5cbmZ1bmN0aW9uIHNweShvYmplY3QsIHByb3BlcnR5LCB0eXBlcykge1xuICAgIHZhciBkZXNjcmlwdG9yLCBtZXRob2REZXNjO1xuXG4gICAgaWYgKGlzRXNNb2R1bGUob2JqZWN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVMgTW9kdWxlcyBjYW5ub3QgYmUgc3BpZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wZXJ0eSAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNweShvYmplY3QpO1xuICAgIH1cblxuICAgIGlmICghcHJvcGVydHkgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gd2Fsa09iamVjdChzcHksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKCFvYmplY3QgJiYgIXByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTcHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgY3JlYXRlU3B5KG9iamVjdFtwcm9wZXJ0eV0pKTtcbiAgICB9XG5cbiAgICBkZXNjcmlwdG9yID0ge307XG4gICAgbWV0aG9kRGVzYyA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGZvckVhY2godHlwZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgZGVzY3JpcHRvclt0eXBlXSA9IGNyZWF0ZVNweShtZXRob2REZXNjW3R5cGVdKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB3cmFwTWV0aG9kKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpO1xufVxuXG5leHRlbmQoc3B5LCBzcHlBcGkpO1xubW9kdWxlLmV4cG9ydHMgPSBzcHk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGJlaGF2aW9yID0gcmVxdWlyZShcIi4vYmVoYXZpb3JcIik7XG52YXIgYmVoYXZpb3JzID0gcmVxdWlyZShcIi4vZGVmYXVsdC1iZWhhdmlvcnNcIik7XG52YXIgY3JlYXRlUHJveHkgPSByZXF1aXJlKFwiLi9wcm94eVwiKTtcbnZhciBmdW5jdGlvbk5hbWUgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5mdW5jdGlvbk5hbWU7XG52YXIgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc05vbkV4aXN0ZW50UHJvcGVydHkgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvaXMtbm9uLWV4aXN0ZW50LXByb3BlcnR5XCIpO1xudmFyIHNweSA9IHJlcXVpcmUoXCIuL3NweVwiKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9nZXQtcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBpc0VzTW9kdWxlID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2lzLWVzLW1vZHVsZVwiKTtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dyYXAtbWV0aG9kXCIpO1xudmFyIHRocm93T25GYWxzeU9iamVjdCA9IHJlcXVpcmUoXCIuL3Rocm93LW9uLWZhbHN5LW9iamVjdFwiKTtcbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcbnZhciB3YWxrT2JqZWN0ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dhbGstb2JqZWN0XCIpO1xuXG52YXIgZm9yRWFjaCA9IGFycmF5UHJvdG8uZm9yRWFjaDtcbnZhciBwb3AgPSBhcnJheVByb3RvLnBvcDtcbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG52YXIgc29ydCA9IGFycmF5UHJvdG8uc29ydDtcblxudmFyIHV1aWQgPSAwO1xuXG5mdW5jdGlvbiBjcmVhdGVTdHViKG9yaWdpbmFsRnVuYykge1xuICAgIHZhciBwcm94eTtcblxuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uU3R1YigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuICAgICAgICB2YXIgbWF0Y2hpbmdzID0gcHJveHkubWF0Y2hpbmdGYWtlcyhhcmdzKTtcblxuICAgICAgICB2YXIgZm5TdHViID1cbiAgICAgICAgICAgIHBvcChcbiAgICAgICAgICAgICAgICBzb3J0KG1hdGNoaW5ncywgZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5tYXRjaGluZ0FyZ3VtZW50cy5sZW5ndGggLSBiLm1hdGNoaW5nQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSB8fCBwcm94eTtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRCZWhhdmlvcihmblN0dWIpLmludm9rZSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHByb3h5ID0gY3JlYXRlUHJveHkoZnVuY3Rpb25TdHViLCBvcmlnaW5hbEZ1bmMgfHwgZnVuY3Rpb25TdHViKTtcbiAgICAvLyBJbmhlcml0IHNweSBBUEk6XG4gICAgZXh0ZW5kLm5vbkVudW0ocHJveHksIHNweSk7XG4gICAgLy8gSW5oZXJpdCBzdHViIEFQSTpcbiAgICBleHRlbmQubm9uRW51bShwcm94eSwgc3R1Yik7XG5cbiAgICB2YXIgbmFtZSA9IG9yaWdpbmFsRnVuYyA/IGZ1bmN0aW9uTmFtZShvcmlnaW5hbEZ1bmMpIDogbnVsbDtcbiAgICBleHRlbmQubm9uRW51bShwcm94eSwge1xuICAgICAgICBmYWtlczogW10sXG4gICAgICAgIGluc3RhbnRpYXRlRmFrZTogY3JlYXRlU3R1YixcbiAgICAgICAgZGlzcGxheU5hbWU6IG5hbWUgfHwgXCJzdHViXCIsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogbnVsbCxcbiAgICAgICAgYmVoYXZpb3JzOiBbXSxcbiAgICAgICAgaWQ6IFwic3R1YiNcIiArIHV1aWQrK1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3h5O1xufVxuXG5mdW5jdGlvbiBzdHViKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInN0dWIob2JqLCAnbWV0aCcsIGZuKSBoYXMgYmVlbiByZW1vdmVkLCBzZWUgZG9jdW1lbnRhdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFc01vZHVsZShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUyBNb2R1bGVzIGNhbm5vdCBiZSBzdHViYmVkXCIpO1xuICAgIH1cblxuICAgIHRocm93T25GYWxzeU9iamVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKGlzTm9uRXhpc3RlbnRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHN0dWIgbm9uLWV4aXN0ZW50IHByb3BlcnR5IFwiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkpO1xuICAgIH1cblxuICAgIHZhciBhY3R1YWxEZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuICAgIHZhciBpc09iamVjdE9yRnVuY3Rpb24gPSB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmplY3QgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB2YXIgaXNTdHViYmluZ0VudGlyZU9iamVjdCA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBpc09iamVjdE9yRnVuY3Rpb247XG4gICAgdmFyIGlzQ3JlYXRpbmdOZXdTdHViID0gIW9iamVjdCAmJiB0eXBlb2YgcHJvcGVydHkgPT09IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzU3R1YmJpbmdOb25GdW5jUHJvcGVydHkgPVxuICAgICAgICBpc09iamVjdE9yRnVuY3Rpb24gJiZcbiAgICAgICAgdHlwZW9mIHByb3BlcnR5ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICh0eXBlb2YgYWN0dWFsRGVzY3JpcHRvciA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YgYWN0dWFsRGVzY3JpcHRvci52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKTtcblxuICAgIGlmIChpc1N0dWJiaW5nRW50aXJlT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB3YWxrT2JqZWN0KHN0dWIsIG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3JlYXRpbmdOZXdTdHViKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdHViKCk7XG4gICAgfVxuXG4gICAgdmFyIGZ1bmMgPSB0eXBlb2YgYWN0dWFsRGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gYWN0dWFsRGVzY3JpcHRvci52YWx1ZSA6IG51bGw7XG4gICAgdmFyIHMgPSBjcmVhdGVTdHViKGZ1bmMpO1xuXG4gICAgZXh0ZW5kLm5vbkVudW0ocywge1xuICAgICAgICByb290T2JqOiBvYmplY3QsXG4gICAgICAgIHByb3BOYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgc2hhZG93c1Byb3BPblByb3RvdHlwZTogIWFjdHVhbERlc2NyaXB0b3IuaXNPd24sXG4gICAgICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgICAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbERlc2NyaXB0b3IuaXNPd24pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgYWN0dWFsRGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlzU3R1YmJpbmdOb25GdW5jUHJvcGVydHkgPyBzIDogd3JhcE1ldGhvZChvYmplY3QsIHByb3BlcnR5LCBzKTtcbn1cblxuc3R1Yi5jcmVhdGVTdHViSW5zdGFuY2UgPSBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgb3ZlcnJpZGVzKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzdHViYmVkT2JqZWN0ID0gc3R1YihPYmplY3QuY3JlYXRlKGNvbnN0cnVjdG9yLnByb3RvdHlwZSkpO1xuXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhvdmVycmlkZXMgfHwge30pLCBmdW5jdGlvbihwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSBpbiBzdHViYmVkT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBvdmVycmlkZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5jcmVhdGVTdHViSW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBzdHViYmVkT2JqZWN0W3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3R1YmJlZE9iamVjdFtwcm9wZXJ0eU5hbWVdLnJldHVybnModmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHN0dWIgXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIi4gUHJvcGVydHkgZG9lcyBub3QgZXhpc3QhXCIpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0dWJiZWRPYmplY3Q7XG59O1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmZ1bmN0aW9uIGdldFBhcmVudEJlaGF2aW91cihzdHViSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gc3R1Ykluc3RhbmNlLnBhcmVudCAmJiBnZXRDdXJyZW50QmVoYXZpb3Ioc3R1Ykluc3RhbmNlLnBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRCZWhhdmlvcihzdHViSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gc3R1Ykluc3RhbmNlLmRlZmF1bHRCZWhhdmlvciB8fCBnZXRQYXJlbnRCZWhhdmlvdXIoc3R1Ykluc3RhbmNlKSB8fCBiZWhhdmlvci5jcmVhdGUoc3R1Ykluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEJlaGF2aW9yKHN0dWJJbnN0YW5jZSkge1xuICAgIHZhciBjdXJyZW50QmVoYXZpb3IgPSBzdHViSW5zdGFuY2UuYmVoYXZpb3JzW3N0dWJJbnN0YW5jZS5jYWxsQ291bnQgLSAxXTtcbiAgICByZXR1cm4gY3VycmVudEJlaGF2aW9yICYmIGN1cnJlbnRCZWhhdmlvci5pc1ByZXNlbnQoKSA/IGN1cnJlbnRCZWhhdmlvciA6IGdldERlZmF1bHRCZWhhdmlvcihzdHViSW5zdGFuY2UpO1xufVxuLyplc2xpbnQtZW5hYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cblxudmFyIHByb3RvID0ge1xuICAgIHJlc2V0QmVoYXZpb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvciA9IG51bGw7XG4gICAgICAgIHRoaXMuYmVoYXZpb3JzID0gW107XG5cbiAgICAgICAgZGVsZXRlIHRoaXMucmV0dXJuVmFsdWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnJldHVybkFyZ0F0O1xuICAgICAgICBkZWxldGUgdGhpcy50aHJvd0FyZ0F0O1xuICAgICAgICBkZWxldGUgdGhpcy5yZXNvbHZlQXJnQXQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmZha2VGbjtcbiAgICAgICAgdGhpcy5yZXR1cm5UaGlzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzb2x2ZVRoaXMgPSBmYWxzZTtcblxuICAgICAgICBmb3JFYWNoKHRoaXMuZmFrZXMsIGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgICAgIGZha2UucmVzZXRCZWhhdmlvcigpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlc2V0SGlzdG9yeSgpO1xuICAgICAgICB0aGlzLnJlc2V0QmVoYXZpb3IoKTtcbiAgICB9LFxuXG4gICAgb25DYWxsOiBmdW5jdGlvbiBvbkNhbGwoaW5kZXgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJlaGF2aW9yc1tpbmRleF0pIHtcbiAgICAgICAgICAgIHRoaXMuYmVoYXZpb3JzW2luZGV4XSA9IGJlaGF2aW9yLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmJlaGF2aW9yc1tpbmRleF07XG4gICAgfSxcblxuICAgIG9uRmlyc3RDYWxsOiBmdW5jdGlvbiBvbkZpcnN0Q2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25DYWxsKDApO1xuICAgIH0sXG5cbiAgICBvblNlY29uZENhbGw6IGZ1bmN0aW9uIG9uU2Vjb25kQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25DYWxsKDEpO1xuICAgIH0sXG5cbiAgICBvblRoaXJkQ2FsbDogZnVuY3Rpb24gb25UaGlyZENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9uQ2FsbCgyKTtcbiAgICB9LFxuXG4gICAgd2l0aEFyZ3M6IGZ1bmN0aW9uIHdpdGhBcmdzKCkge1xuICAgICAgICB2YXIgZmFrZSA9IHNweS53aXRoQXJncy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0QmVoYXZpb3IgJiYgdGhpcy5kZWZhdWx0QmVoYXZpb3IucHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgICAgIGZha2UuZGVmYXVsdEJlaGF2aW9yID0gZmFrZS5kZWZhdWx0QmVoYXZpb3IgfHwgYmVoYXZpb3IuY3JlYXRlKGZha2UpO1xuICAgICAgICAgICAgZmFrZS5kZWZhdWx0QmVoYXZpb3IucHJvbWlzZUxpYnJhcnkgPSB0aGlzLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9XG59O1xuXG5mb3JFYWNoKE9iamVjdC5rZXlzKGJlaGF2aW9yKSwgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgaWYgKFxuICAgICAgICBoYXNPd25Qcm9wZXJ0eShiZWhhdmlvciwgbWV0aG9kKSAmJlxuICAgICAgICAhaGFzT3duUHJvcGVydHkocHJvdG8sIG1ldGhvZCkgJiZcbiAgICAgICAgbWV0aG9kICE9PSBcImNyZWF0ZVwiICYmXG4gICAgICAgIG1ldGhvZCAhPT0gXCJpbnZva2VcIlxuICAgICkge1xuICAgICAgICBwcm90b1ttZXRob2RdID0gYmVoYXZpb3IuY3JlYXRlQmVoYXZpb3IobWV0aG9kKTtcbiAgICB9XG59KTtcblxuZm9yRWFjaChPYmplY3Qua2V5cyhiZWhhdmlvcnMpLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkoYmVoYXZpb3JzLCBtZXRob2QpICYmICFoYXNPd25Qcm9wZXJ0eShwcm90bywgbWV0aG9kKSkge1xuICAgICAgICBiZWhhdmlvci5hZGRCZWhhdmlvcihzdHViLCBtZXRob2QsIGJlaGF2aW9yc1ttZXRob2RdKTtcbiAgICB9XG59KTtcblxuZXh0ZW5kKHN0dWIsIHByb3RvKTtcbm1vZHVsZS5leHBvcnRzID0gc3R1YjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xuXG5mdW5jdGlvbiB0aHJvd09uRmFsc3lPYmplY3Qob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wZXJ0eSAmJiAhb2JqZWN0KSB7XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0ID09PSBudWxsID8gXCJudWxsXCIgOiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc3R1YiBwcm9wZXJ0eSAnXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiJyBvZiBcIiArIHR5cGUpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvd09uRmFsc3lPYmplY3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaW5qZWN0SW50bzogbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwic3B5XCIsXG4gICAgICAgIFwic3R1YlwiLFxuICAgICAgICBcIm1vY2tcIixcbiAgICAgICAgXCJjbG9ja1wiLFxuICAgICAgICBcInNlcnZlclwiLFxuICAgICAgICBcInJlcXVlc3RzXCIsXG4gICAgICAgIFwiZmFrZVwiLFxuICAgICAgICBcInJlcGxhY2VcIixcbiAgICAgICAgXCJyZXBsYWNlU2V0dGVyXCIsXG4gICAgICAgIFwicmVwbGFjZUdldHRlclwiLFxuICAgICAgICBcImNyZWF0ZVN0dWJJbnN0YW5jZVwiXG4gICAgXSxcbiAgICB1c2VGYWtlVGltZXJzOiB0cnVlLFxuICAgIHVzZUZha2VTZXJ2ZXI6IHRydWVcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIHJlZHVjZSA9IGFycmF5UHJvdG8ucmVkdWNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4cG9ydEFzeW5jQmVoYXZpb3JzKGJlaGF2aW9yTWV0aG9kcykge1xuICAgIHJldHVybiByZWR1Y2UoXG4gICAgICAgIE9iamVjdC5rZXlzKGJlaGF2aW9yTWV0aG9kcyksXG4gICAgICAgIGZ1bmN0aW9uKGFjYywgbWV0aG9kKSB7XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgYXN5bmMgdmVyc2lvbnMgb2YgdGhlIG5ld2x5IGFkZGVkIGFzeW5jIG1ldGhvZHNcbiAgICAgICAgICAgIGlmIChtZXRob2QubWF0Y2goL14oY2FsbHNBcmd8eWllbGRzKS8pICYmICFtZXRob2QubWF0Y2goL0FzeW5jLykpIHtcbiAgICAgICAgICAgICAgICBhY2NbbWV0aG9kICsgXCJBc3luY1wiXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYmVoYXZpb3JNZXRob2RzW21ldGhvZF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICApO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGpvaW4gPSBhcnJheVByb3RvLmpvaW47XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0VDTUFTY3JpcHRfRG9udEVudW1fYXR0cmlidXRlI0pTY3JpcHRfRG9udEVudW1fQnVnXG52YXIgaGFzRG9udEVudW1CdWcgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMFwiO1xuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIxXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlT2Y6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMlwiO1xuICAgICAgICB9LFxuICAgICAgICB0b0xvY2FsZVN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIzXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3RvdHlwZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI0XCI7XG4gICAgICAgIH0sXG4gICAgICAgIGlzUHJvdG90eXBlT2Y6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiNVwiO1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI2XCI7XG4gICAgICAgIH0sXG4gICAgICAgIGhhc093blByb3BlcnR5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjdcIjtcbiAgICAgICAgfSxcbiAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjhcIjtcbiAgICAgICAgfSxcbiAgICAgICAgdW5pcXVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjlcIjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkpIHtcbiAgICAgICAgICAgIHB1c2gocmVzdWx0LCBvYmpbcHJvcF0oKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpvaW4ocmVzdWx0LCBcIlwiKSAhPT0gXCIwMTIzNDU2Nzg5XCI7XG59KSgpO1xuXG5mdW5jdGlvbiBleHRlbmRDb21tb24odGFyZ2V0LCBzb3VyY2VzLCBkb0NvcHkpIHtcbiAgICB2YXIgc291cmNlLCBpLCBwcm9wO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291cmNlID0gc291cmNlc1tpXTtcblxuICAgICAgICBmb3IgKHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGRvQ29weSh0YXJnZXQsIHNvdXJjZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29weSAob3duKSB0b1N0cmluZyBtZXRob2QgZXZlbiB3aGVuIGluIEpTY3JpcHQgd2l0aCBEb250RW51bSBidWdcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvRUNNQVNjcmlwdF9Eb250RW51bV9hdHRyaWJ1dGUjSlNjcmlwdF9Eb250RW51bV9CdWdcbiAgICAgICAgaWYgKGhhc0RvbnRFbnVtQnVnICYmIGhhc093blByb3BlcnR5KHNvdXJjZSwgXCJ0b1N0cmluZ1wiKSAmJiBzb3VyY2UudG9TdHJpbmcgIT09IHRhcmdldC50b1N0cmluZykge1xuICAgICAgICAgICAgdGFyZ2V0LnRvU3RyaW5nID0gc291cmNlLnRvU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFB1YmxpYzogRXh0ZW5kIHRhcmdldCBpbiBwbGFjZSB3aXRoIGFsbCAob3duKSBwcm9wZXJ0aWVzLCBleGNlcHQgJ25hbWUnIHdoZW4gW1t3cml0YWJsZV1dIGlzIGZhbHNlLFxuICogICAgICAgICBmcm9tIHNvdXJjZXMgaW4tb3JkZXIuIFRodXMsIGxhc3Qgc291cmNlIHdpbGwgb3ZlcnJpZGUgcHJvcGVydGllcyBpbiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqIEBhcmcge09iamVjdH0gdGFyZ2V0IC0gVGhlIE9iamVjdCB0byBleHRlbmRcbiAqIEBhcmcge09iamVjdFtdfSBzb3VyY2VzIC0gT2JqZWN0cyB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgZXh0ZW5kZWQgdGFyZ2V0XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCAvKiwgc291cmNlcyAqLykge1xuICAgIHZhciBzb3VyY2VzID0gc2xpY2UoYXJndW1lbnRzLCAxKTtcblxuICAgIHJldHVybiBleHRlbmRDb21tb24odGFyZ2V0LCBzb3VyY2VzLCBmdW5jdGlvbiBjb3B5VmFsdWUoZGVzdCwgc291cmNlLCBwcm9wKSB7XG4gICAgICAgIHZhciBkZXN0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZXN0LCBwcm9wKTtcbiAgICAgICAgdmFyIHNvdXJjZU93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBwcm9wKTtcblxuICAgICAgICBpZiAocHJvcCA9PT0gXCJuYW1lXCIgJiYgIWRlc3RPd25Qcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZXN0LCBwcm9wLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHNvdXJjZU93blByb3BlcnR5RGVzY3JpcHRvci5jb25maWd1cmFibGUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZW51bWVyYWJsZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBzb3VyY2VPd25Qcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGUsXG4gICAgICAgICAgICB2YWx1ZTogc291cmNlT3duUHJvcGVydHlEZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuLyoqIFB1YmxpYzogRXh0ZW5kIHRhcmdldCBpbiBwbGFjZSB3aXRoIGFsbCAob3duKSBwcm9wZXJ0aWVzIGZyb20gc291cmNlcyBpbi1vcmRlci4gVGh1cywgbGFzdCBzb3VyY2Ugd2lsbFxuICogICAgICAgICBvdmVycmlkZSBwcm9wZXJ0aWVzIGluIHByZXZpb3VzIHNvdXJjZXMuIERlZmluZSB0aGUgcHJvcGVydGllcyBhcyBub24gZW51bWVyYWJsZS5cbiAqXG4gKiBAYXJnIHtPYmplY3R9IHRhcmdldCAtIFRoZSBPYmplY3QgdG8gZXh0ZW5kXG4gKiBAYXJnIHtPYmplY3RbXX0gc291cmNlcyAtIE9iamVjdHMgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKlxuICogQHJldHVybnMge09iamVjdH0gdGhlIGV4dGVuZGVkIHRhcmdldFxuICovXG5tb2R1bGUuZXhwb3J0cy5ub25FbnVtID0gZnVuY3Rpb24gZXh0ZW5kTm9uRW51bSh0YXJnZXQgLyosIHNvdXJjZXMgKi8pIHtcbiAgICB2YXIgc291cmNlcyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7XG5cbiAgICByZXR1cm4gZXh0ZW5kQ29tbW9uKHRhcmdldCwgc291cmNlcywgZnVuY3Rpb24gY29weVByb3BlcnR5KGRlc3QsIHNvdXJjZSwgcHJvcCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzdCwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IHNvdXJjZVtwcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBpbnNwZWN0ID0gcmVxdWlyZShcInV0aWxcIikuaW5zcGVjdDtcbnZhciBjdXN0b21Gb3JtYXR0ZXI7XG5cbmZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgICBpZiAoY3VzdG9tRm9ybWF0dGVyKSB7XG4gICAgICAgIHJldHVybiBjdXN0b21Gb3JtYXR0ZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zcGVjdC5hcHBseShpbnNwZWN0LCBhcmd1bWVudHMpO1xufVxuXG5mb3JtYXQuc2V0Rm9ybWF0dGVyID0gZnVuY3Rpb24oYUN1c3RvbUZvcm1hdHRlcikge1xuICAgIGlmICh0eXBlb2YgYUN1c3RvbUZvcm1hdHRlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZvcm1hdC5zZXRGb3JtYXR0ZXIgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGN1c3RvbUZvcm1hdHRlciA9IGFDdXN0b21Gb3JtYXR0ZXI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZvcm1hdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBpLCBwcm9wLCB0aGlzVmFsdWU7XG4gICAgaWYgKHRoaXMuZ2V0Q2FsbCAmJiB0aGlzLmNhbGxDb3VudCkge1xuICAgICAgICBpID0gdGhpcy5jYWxsQ291bnQ7XG5cbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgdGhpc1ZhbHVlID0gdGhpcy5nZXRDYWxsKGkpLnRoaXNWYWx1ZTtcblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgICAgICAgZm9yIChwcm9wIGluIHRoaXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVmFsdWVbcHJvcF0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBuby1vcCAtIGFjY2Vzc2luZyBwcm9wcyBjYW4gdGhyb3cgYW4gZXJyb3IsIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lIHx8IFwic2lub24gZmFrZVwiO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCA6IG5vdCB0ZXN0aW5nIHRoYXQgc2V0VGltZW91dCB3b3JrcyAqL1xuZnVuY3Rpb24gbmV4dFRpY2soY2FsbGJhY2spIHtcbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXROZXh0VGljayhwcm9jZXNzLCBzZXRJbW1lZGlhdGUpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHByb2Nlc3MubmV4dFRpY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljaztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRUaWNrO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgdmFyIHByb3RvID0gb2JqZWN0O1xuICAgIHZhciBkZXNjcmlwdG9yO1xuICAgIHZhciBpc093biA9IEJvb2xlYW4ob2JqZWN0ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkpO1xuXG4gICAgd2hpbGUgKHByb3RvICYmICEoZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3BlcnR5KSkpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgIGRlc2NyaXB0b3IuaXNPd24gPSBpc093bjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBWZXJpZnkgaWYgYW4gb2JqZWN0IGlzIGEgRUNNQVNjcmlwdCBNb2R1bGVcbiAqXG4gKiBBcyB0aGUgZXhwb3J0cyBmcm9tIGEgbW9kdWxlIGlzIGltbXV0YWJsZSB3ZSBjYW5ub3QgYWx0ZXIgdGhlIGV4cG9ydHNcbiAqIHVzaW5nIHNwaWVzIG9yIHN0dWJzLiBMZXQgdGhlIGNvbnN1bWVyIGtub3cgdGhpcyB0byBhdm9pZCBidWcgcmVwb3J0c1xuICogb24gd2VpcmQgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGV4YW1pbmVcbiAqXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSB3aGVuIHRoZSBvYmplY3QgaXMgYSBtb2R1bGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3QgJiYgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gXCJNb2R1bGVcIiAmJiBPYmplY3QuaXNTZWFsZWQob2JqZWN0KVxuICAgICk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQHBhcmFtIHsqfSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICogQHJldHVybnMgd2hldGhlciBhIHByb3AgZXhpc3RzIGluIHRoZSBwcm90b3R5cGUgY2hhaW5cbiAqL1xuZnVuY3Rpb24gaXNOb25FeGlzdGVudFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gb2JqZWN0ICYmIHR5cGVvZiBwcm9wZXJ0eSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKHByb3BlcnR5IGluIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOb25FeGlzdGVudFByb3BlcnR5O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi9nZXQtcHJvcGVydHktZGVzY3JpcHRvclwiKTtcblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmosIHByb3BOYW1lKSB7XG4gICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3BOYW1lKTtcblxuICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3IgPyBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlIDogdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3BlcnR5Q29uZmlndXJhYmxlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnbG9iYWxPYmplY3QgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5nbG9iYWw7XG52YXIgZ2V0TmV4dFRpY2sgPSByZXF1aXJlKFwiLi9nZXQtbmV4dC10aWNrXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5leHRUaWNrKGdsb2JhbE9iamVjdC5wcm9jZXNzLCBnbG9iYWxPYmplY3Quc2V0SW1tZWRpYXRlKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXkgPSBbbnVsbCwgXCJvbmNlXCIsIFwidHdpY2VcIiwgXCJ0aHJpY2VcIl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGltZXNJbldvcmRzKGNvdW50KSB7XG4gICAgcmV0dXJuIGFycmF5W2NvdW50XSB8fCAoY291bnQgfHwgMCkgKyBcIiB0aW1lc1wiO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xuXG5mdW5jdGlvbiB1c2VQcm9taXNlTGlicmFyeShsaWJyYXJ5LCBmYWtlcykge1xuICAgIGlmICh0eXBlb2YgbGlicmFyeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFrZXMpKSB7XG4gICAgICAgIGZvckVhY2guY2FsbChmYWtlcywgdXNlUHJvbWlzZUxpYnJhcnkuYmluZChudWxsLCBsaWJyYXJ5KSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmFrZXMudXNpbmdQcm9taXNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZmFrZXMudXNpbmdQcm9taXNlKGxpYnJhcnkpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1c2VQcm9taXNlTGlicmFyeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xuXG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgd2FsayA9IHJlcXVpcmUoXCIuL3dhbGtcIik7XG5cbmZ1bmN0aW9uIHdhbGtPYmplY3QocHJlZGljYXRlLCBvYmplY3QsIGZpbHRlcikge1xuICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgbmFtZSA9IGZ1bmN0aW9uTmFtZShwcmVkaWNhdGUpO1xuXG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIFwiICsgbmFtZSArIFwiIG9iamVjdCBidXQgcmVjZWl2ZWQgXCIgKyBTdHJpbmcob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgd2FsayhvYmplY3QsIGZ1bmN0aW9uKHByb3AsIHByb3BPd25lcikge1xuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHN0dWIgdGhpbmdzIGxpa2UgdG9TdHJpbmcoKSwgdmFsdWVPZigpLCBldGMuIHNvIHdlIG9ubHkgc3R1YiBpZiB0aGUgb2JqZWN0XG4gICAgICAgIC8vIGlzIG5vdCBPYmplY3QucHJvdG90eXBlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BPd25lciAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJlxuICAgICAgICAgICAgcHJvcCAhPT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BPd25lciwgcHJvcCkudmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKG9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlKG9iamVjdCwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByZWRpY2F0ZShvYmplY3QsIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB0byBcIiArIG5hbWUgKyBcIiBtZXRob2RzIG9uIG9iamVjdCBidXQgZm91bmQgbm9uZVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhbGtPYmplY3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGZvckVhY2ggPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmZvckVhY2g7XG5cbmZ1bmN0aW9uIHdhbGtJbnRlcm5hbChvYmosIGl0ZXJhdG9yLCBjb250ZXh0LCBvcmlnaW5hbE9iaiwgc2Vlbikge1xuICAgIHZhciBwcm90bywgcHJvcDtcblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gZW51bWVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBwcm90b3R5cGUncyBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSwgdGhlcmVmb3JlIHdlIGRlbGliZXJhdGVseSBsZWF2ZSBvdXQgYW4gb3duIHByb3BlcnR5IGNoZWNrLlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluICovXG4gICAgICAgIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW3Byb3BdLCBwcm9wLCBvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvckVhY2goT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKSwgZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoc2VlbltrXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2VlbltrXSA9IHRydWU7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrKS5nZXQgPT09IFwiZnVuY3Rpb25cIiA/IG9yaWdpbmFsT2JqIDogb2JqO1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBrLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgIGlmIChwcm90bykge1xuICAgICAgICB3YWxrSW50ZXJuYWwocHJvdG8sIGl0ZXJhdG9yLCBjb250ZXh0LCBvcmlnaW5hbE9iaiwgc2Vlbik7XG4gICAgfVxufVxuXG4vKiBXYWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCBhbmQgaXRlcmF0ZXMgb3ZlciBldmVyeSBvd24gcHJvcGVydHlcbiAqIG5hbWUgZW5jb3VudGVyZWQuIFRoZSBpdGVyYXRvciBpcyBjYWxsZWQgaW4gdGhlIHNhbWUgZmFzaGlvbiB0aGF0IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gKiB3b3Jrcywgd2hlcmUgaXQgaXMgcGFzc2VkIHRoZSB2YWx1ZSwga2V5LCBhbmQgb3duIG9iamVjdCBhcyB0aGUgMXN0LCAybmQsIGFuZCAzcmQgcG9zaXRpb25hbFxuICogYXJndW1lbnQsIHJlc3BlY3RpdmVseS4gSW4gY2FzZXMgd2hlcmUgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgaXMgbm90IGF2YWlsYWJsZSwgd2FsayB3aWxsXG4gKiBkZWZhdWx0IHRvIHVzaW5nIGEgc2ltcGxlIGZvci4uaW4gbG9vcC5cbiAqXG4gKiBvYmogLSBUaGUgb2JqZWN0IHRvIHdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiBmb3IuXG4gKiBpdGVyYXRvciAtIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBwYXNzIG9mIHRoZSB3YWxrLlxuICogY29udGV4dCAtIChPcHRpb25hbCkgV2hlbiBnaXZlbiwgdGhlIGl0ZXJhdG9yIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhpcyBvYmplY3QgYXMgdGhlIHJlY2VpdmVyLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdhbGsob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIHJldHVybiB3YWxrSW50ZXJuYWwob2JqLCBpdGVyYXRvciwgY29udGV4dCwgb2JqLCB7fSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi9nZXQtcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi9leHRlbmRcIik7XG52YXIgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiIHx8IEJvb2xlYW4ob2JqICYmIG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY2FsbCAmJiBvYmouYXBwbHkpO1xufVxuXG5mdW5jdGlvbiBtaXJyb3JQcm9wZXJ0aWVzKHRhcmdldCwgc291cmNlKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh0YXJnZXQsIHByb3ApKSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIENoZWFwIHdheSB0byBkZXRlY3QgaWYgd2UgaGF2ZSBFUzUgc3VwcG9ydC5cbnZhciBoYXNFUzVTdXBwb3J0ID0gXCJrZXlzXCIgaW4gT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgbWV0aG9kKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNob3VsZCB3cmFwIHByb3BlcnR5IG9mIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBtZXRob2QgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1ldGhvZCB3cmFwcGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9yIGEgcHJvcGVydHkgZGVzY3JpcHRvclwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCkge1xuICAgICAgICB2YXIgZXJyb3I7XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHdyYXBwZWRNZXRob2QpKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJBdHRlbXB0ZWQgdG8gd3JhcCBcIiArIHR5cGVvZiB3cmFwcGVkTWV0aG9kICsgXCIgcHJvcGVydHkgXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiIGFzIGZ1bmN0aW9uXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAod3JhcHBlZE1ldGhvZC5yZXN0b3JlICYmIHdyYXBwZWRNZXRob2QucmVzdG9yZS5zaW5vbikge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFwiQXR0ZW1wdGVkIHRvIHdyYXAgXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiIHdoaWNoIGlzIGFscmVhZHkgd3JhcHBlZFwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkTWV0aG9kLmNhbGxlZEJlZm9yZSkge1xuICAgICAgICAgICAgdmFyIHZlcmIgPSB3cmFwcGVkTWV0aG9kLnJldHVybnMgPyBcInN0dWJiZWRcIiA6IFwic3BpZWQgb25cIjtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgKyBcIiB3aGljaCBpcyBhbHJlYWR5IFwiICsgdmVyYik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh3cmFwcGVkTWV0aG9kICYmIHdyYXBwZWRNZXRob2Quc3RhY2tUcmFjZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Iuc3RhY2sgKz0gXCJcXG4tLS0tLS0tLS0tLS0tLVxcblwiICsgd3JhcHBlZE1ldGhvZC5zdGFja1RyYWNlRXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBlcnJvciwgd3JhcHBlZE1ldGhvZCwgaSwgd3JhcHBlZE1ldGhvZERlc2M7XG5cbiAgICBmdW5jdGlvbiBzaW1wbGVQcm9wZXJ0eUFzc2lnbm1lbnQoKSB7XG4gICAgICAgIHdyYXBwZWRNZXRob2QgPSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCk7XG4gICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBtZXRob2Q7XG4gICAgICAgIG1ldGhvZC5kaXNwbGF5TmFtZSA9IHByb3BlcnR5O1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggaGFzIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGhhc093bi5jYWxsIG9uIG9iamVjdHMgZnJvbSBvdGhlciBmcmFtZXMuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBzaW5vbmpzL25vLXByb3RvdHlwZS1tZXRob2RzL25vLXByb3RvdHlwZS1tZXRob2RzICovXG4gICAgdmFyIG93bmVkID0gb2JqZWN0Lmhhc093blByb3BlcnR5ID8gb2JqZWN0Lmhhc093blByb3BlcnR5KHByb3BlcnR5KSA6IGhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgaWYgKGhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgdmFyIG1ldGhvZERlc2MgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyB7IHZhbHVlOiBtZXRob2QgfSA6IG1ldGhvZDtcbiAgICAgICAgd3JhcHBlZE1ldGhvZERlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKCF3cmFwcGVkTWV0aG9kRGVzYykge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiQXR0ZW1wdGVkIHRvIHdyYXAgXCIgKyB0eXBlb2Ygd3JhcHBlZE1ldGhvZCArIFwiIHByb3BlcnR5IFwiICsgcHJvcGVydHkgKyBcIiBhcyBmdW5jdGlvblwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHdyYXBwZWRNZXRob2REZXNjLnJlc3RvcmUgJiYgd3JhcHBlZE1ldGhvZERlc2MucmVzdG9yZS5zaW5vbikge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFwiQXR0ZW1wdGVkIHRvIHdyYXAgXCIgKyBwcm9wZXJ0eSArIFwiIHdoaWNoIGlzIGFscmVhZHkgd3JhcHBlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh3cmFwcGVkTWV0aG9kRGVzYyAmJiB3cmFwcGVkTWV0aG9kRGVzYy5zdGFja1RyYWNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5zdGFjayArPSBcIlxcbi0tLS0tLS0tLS0tLS0tXFxuXCIgKyB3cmFwcGVkTWV0aG9kRGVzYy5zdGFja1RyYWNlRXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eXBlcyA9IE9iamVjdC5rZXlzKG1ldGhvZERlc2MpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHdyYXBwZWRNZXRob2QgPSB3cmFwcGVkTWV0aG9kRGVzY1t0eXBlc1tpXV07XG4gICAgICAgICAgICBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCk7XG4gICAgICAgIH1cblxuICAgICAgICBtaXJyb3JQcm9wZXJ0aWVzKG1ldGhvZERlc2MsIHdyYXBwZWRNZXRob2REZXNjKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtaXJyb3JQcm9wZXJ0aWVzKG1ldGhvZERlc2NbdHlwZXNbaV1dLCB3cmFwcGVkTWV0aG9kRGVzY1t0eXBlc1tpXV0pO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBtZXRob2REZXNjKTtcblxuICAgICAgICAvLyBjYXRjaCBmYWlsaW5nIGFzc2lnbm1lbnRcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY29udmVyc2Ugb2YgdGhlIGNoZWNrIGluIGAucmVzdG9yZWAgYmVsb3dcbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmplY3RbcHJvcGVydHldICE9PSBtZXRob2QpIHtcbiAgICAgICAgICAgIC8vIGNvcnJlY3QgYW55IHdyb25nZG9pbmdzIGNhdXNlZCBieSB0aGUgZGVmaW5lUHJvcGVydHkgY2FsbCBhYm92ZSxcbiAgICAgICAgICAgIC8vIHN1Y2ggYXMgYWRkaW5nIG5ldyBpdGVtcyAoaWYgb2JqZWN0IHdhcyBhIFN0b3JhZ2Ugb2JqZWN0KVxuICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICBzaW1wbGVQcm9wZXJ0eUFzc2lnbm1lbnQoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHNpbXBsZVByb3BlcnR5QXNzaWdubWVudCgpO1xuICAgIH1cblxuICAgIGV4dGVuZC5ub25FbnVtKG1ldGhvZCwge1xuICAgICAgICBkaXNwbGF5TmFtZTogcHJvcGVydHksXG5cbiAgICAgICAgd3JhcHBlZE1ldGhvZDogd3JhcHBlZE1ldGhvZCxcblxuICAgICAgICAvLyBTZXQgdXAgYW4gRXJyb3Igb2JqZWN0IGZvciBhIHN0YWNrIHRyYWNlIHdoaWNoIGNhbiBiZSB1c2VkIGxhdGVyIHRvIGZpbmQgd2hhdCBsaW5lIG9mXG4gICAgICAgIC8vIGNvZGUgdGhlIG9yaWdpbmFsIG1ldGhvZCB3YXMgY3JlYXRlZCBvbi5cbiAgICAgICAgc3RhY2tUcmFjZUVycm9yOiBuZXcgRXJyb3IoXCJTdGFjayBUcmFjZSBmb3Igb3JpZ2luYWxcIiksXG5cbiAgICAgICAgcmVzdG9yZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBGb3IgcHJvdG90eXBlIHByb3BlcnRpZXMgdHJ5IHRvIHJlc2V0IGJ5IGRlbGV0ZSBmaXJzdC5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgZmFpbHMgKGV4OiBsb2NhbFN0b3JhZ2Ugb24gbW9iaWxlIHNhZmFyaSkgdGhlbiBmb3JjZSBhIHJlc2V0XG4gICAgICAgICAgICAvLyB2aWEgZGlyZWN0IGFzc2lnbm1lbnQuXG4gICAgICAgICAgICBpZiAoIW93bmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyBgZGVsZXRlYCBtYXkgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgICAgICAgICAgLy8gRm9yIG5hdGl2ZSBjb2RlIGZ1bmN0aW9ucyBgZGVsZXRlYCBmYWlscyB3aXRob3V0IHRocm93aW5nIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gb24gQ2hyb21lIDwgNDMsIFBoYW50b21KUywgZXRjLlxuICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNFUzVTdXBwb3J0KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHdyYXBwZWRNZXRob2REZXNjKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlID09PSBtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IHdyYXBwZWRNZXRob2Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb24gdG8gY2hlY2sgZmFpbHVyZXMgdGhlbiBmb3JjZSBhIHJlc2V0XG4gICAgICAgICAgICAgICAgLy8gdmlhIGRpcmVjdCBhc3NpZ25tZW50LlxuICAgICAgICAgICAgICAgIGlmIChvYmplY3RbcHJvcGVydHldID09PSBtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IHdyYXBwZWRNZXRob2Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBtZXRob2QucmVzdG9yZS5zaW5vbiA9IHRydWU7XG5cbiAgICBpZiAoIWhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgbWlycm9yUHJvcGVydGllcyhtZXRob2QsIHdyYXBwZWRNZXRob2QpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2Q7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi9jb3JlL2V4dGVuZFwiKTtcbnZhciBGYWtlVGltZXJzID0gcmVxdWlyZShcIkBzaW5vbmpzL2Zha2UtdGltZXJzXCIpO1xudmFyIGdsb2JhbE9iamVjdCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmdsb2JhbDtcblxuZnVuY3Rpb24gY3JlYXRlQ2xvY2soY29uZmlnLCBnbG9iYWxDdHgpIHtcbiAgICB2YXIgRmFrZVRpbWVyc0N0eCA9IEZha2VUaW1lcnM7XG4gICAgaWYgKGdsb2JhbEN0eCAhPT0gbnVsbCAmJiB0eXBlb2YgZ2xvYmFsQ3R4ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIEZha2VUaW1lcnNDdHggPSBGYWtlVGltZXJzLndpdGhHbG9iYWwoZ2xvYmFsQ3R4KTtcbiAgICB9XG4gICAgdmFyIGNsb2NrID0gRmFrZVRpbWVyc0N0eC5pbnN0YWxsKGNvbmZpZyk7XG4gICAgY2xvY2sucmVzdG9yZSA9IGNsb2NrLnVuaW5zdGFsbDtcbiAgICByZXR1cm4gY2xvY2s7XG59XG5cbmZ1bmN0aW9uIGFkZElmRGVmaW5lZChvYmosIGdsb2JhbFByb3BOYW1lKSB7XG4gICAgdmFyIGdsb2JhbFByb3AgPSBnbG9iYWxPYmplY3RbZ2xvYmFsUHJvcE5hbWVdO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsUHJvcCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBvYmpbZ2xvYmFsUHJvcE5hbWVdID0gZ2xvYmFsUHJvcDtcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ8RGF0ZXxPYmplY3R9IGRhdGVPckNvbmZpZyBUaGUgdW5peCBlcG9jaCB2YWx1ZSB0byBpbnN0YWxsIHdpdGggKGRlZmF1bHQgMClcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBsb2xleCBjbG9jayBpbnN0YW5jZVxuICovXG5leHBvcnRzLnVzZUZha2VUaW1lcnMgPSBmdW5jdGlvbihkYXRlT3JDb25maWcpIHtcbiAgICB2YXIgaGFzQXJndW1lbnRzID0gdHlwZW9mIGRhdGVPckNvbmZpZyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB2YXIgYXJndW1lbnRJc0RhdGVMaWtlID1cbiAgICAgICAgKHR5cGVvZiBkYXRlT3JDb25maWcgPT09IFwibnVtYmVyXCIgfHwgZGF0ZU9yQ29uZmlnIGluc3RhbmNlb2YgRGF0ZSkgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMTtcbiAgICB2YXIgYXJndW1lbnRJc09iamVjdCA9IGRhdGVPckNvbmZpZyAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0ZU9yQ29uZmlnID09PSBcIm9iamVjdFwiICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDE7XG5cbiAgICBpZiAoIWhhc0FyZ3VtZW50cykge1xuICAgICAgICByZXR1cm4gY3JlYXRlQ2xvY2soe1xuICAgICAgICAgICAgbm93OiAwXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudElzRGF0ZUxpa2UpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNsb2NrKHtcbiAgICAgICAgICAgIG5vdzogZGF0ZU9yQ29uZmlnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudElzT2JqZWN0KSB7XG4gICAgICAgIHZhciBjb25maWcgPSBleHRlbmQubm9uRW51bSh7fSwgZGF0ZU9yQ29uZmlnKTtcbiAgICAgICAgdmFyIGdsb2JhbEN0eCA9IGNvbmZpZy5nbG9iYWw7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuZ2xvYmFsO1xuICAgICAgICByZXR1cm4gY3JlYXRlQ2xvY2soY29uZmlnLCBnbG9iYWxDdHgpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ1c2VGYWtlVGltZXJzIGV4cGVjdGVkIGVwb2NoIG9yIGNvbmZpZyBvYmplY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2lub25qcy9zaW5vblwiKTtcbn07XG5cbmV4cG9ydHMuY2xvY2sgPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbihub3cpIHtcbiAgICAgICAgcmV0dXJuIEZha2VUaW1lcnMuY3JlYXRlQ2xvY2sobm93KTtcbiAgICB9XG59O1xuXG52YXIgdGltZXJzID0ge1xuICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBjbGVhclRpbWVvdXQsXG4gICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgRGF0ZTogRGF0ZVxufTtcbmFkZElmRGVmaW5lZCh0aW1lcnMsIFwic2V0SW1tZWRpYXRlXCIpO1xuYWRkSWZEZWZpbmVkKHRpbWVycywgXCJjbGVhckltbWVkaWF0ZVwiKTtcblxuZXhwb3J0cy50aW1lcnMgPSB0aW1lcnM7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGV2ZXJ5ID0gcmVxdWlyZShcIi4vcHJvdG90eXBlcy9hcnJheVwiKS5ldmVyeTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBoYXNDYWxsc0xlZnQoY2FsbE1hcCwgc3B5KSB7XG4gICAgaWYgKGNhbGxNYXBbc3B5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbGxNYXBbc3B5LmlkXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGxNYXBbc3B5LmlkXSA8IHNweS5jYWxsQ291bnQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tBZGphY2VudENhbGxzKGNhbGxNYXAsIHNweSwgaW5kZXgsIHNwaWVzKSB7XG4gICAgdmFyIGNhbGxlZEJlZm9yZU5leHQgPSB0cnVlO1xuXG4gICAgaWYgKGluZGV4ICE9PSBzcGllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNhbGxlZEJlZm9yZU5leHQgPSBzcHkuY2FsbGVkQmVmb3JlKHNwaWVzW2luZGV4ICsgMV0pO1xuICAgIH1cblxuICAgIGlmIChoYXNDYWxsc0xlZnQoY2FsbE1hcCwgc3B5KSAmJiBjYWxsZWRCZWZvcmVOZXh0KSB7XG4gICAgICAgIGNhbGxNYXBbc3B5LmlkXSArPSAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQSBTaW5vbiBwcm94eSBvYmplY3QgKGZha2UsIHNweSwgc3R1YilcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaW5vblByb3h5XG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBjYWxsZWRCZWZvcmUgLSBBIG1ldGhvZCB0aGF0IGRldGVybWluZXMgaWYgdGhpcyBwcm94eSB3YXMgY2FsbGVkIGJlZm9yZSBhbm90aGVyIG9uZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU29tZSBpZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNhbGxDb3VudCAtIE51bWJlciBvZiB0aW1lcyB0aGlzIHByb3h5IGhhcyBiZWVuIGNhbGxlZFxuICovXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHNwaWVzIGhhdmUgYmVlbiBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzdXBwbGllZCBpblxuICpcbiAqIEBwYXJhbSAge1Npbm9uUHJveHlbXSB8IFNpbm9uUHJveHl9IHNwaWVzIEFuIGFycmF5IG9mIHByb3hpZXMsIG9yIHNldmVyYWwgcHJveGllcyBhcyBhcmd1bWVudHNcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHdoZW4gc3BpZXMgYXJlIGNhbGxlZCBpbiBvcmRlciwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGNhbGxlZEluT3JkZXIoc3BpZXMpIHtcbiAgICB2YXIgY2FsbE1hcCA9IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgIHZhciBfc3BpZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50cyA6IHNwaWVzO1xuXG4gICAgcmV0dXJuIGV2ZXJ5KF9zcGllcywgY2hlY2tBZGphY2VudENhbGxzLmJpbmQobnVsbCwgY2FsbE1hcCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbGxlZEluT3JkZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCIuL2Z1bmN0aW9uLW5hbWVcIik7XG5cbi8qKlxuICogUmV0dXJucyBhIGRpc3BsYXkgbmFtZSBmb3IgYSB2YWx1ZSBmcm9tIGEgY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IHZhbHVlIEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMgeyhzdHJpbmd8bnVsbCl9IEEgc3RyaW5nIG9yIG51bGxcbiAqL1xuZnVuY3Rpb24gY2xhc3NOYW1lKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHx8XG4gICAgICAgIC8vIFRoZSBuZXh0IGJyYW5jaCBpcyBmb3IgSUUxMSBzdXBwb3J0IG9ubHk6XG4gICAgICAgIC8vIEJlY2F1c2UgdGhlIG5hbWUgcHJvcGVydHkgaXMgbm90IHNldCBvbiB0aGUgcHJvdG90eXBlXG4gICAgICAgIC8vIG9mIHRoZSBGdW5jdGlvbiBvYmplY3QsIHdlIGZpbmFsbHkgdHJ5IHRvIGdyYWIgdGhlXG4gICAgICAgIC8vIG5hbWUgZnJvbSBpdHMgZGVmaW5pdGlvbi4gVGhpcyB3aWxsIG5ldmVyIGJlIHJlYWNoZWRcbiAgICAgICAgLy8gaW4gbm9kZSwgc28gd2UgYXJlIG5vdCBhYmxlIHRvIHRlc3QgdGhpcyBwcm9wZXJseS5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZVxuICAgICAgICAodHlwZW9mIHZhbHVlLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWUodmFsdWUuY29uc3RydWN0b3IpKSB8fFxuICAgICAgICBudWxsXG4gICAgKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWU7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGludm9rZSB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gYW5kIHByaW50IGFcbiAqIGRlcHJlY2F0aW9uIHdhcm5pbmcgdG8gdGhlIGNvbnNvbGUgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZnVuY1xuICogQHBhcmFtICB7c3RyaW5nfSBtc2dcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0cy53cmFwID0gZnVuY3Rpb24oZnVuYywgbXNnKSB7XG4gICAgdmFyIHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZXhwb3J0cy5wcmludFdhcm5pbmcobXNnKTtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIGlmIChmdW5jLnByb3RvdHlwZSkge1xuICAgICAgICB3cmFwcGVkLnByb3RvdHlwZSA9IGZ1bmMucHJvdG90eXBlO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gYHdyYXAoKWAgdG8gbm90aWZ5IHRoZSB1c2VyIHRoYXQgYVxuICogcGFydGljdWxhciBwYXJ0IG9mIHRoZSBzaW5vbiBBUEkgaGFzIGJlZW4gZGVwcmVjYXRlZC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHBhY2thZ2VOYW1lXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZ1bmNOYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnRzLmRlZmF1bHRNc2cgPSBmdW5jdGlvbihwYWNrYWdlTmFtZSwgZnVuY05hbWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBwYWNrYWdlTmFtZSArXG4gICAgICAgIFwiLlwiICtcbiAgICAgICAgZnVuY05hbWUgK1xuICAgICAgICBcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgcHVibGljIEFQSSBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFwiICtcbiAgICAgICAgcGFja2FnZU5hbWUgK1xuICAgICAgICBcIi5cIlxuICAgICk7XG59O1xuXG4vKipcbiAqIFByaW50cyBhIHdhcm5pbmcgb24gdGhlIGNvbnNvbGUsIHdoZW4gaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBtc2dcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydHMucHJpbnRXYXJuaW5nID0gZnVuY3Rpb24obXNnKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy5lbWl0V2FybmluZykge1xuICAgICAgICAvLyBFbWl0IFdhcm5pbmdzIGluIE5vZGVcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtc2cpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZS5pbmZvKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtc2cpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGZuIHJldHVybnMgdHJ1ZSBmb3IgYWxsIG1lbWJlcnMgb2Ygb2JqLlxuICogVGhpcyBpcyBhbiBldmVyeSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdvcmtzIGZvciBhbGwgaXRlcmFibGVzXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgIG9ialxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBldmVyeShvYmosIGZuKSB7XG4gICAgdmFyIHBhc3MgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGxvY2FsLXJ1bGVzL25vLXByb3RvdHlwZS1tZXRob2RzICovXG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCFmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3dpbmcgYW4gZXJyb3IgaXMgdGhlIG9ubHkgd2F5IHRvIGJyZWFrIGBmb3JFYWNoYFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFzcztcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZGlzcGxheSBuYW1lIGZvciBhIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZ1bmNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnVuY3Rpb25OYW1lKGZ1bmMpIHtcbiAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGZ1bmMuZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICAgIGZ1bmMubmFtZSB8fFxuICAgICAgICAgICAgLy8gVXNlIGZ1bmN0aW9uIGRlY29tcG9zaXRpb24gYXMgYSBsYXN0IHJlc29ydCB0byBnZXQgZnVuY3Rpb25cbiAgICAgICAgICAgIC8vIG5hbWUuIERvZXMgbm90IHJlbHkgb24gZnVuY3Rpb24gZGVjb21wb3NpdGlvbiB0byB3b3JrIC0gaWYgaXRcbiAgICAgICAgICAgIC8vIGRvZXNuJ3QgZGVidWdnaW5nIHdpbGwgYmUgc2xpZ2h0bHkgbGVzcyBpbmZvcm1hdGl2ZVxuICAgICAgICAgICAgLy8gKGkuZS4gdG9TdHJpbmcgd2lsbCBzYXkgJ3NweScgcmF0aGVyIHRoYW4gJ215RnVuYycpLlxuICAgICAgICAgICAgKFN0cmluZyhmdW5jKS5tYXRjaCgvZnVuY3Rpb24gKFteXFxzKF0rKS8pIHx8IFtdKVsxXVxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU3RyaW5naWZ5IG1heSBmYWlsIGFuZCB3ZSBtaWdodCBnZXQgYW4gZXhjZXB0aW9uLCBhcyBhIGxhc3QtbGFzdFxuICAgICAgICAvLyByZXNvcnQgZmFsbCBiYWNrIHRvIGVtcHR5IHN0cmluZy5cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG4gKlxuICogQHR5cGUge29iamVjdH0gZ2xvYmFsT2JqZWN0XG4gKi9cbnZhciBnbG9iYWxPYmplY3Q7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5pZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIE5vZGVcbiAgICBnbG9iYWxPYmplY3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAvLyBCcm93c2VyXG4gICAgZ2xvYmFsT2JqZWN0ID0gd2luZG93O1xufSBlbHNlIHtcbiAgICAvLyBXZWJXb3JrZXJcbiAgICBnbG9iYWxPYmplY3QgPSBzZWxmO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbE9iamVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBnbG9iYWw6IHJlcXVpcmUoXCIuL2dsb2JhbFwiKSxcbiAgICBjYWxsZWRJbk9yZGVyOiByZXF1aXJlKFwiLi9jYWxsZWQtaW4tb3JkZXJcIiksXG4gICAgY2xhc3NOYW1lOiByZXF1aXJlKFwiLi9jbGFzcy1uYW1lXCIpLFxuICAgIGRlcHJlY2F0ZWQ6IHJlcXVpcmUoXCIuL2RlcHJlY2F0ZWRcIiksXG4gICAgZXZlcnk6IHJlcXVpcmUoXCIuL2V2ZXJ5XCIpLFxuICAgIGZ1bmN0aW9uTmFtZTogcmVxdWlyZShcIi4vZnVuY3Rpb24tbmFtZVwiKSxcbiAgICBvcmRlckJ5Rmlyc3RDYWxsOiByZXF1aXJlKFwiLi9vcmRlci1ieS1maXJzdC1jYWxsXCIpLFxuICAgIHByb3RvdHlwZXM6IHJlcXVpcmUoXCIuL3Byb3RvdHlwZXNcIiksXG4gICAgdHlwZU9mOiByZXF1aXJlKFwiLi90eXBlLW9mXCIpLFxuICAgIHZhbHVlVG9TdHJpbmc6IHJlcXVpcmUoXCIuL3ZhbHVlLXRvLXN0cmluZ1wiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc29ydCA9IHJlcXVpcmUoXCIuL3Byb3RvdHlwZXMvYXJyYXlcIikuc29ydDtcbnZhciBzbGljZSA9IHJlcXVpcmUoXCIuL3Byb3RvdHlwZXMvYXJyYXlcIikuc2xpY2U7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29tcGFyYXRvcihhLCBiKSB7XG4gICAgLy8gdXVpZCwgd29uJ3QgZXZlciBiZSBlcXVhbFxuICAgIHZhciBhQ2FsbCA9IGEuZ2V0Q2FsbCgwKTtcbiAgICB2YXIgYkNhbGwgPSBiLmdldENhbGwoMCk7XG4gICAgdmFyIGFJZCA9IChhQ2FsbCAmJiBhQ2FsbC5jYWxsSWQpIHx8IC0xO1xuICAgIHZhciBiSWQgPSAoYkNhbGwgJiYgYkNhbGwuY2FsbElkKSB8fCAtMTtcblxuICAgIHJldHVybiBhSWQgPCBiSWQgPyAtMSA6IDE7XG59XG5cbi8qKlxuICogQSBTaW5vbiBwcm94eSBvYmplY3QgKGZha2UsIHNweSwgc3R1YilcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaW5vblByb3h5XG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRDYWxsIC0gQSBtZXRob2QgdGhhdCBjYW4gcmV0dXJuIHRoZSBmaXJzdCBjYWxsXG4gKi9cblxuLyoqXG4gKiBTb3J0cyBhbiBhcnJheSBvZiBTaW5vblByb3h5IGluc3RhbmNlcyAoZmFrZSwgc3B5LCBzdHViKSBieSB0aGVpciBmaXJzdCBjYWxsXG4gKlxuICogQHBhcmFtICB7U2lub25Qcm94eVtdIHwgU2lub25Qcm94eX0gc3BpZXNcbiAqIEByZXR1cm5zIHtTaW5vblByb3h5W119XG4gKi9cbmZ1bmN0aW9uIG9yZGVyQnlGaXJzdENhbGwoc3BpZXMpIHtcbiAgICByZXR1cm4gc29ydChzbGljZShzcGllcyksIGNvbXBhcmF0b3IpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9yZGVyQnlGaXJzdENhbGw7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvcHlQcm90b3R5cGUgPSByZXF1aXJlKFwiLi9jb3B5LXByb3RvdHlwZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5UHJvdG90eXBlKEFycmF5LnByb3RvdHlwZSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvcHlQcm90b3R5cGVNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIGxvY2FsLXJ1bGVzL25vLXByb3RvdHlwZS1tZXRob2RzICovXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwgbmFtZSkge1xuICAgICAgICAvLyBpZ25vcmUgc2l6ZSBiZWNhdXNlIGl0IHRocm93cyBmcm9tIE1hcFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBuYW1lICE9PSBcInNpemVcIiAmJlxuICAgICAgICAgICAgbmFtZSAhPT0gXCJjYWxsZXJcIiAmJlxuICAgICAgICAgICAgbmFtZSAhPT0gXCJjYWxsZWVcIiAmJlxuICAgICAgICAgICAgbmFtZSAhPT0gXCJhcmd1bWVudHNcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHByb3RvdHlwZVtuYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gY2FsbC5iaW5kKHByb3RvdHlwZVtuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlQcm90b3R5cGUoRnVuY3Rpb24ucHJvdG90eXBlKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheTogcmVxdWlyZShcIi4vYXJyYXlcIiksXG4gICAgZnVuY3Rpb246IHJlcXVpcmUoXCIuL2Z1bmN0aW9uXCIpLFxuICAgIG1hcDogcmVxdWlyZShcIi4vbWFwXCIpLFxuICAgIG9iamVjdDogcmVxdWlyZShcIi4vb2JqZWN0XCIpLFxuICAgIHNldDogcmVxdWlyZShcIi4vc2V0XCIpLFxuICAgIHN0cmluZzogcmVxdWlyZShcIi4vc3RyaW5nXCIpXG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb3B5UHJvdG90eXBlID0gcmVxdWlyZShcIi4vY29weS1wcm90b3R5cGVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVByb3RvdHlwZShNYXAucHJvdG90eXBlKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlQcm90b3R5cGUoT2JqZWN0LnByb3RvdHlwZSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvcHlQcm90b3R5cGUgPSByZXF1aXJlKFwiLi9jb3B5LXByb3RvdHlwZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5UHJvdG90eXBlKFNldC5wcm90b3R5cGUpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb3B5UHJvdG90eXBlID0gcmVxdWlyZShcIi4vY29weS1wcm90b3R5cGVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVByb3RvdHlwZShTdHJpbmcucHJvdG90eXBlKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdHlwZSA9IHJlcXVpcmUoXCJ0eXBlLWRldGVjdFwiKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIHJlc3VsdCBvZiBydW5uaW5nIHR5cGUgZnJvbSB0eXBlLWRldGVjdCBvbiB0aGUgdmFsdWVcbiAqXG4gKiBAcGFyYW0gIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0eXBlT2YodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZSh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZVxuICpcbiAqIEBwYXJhbSAgeyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB2YWx1ZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLnRvU3RyaW5nKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVUb1N0cmluZztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2xvYmFsT2JqZWN0ID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZ2xvYmFsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gd2l0aEdsb2JhbChfZ2xvYmFsKSB7XG4gICAgdmFyIHVzZXJBZ2VudCA9IF9nbG9iYWwubmF2aWdhdG9yICYmIF9nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICB2YXIgaXNSdW5uaW5nSW5JRSA9IHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5kZXhPZihcIk1TSUUgXCIpID4gLTE7XG4gICAgdmFyIG1heFRpbWVvdXQgPSBNYXRoLnBvdygyLCAzMSkgLSAxOyAvL3NlZSBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNhYnN0cmFjdC1vcGRlZi1jb252ZXJ0dG9pbnRcbiAgICB2YXIgTk9PUCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdmFyIE5PT1BfQVJSQVkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gICAgdmFyIHRpbWVvdXRSZXN1bHQgPSBfZ2xvYmFsLnNldFRpbWVvdXQoTk9PUCwgMCk7XG4gICAgdmFyIGFkZFRpbWVyUmV0dXJuc09iamVjdCA9IHR5cGVvZiB0aW1lb3V0UmVzdWx0ID09PSBcIm9iamVjdFwiO1xuICAgIHZhciBocnRpbWVQcmVzZW50ID1cbiAgICAgICAgX2dsb2JhbC5wcm9jZXNzICYmIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MuaHJ0aW1lID09PSBcImZ1bmN0aW9uXCI7XG4gICAgdmFyIGhydGltZUJpZ2ludFByZXNlbnQgPVxuICAgICAgICBocnRpbWVQcmVzZW50ICYmIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MuaHJ0aW1lLmJpZ2ludCA9PT0gXCJmdW5jdGlvblwiO1xuICAgIHZhciBuZXh0VGlja1ByZXNlbnQgPVxuICAgICAgICBfZ2xvYmFsLnByb2Nlc3MgJiYgdHlwZW9mIF9nbG9iYWwucHJvY2Vzcy5uZXh0VGljayA9PT0gXCJmdW5jdGlvblwiO1xuICAgIHZhciB1dGlsUHJvbWlzaWZ5ID0gX2dsb2JhbC5wcm9jZXNzICYmIHJlcXVpcmUoXCJ1dGlsXCIpLnByb21pc2lmeTtcbiAgICB2YXIgcGVyZm9ybWFuY2VQcmVzZW50ID1cbiAgICAgICAgX2dsb2JhbC5wZXJmb3JtYW5jZSAmJiB0eXBlb2YgX2dsb2JhbC5wZXJmb3JtYW5jZS5ub3cgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB2YXIgaGFzUGVyZm9ybWFuY2VQcm90b3R5cGUgPVxuICAgICAgICBfZ2xvYmFsLlBlcmZvcm1hbmNlICYmXG4gICAgICAgICh0eXBlb2YgX2dsb2JhbC5QZXJmb3JtYW5jZSkubWF0Y2goL14oZnVuY3Rpb258b2JqZWN0KSQvKTtcbiAgICB2YXIgcXVldWVNaWNyb3Rhc2tQcmVzZW50ID0gX2dsb2JhbC5oYXNPd25Qcm9wZXJ0eShcInF1ZXVlTWljcm90YXNrXCIpO1xuICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWVQcmVzZW50ID1cbiAgICAgICAgX2dsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiZcbiAgICAgICAgdHlwZW9mIF9nbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSBcImZ1bmN0aW9uXCI7XG4gICAgdmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lUHJlc2VudCA9XG4gICAgICAgIF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgJiZcbiAgICAgICAgdHlwZW9mIF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB2YXIgcmVxdWVzdElkbGVDYWxsYmFja1ByZXNlbnQgPVxuICAgICAgICBfZ2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2sgJiZcbiAgICAgICAgdHlwZW9mIF9nbG9iYWwucmVxdWVzdElkbGVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiO1xuICAgIHZhciBjYW5jZWxJZGxlQ2FsbGJhY2tQcmVzZW50ID1cbiAgICAgICAgX2dsb2JhbC5jYW5jZWxJZGxlQ2FsbGJhY2sgJiZcbiAgICAgICAgdHlwZW9mIF9nbG9iYWwuY2FuY2VsSWRsZUNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCI7XG4gICAgdmFyIHNldEltbWVkaWF0ZVByZXNlbnQgPVxuICAgICAgICBfZ2xvYmFsLnNldEltbWVkaWF0ZSAmJiB0eXBlb2YgX2dsb2JhbC5zZXRJbW1lZGlhdGUgPT09IFwiZnVuY3Rpb25cIjtcblxuICAgIC8vIE1ha2UgcHJvcGVydGllcyB3cml0YWJsZSBpbiBJRSwgYXMgcGVyXG4gICAgLy8gaHR0cDovL3d3dy5hZGVxdWF0ZWx5Z29vZC5jb20vUmVwbGFjaW5nLXNldFRpbWVvdXQtR2xvYmFsbHkuaHRtbFxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduICovXG4gICAgaWYgKGlzUnVubmluZ0luSUUpIHtcbiAgICAgICAgX2dsb2JhbC5zZXRUaW1lb3V0ID0gX2dsb2JhbC5zZXRUaW1lb3V0O1xuICAgICAgICBfZ2xvYmFsLmNsZWFyVGltZW91dCA9IF9nbG9iYWwuY2xlYXJUaW1lb3V0O1xuICAgICAgICBfZ2xvYmFsLnNldEludGVydmFsID0gX2dsb2JhbC5zZXRJbnRlcnZhbDtcbiAgICAgICAgX2dsb2JhbC5jbGVhckludGVydmFsID0gX2dsb2JhbC5jbGVhckludGVydmFsO1xuICAgICAgICBfZ2xvYmFsLkRhdGUgPSBfZ2xvYmFsLkRhdGU7XG4gICAgfVxuXG4gICAgLy8gc2V0SW1tZWRpYXRlIGlzIG5vdCBhIHN0YW5kYXJkIGZ1bmN0aW9uXG4gICAgLy8gYXZvaWQgYWRkaW5nIHRoZSBwcm9wIHRvIHRoZSB3aW5kb3cgb2JqZWN0IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKHNldEltbWVkaWF0ZVByZXNlbnQpIHtcbiAgICAgICAgX2dsb2JhbC5zZXRJbW1lZGlhdGUgPSBfZ2xvYmFsLnNldEltbWVkaWF0ZTtcbiAgICAgICAgX2dsb2JhbC5jbGVhckltbWVkaWF0ZSA9IF9nbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1hc3NpZ24gKi9cblxuICAgIF9nbG9iYWwuY2xlYXJUaW1lb3V0KHRpbWVvdXRSZXN1bHQpO1xuXG4gICAgdmFyIE5hdGl2ZURhdGUgPSBfZ2xvYmFsLkRhdGU7XG4gICAgdmFyIHVuaXF1ZVRpbWVySWQgPSAxO1xuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXJGaW5pdGUobnVtKSB7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBzdHJpbmdzIGxpa2UgXCIwMToxMDowMFwiIChtZWFuaW5nIDEgaG91ciwgMTAgbWludXRlcywgMCBzZWNvbmRzKSBpbnRvXG4gICAgICogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgaHVtYW4tcmVhZGFibGUgc3RyaW5ncyBwYXNzZWRcbiAgICAgKiB0byBjbG9jay50aWNrKClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZVRpbWUoc3RyKSB7XG4gICAgICAgIGlmICghc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdHJpbmdzID0gc3RyLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgdmFyIGwgPSBzdHJpbmdzLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSBsO1xuICAgICAgICB2YXIgbXMgPSAwO1xuICAgICAgICB2YXIgcGFyc2VkO1xuXG4gICAgICAgIGlmIChsID4gMyB8fCAhL14oXFxkXFxkOil7MCwyfVxcZFxcZD8kLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcInRpY2sgb25seSB1bmRlcnN0YW5kcyBudW1iZXJzLCAnbTpzJyBhbmQgJ2g6bTpzJy4gRWFjaCBwYXJ0IG11c3QgYmUgdHdvIGRpZ2l0c1wiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nc1tpXSwgMTApO1xuXG4gICAgICAgICAgICBpZiAocGFyc2VkID49IDYwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0aW1lIFwiICsgc3RyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXMgKz0gcGFyc2VkICogTWF0aC5wb3coNjAsIGwgLSBpIC0gMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXMgKiAxMDAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVjaW1hbCBwYXJ0IG9mIHRoZSBtaWxsaXNlY29uZCB2YWx1ZSBhcyBuYW5vc2Vjb25kc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1zRmxvYXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBhbiBpbnRlZ2VyIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpbiB0aGUgcmFuZ2UgWzAsMWU2KVxuICAgICAqXG4gICAgICogRXhhbXBsZTogbmFub1JlbWFpbmVyKDEyMy40NTY3ODkpIC0+IDQ1Njc4OVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hbm9SZW1haW5kZXIobXNGbG9hdCkge1xuICAgICAgICB2YXIgbW9kdWxvID0gMWU2O1xuICAgICAgICB2YXIgcmVtYWluZGVyID0gKG1zRmxvYXQgKiAxZTYpICUgbW9kdWxvO1xuICAgICAgICB2YXIgcG9zaXRpdmVSZW1haW5kZXIgPSByZW1haW5kZXIgPCAwID8gcmVtYWluZGVyICsgbW9kdWxvIDogcmVtYWluZGVyO1xuXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHBvc2l0aXZlUmVtYWluZGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGdyb2sgdGhlIGBub3dgIHBhcmFtZXRlciB0byBjcmVhdGVDbG9jay5cbiAgICAgKiBAcGFyYW0gZXBvY2gge0RhdGV8bnVtYmVyfSB0aGUgc3lzdGVtIHRpbWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRFcG9jaChlcG9jaCkge1xuICAgICAgICBpZiAoIWVwb2NoKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVwb2NoLmdldFRpbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGVwb2NoLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVwb2NoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm5vdyBzaG91bGQgYmUgbWlsbGlzZWNvbmRzIHNpbmNlIFVOSVggZXBvY2hcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5SYW5nZShmcm9tLCB0bywgdGltZXIpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVyICYmIHRpbWVyLmNhbGxBdCA+PSBmcm9tICYmIHRpbWVyLmNhbGxBdCA8PSB0bztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXJyb3JEYXRlUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzcGVjaWFsIG5vdyBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAoc291cmNlLm5vdykge1xuICAgICAgICAgICAgdGFyZ2V0Lm5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmNsb2NrLm5vdztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0Lm5vdztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzcGVjaWFsIHRvU291cmNlIGltcGxlbWVudGF0aW9uXG4gICAgICAgIGlmIChzb3VyY2UudG9Tb3VyY2UpIHtcbiAgICAgICAgICAgIHRhcmdldC50b1NvdXJjZSA9IGZ1bmN0aW9uIHRvU291cmNlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UudG9Tb3VyY2UoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0LnRvU291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IHNwZWNpYWwgdG9TdHJpbmcgaW1wbGVtZW50YXRpb25cbiAgICAgICAgdGFyZ2V0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSA9IHNvdXJjZS5wcm90b3R5cGU7XG4gICAgICAgIHRhcmdldC5wYXJzZSA9IHNvdXJjZS5wYXJzZTtcbiAgICAgICAgdGFyZ2V0LlVUQyA9IHNvdXJjZS5VVEM7XG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUudG9VVENTdHJpbmcgPSBzb3VyY2UucHJvdG90eXBlLnRvVVRDU3RyaW5nO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGF0ZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gQ2xvY2tEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbXMpIHtcbiAgICAgICAgICAgIC8vIHRoZSBEYXRlIGNvbnN0cnVjdG9yIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCByZWYgRWNtYS0yNjIgRWRpdGlvbiA1LjEsIHNlY3Rpb24gMTUuOS4yLlxuICAgICAgICAgICAgLy8gVGhpcyByZW1haW5zIHNvIGluIHRoZSAxMHRoIGVkaXRpb24gb2YgMjAxOSBhcyB3ZWxsLlxuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENsb2NrRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoQ2xvY2tEYXRlLmNsb2NrLm5vdykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgRGF0ZSBpcyBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvciB3aXRoICduZXcnIGtleXdvcmRcbiAgICAgICAgICAgIC8vIERlZmVuc2l2ZSBhbmQgdmVyYm9zZSB0byBhdm9pZCBwb3RlbnRpYWwgaGFybSBpbiBwYXNzaW5nXG4gICAgICAgICAgICAvLyBleHBsaWNpdCB1bmRlZmluZWQgd2hlbiB1c2VyIGRvZXMgbm90IHBhc3MgYXJndW1lbnRcbiAgICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKENsb2NrRGF0ZS5jbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIpO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoKTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIpO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW51dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlycm9yRGF0ZVByb3BlcnRpZXMoQ2xvY2tEYXRlLCBOYXRpdmVEYXRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlSm9iKGNsb2NrLCBqb2IpIHtcbiAgICAgICAgLy8gZW5xdWV1ZXMgYSBtaWNyb3RpY2stZGVmZXJyZWQgdGFzayAtIGVjbWEyNjIvI3NlYy1lbnF1ZXVlam9iXG4gICAgICAgIGlmICghY2xvY2suam9icykge1xuICAgICAgICAgICAgY2xvY2suam9icyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNsb2NrLmpvYnMucHVzaChqb2IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bkpvYnMoY2xvY2spIHtcbiAgICAgICAgLy8gcnVucyBhbGwgbWljcm90aWNrLWRlZmVycmVkIHRhc2tzIC0gZWNtYTI2Mi8jc2VjLXJ1bmpvYnNcbiAgICAgICAgaWYgKCFjbG9jay5qb2JzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9jay5qb2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgam9iID0gY2xvY2suam9ic1tpXTtcbiAgICAgICAgICAgIGpvYi5mdW5jLmFwcGx5KG51bGwsIGpvYi5hcmdzKTtcbiAgICAgICAgICAgIGlmIChjbG9jay5sb29wTGltaXQgJiYgaSA+IGNsb2NrLmxvb3BMaW1pdCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJBYm9ydGluZyBhZnRlciBydW5uaW5nIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmxvb3BMaW1pdCArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiB0aW1lcnMsIGFzc3VtaW5nIGFuIGluZmluaXRlIGxvb3AhXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNsb2NrLmpvYnMgPSBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUaW1lcihjbG9jaywgdGltZXIpIHtcbiAgICAgICAgaWYgKHRpbWVyLmZ1bmMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZCB0byB0aW1lciBjYWxsc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWVyLnR5cGUgPSB0aW1lci5pbW1lZGlhdGUgPyBcIkltbWVkaWF0ZVwiIDogXCJUaW1lb3V0XCI7XG5cbiAgICAgICAgaWYgKHRpbWVyLmhhc093blByb3BlcnR5KFwiZGVsYXlcIikpIHtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXJGaW5pdGUodGltZXIuZGVsYXkpKSB7XG4gICAgICAgICAgICAgICAgdGltZXIuZGVsYXkgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXIuZGVsYXkgPSB0aW1lci5kZWxheSA+IG1heFRpbWVvdXQgPyAxIDogdGltZXIuZGVsYXk7XG4gICAgICAgICAgICB0aW1lci5kZWxheSA9IE1hdGgubWF4KDAsIHRpbWVyLmRlbGF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lci5oYXNPd25Qcm9wZXJ0eShcImludGVydmFsXCIpKSB7XG4gICAgICAgICAgICB0aW1lci50eXBlID0gXCJJbnRlcnZhbFwiO1xuICAgICAgICAgICAgdGltZXIuaW50ZXJ2YWwgPSB0aW1lci5pbnRlcnZhbCA+IG1heFRpbWVvdXQgPyAxIDogdGltZXIuaW50ZXJ2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGltZXIuaGFzT3duUHJvcGVydHkoXCJhbmltYXRpb25cIikpIHtcbiAgICAgICAgICAgIHRpbWVyLnR5cGUgPSBcIkFuaW1hdGlvbkZyYW1lXCI7XG4gICAgICAgICAgICB0aW1lci5hbmltYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgIGNsb2NrLnRpbWVycyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZXIuaWQgPSB1bmlxdWVUaW1lcklkKys7XG4gICAgICAgIHRpbWVyLmNyZWF0ZWRBdCA9IGNsb2NrLm5vdztcbiAgICAgICAgdGltZXIuY2FsbEF0ID1cbiAgICAgICAgICAgIGNsb2NrLm5vdyArIChwYXJzZUludCh0aW1lci5kZWxheSkgfHwgKGNsb2NrLmR1cmluZ1RpY2sgPyAxIDogMCkpO1xuXG4gICAgICAgIGNsb2NrLnRpbWVyc1t0aW1lci5pZF0gPSB0aW1lcjtcblxuICAgICAgICBpZiAoYWRkVGltZXJSZXR1cm5zT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVzID0ge1xuICAgICAgICAgICAgICAgIGlkOiB0aW1lci5pZCxcbiAgICAgICAgICAgICAgICByZWY6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdW5yZWY6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGltZXIuaWQ7XG4gICAgfVxuXG4gICAgLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIm9mZlwiICovXG4gICAgZnVuY3Rpb24gY29tcGFyZVRpbWVycyhhLCBiKSB7XG4gICAgICAgIC8vIFNvcnQgZmlyc3QgYnkgYWJzb2x1dGUgdGltaW5nXG4gICAgICAgIGlmIChhLmNhbGxBdCA8IGIuY2FsbEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY2FsbEF0ID4gYi5jYWxsQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGltbWVkaWF0ZSwgaW1tZWRpYXRlIHRpbWVycyB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKGEuaW1tZWRpYXRlICYmICFiLmltbWVkaWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYS5pbW1lZGlhdGUgJiYgYi5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGNyZWF0aW9uIHRpbWUsIGVhcmxpZXItY3JlYXRlZCB0aW1lcnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChhLmNyZWF0ZWRBdCA8IGIuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY3JlYXRlZEF0ID4gYi5jcmVhdGVkQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGlkLCBsb3dlci1pZCB0aW1lcnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChhLmlkIDwgYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmlkID4gYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcyB0aW1lciBpZHMgYXJlIHVuaXF1ZSwgbm8gZmFsbGJhY2sgYDBgIGlzIG5lY2Vzc2FyeVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCBmcm9tLCB0bykge1xuICAgICAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuICAgICAgICB2YXIgaWQsIGlzSW5SYW5nZTtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2UgPSBpblJhbmdlKGZyb20sIHRvLCB0aW1lcnNbaWRdKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgaXNJblJhbmdlICYmXG4gICAgICAgICAgICAgICAgICAgICghdGltZXIgfHwgY29tcGFyZVRpbWVycyh0aW1lciwgdGltZXJzW2lkXSkgPT09IDEpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gdGltZXJzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlyc3RUaW1lcihjbG9jaykge1xuICAgICAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuICAgICAgICB2YXIgaWQ7XG5cbiAgICAgICAgZm9yIChpZCBpbiB0aW1lcnMpIHtcbiAgICAgICAgICAgIGlmICh0aW1lcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaWRdKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxhc3RUaW1lcihjbG9jaykge1xuICAgICAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuICAgICAgICB2YXIgaWQ7XG5cbiAgICAgICAgZm9yIChpZCBpbiB0aW1lcnMpIHtcbiAgICAgICAgICAgIGlmICh0aW1lcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaWRdKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSB0aW1lcnNbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZXIuaW50ZXJ2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNsb2NrLnRpbWVyc1t0aW1lci5pZF0uY2FsbEF0ICs9IHRpbWVyLmludGVydmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGNsb2NrLnRpbWVyc1t0aW1lci5pZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRpbWVyLmZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGltZXIuZnVuYy5hcHBseShudWxsLCB0aW1lci5hcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGVzbGludCBuby1ldmFsOiBcIm9mZlwiICovXG4gICAgICAgICAgICBldmFsKHRpbWVyLmZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgdHR5cGUpIHtcbiAgICAgICAgaWYgKCF0aW1lcklkKSB7XG4gICAgICAgICAgICAvLyBudWxsIGFwcGVhcnMgdG8gYmUgYWxsb3dlZCBpbiBtb3N0IGJyb3dzZXJzLCBhbmQgYXBwZWFycyB0byBiZVxuICAgICAgICAgICAgLy8gcmVsaWVkIHVwb24gYnkgc29tZSBsaWJyYXJpZXMsIGxpa2UgQm9vdHN0cmFwIGNhcm91c2VsXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgY2xvY2sudGltZXJzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbiBOb2RlLCB0aW1lcklkIGlzIGFuIG9iamVjdCB3aXRoIC5yZWYoKS8udW5yZWYoKSwgYW5kXG4gICAgICAgIC8vIGl0cyAuaWQgZmllbGQgaXMgdGhlIGFjdHVhbCB0aW1lciBpZC5cbiAgICAgICAgdmFyIGlkID0gdHlwZW9mIHRpbWVySWQgPT09IFwib2JqZWN0XCIgPyB0aW1lcklkLmlkIDogdGltZXJJZDtcblxuICAgICAgICBpZiAoY2xvY2sudGltZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgSUQgbWF0Y2hlcyBhIHRpbWVyIG9mIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgICAgICAgIHZhciB0aW1lciA9IGNsb2NrLnRpbWVyc1tpZF07XG4gICAgICAgICAgICBpZiAodGltZXIudHlwZSA9PT0gdHR5cGUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2xvY2sudGltZXJzW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsZWFyID1cbiAgICAgICAgICAgICAgICAgICAgdHR5cGUgPT09IFwiQW5pbWF0aW9uRnJhbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImNhbmNlbEFuaW1hdGlvbkZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJjbGVhclwiICsgdHR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIHNjaGVkdWxlID1cbiAgICAgICAgICAgICAgICAgICAgdGltZXIudHlwZSA9PT0gXCJBbmltYXRpb25GcmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJzZXRcIiArIHRpbWVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCBjbGVhciB0aW1lcjogdGltZXIgY3JlYXRlZCB3aXRoIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiKCkgYnV0IGNsZWFyZWQgd2l0aCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhciArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIigpXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5pbnN0YWxsKGNsb2NrLCB0YXJnZXQsIGNvbmZpZykge1xuICAgICAgICB2YXIgbWV0aG9kLCBpLCBsO1xuICAgICAgICB2YXIgaW5zdGFsbGVkSHJUaW1lID0gXCJfaHJ0aW1lXCI7XG4gICAgICAgIHZhciBpbnN0YWxsZWROZXh0VGljayA9IFwiX25leHRUaWNrXCI7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGNsb2NrLm1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBtZXRob2QgPSBjbG9jay5tZXRob2RzW2ldO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJocnRpbWVcIiAmJiB0YXJnZXQucHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wcm9jZXNzLmhydGltZSA9IGNsb2NrW2luc3RhbGxlZEhyVGltZV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJuZXh0VGlja1wiICYmIHRhcmdldC5wcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnByb2Nlc3MubmV4dFRpY2sgPSBjbG9ja1tpbnN0YWxsZWROZXh0VGlja107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJwZXJmb3JtYW5jZVwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsUGVyZkRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgICAgICBjbG9jayxcbiAgICAgICAgICAgICAgICAgICAgXCJfXCIgKyBtZXRob2RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxQZXJmRGVzY3JpcHRvciAmJlxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yLmdldCAmJlxuICAgICAgICAgICAgICAgICAgICAhb3JpZ2luYWxQZXJmRGVzY3JpcHRvci5zZXRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxQZXJmRGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxQZXJmRGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1tcIl9cIiArIG1ldGhvZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0W21ldGhvZF0gJiYgdGFyZ2V0W21ldGhvZF0uaGFkT3duUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1tcIl9cIiArIG1ldGhvZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9PT0gXCJjbGVhckludGVydmFsXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2RdKGNsb2NrLmF0dGFjaGVkSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXRbbWV0aG9kXTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaWdub3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQgbm8tZW1wdHk6IFwib2ZmXCIgKi9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgZXhlY3V0aW9ucyB3aGljaCB3aWxsIGNvbXBsZXRlbHkgcmVtb3ZlIHRoZXNlIHByb3BzXG4gICAgICAgIGNsb2NrLm1ldGhvZHMgPSBbXTtcblxuICAgICAgICAvLyByZXR1cm4gcGVuZGluZyB0aW1lcnMsIHRvIGVuYWJsZSBjaGVja2luZyB3aGF0IHRpbWVycyByZW1haW5lZCBvbiB1bmluc3RhbGxcbiAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY2xvY2sudGltZXJzKS5tYXAoZnVuY3Rpb24gbWFwcGVyKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLnRpbWVyc1trZXldO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWphY2tNZXRob2QodGFyZ2V0LCBtZXRob2QsIGNsb2NrKSB7XG4gICAgICAgIHZhciBwcm9wO1xuICAgICAgICBjbG9ja1ttZXRob2RdLmhhZE93blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgbWV0aG9kXG4gICAgICAgICk7XG4gICAgICAgIGNsb2NrW1wiX1wiICsgbWV0aG9kXSA9IHRhcmdldFttZXRob2RdO1xuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiRGF0ZVwiKSB7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IG1pcnJvckRhdGVQcm9wZXJ0aWVzKGNsb2NrW21ldGhvZF0sIHRhcmdldFttZXRob2RdKTtcbiAgICAgICAgICAgIHRhcmdldFttZXRob2RdID0gZGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwicGVyZm9ybWFuY2VcIikge1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsUGVyZkRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICBtZXRob2RcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBKU0RPTSBoYXMgYSByZWFkIG9ubHkgcGVyZm9ybWFuY2UgZmllbGQgc28gd2UgaGF2ZSB0byBzYXZlL2NvcHkgaXQgZGlmZmVyZW50bHlcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yICYmXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxQZXJmRGVzY3JpcHRvci5nZXQgJiZcbiAgICAgICAgICAgICAgICAhb3JpZ2luYWxQZXJmRGVzY3JpcHRvci5zZXRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgY2xvY2ssXG4gICAgICAgICAgICAgICAgICAgIFwiX1wiICsgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFBlcmZEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHZhciBwZXJmRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG1ldGhvZCwgcGVyZkRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGNsb2NrW21ldGhvZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9ja1ttZXRob2RdLmFwcGx5KGNsb2NrLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChwcm9wIGluIGNsb2NrW21ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xvY2tbbWV0aG9kXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXVtwcm9wXSA9IGNsb2NrW21ldGhvZF1bcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0W21ldGhvZF0uY2xvY2sgPSBjbG9jaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb0ludGVydmFsVGljayhjbG9jaywgYWR2YW5jZVRpbWVEZWx0YSkge1xuICAgICAgICBjbG9jay50aWNrKGFkdmFuY2VUaW1lRGVsdGEpO1xuICAgIH1cblxuICAgIHZhciB0aW1lcnMgPSB7XG4gICAgICAgIHNldFRpbWVvdXQ6IF9nbG9iYWwuc2V0VGltZW91dCxcbiAgICAgICAgY2xlYXJUaW1lb3V0OiBfZ2xvYmFsLmNsZWFyVGltZW91dCxcbiAgICAgICAgc2V0SW50ZXJ2YWw6IF9nbG9iYWwuc2V0SW50ZXJ2YWwsXG4gICAgICAgIGNsZWFySW50ZXJ2YWw6IF9nbG9iYWwuY2xlYXJJbnRlcnZhbCxcbiAgICAgICAgRGF0ZTogX2dsb2JhbC5EYXRlXG4gICAgfTtcblxuICAgIGlmIChzZXRJbW1lZGlhdGVQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5zZXRJbW1lZGlhdGUgPSBfZ2xvYmFsLnNldEltbWVkaWF0ZTtcbiAgICAgICAgdGltZXJzLmNsZWFySW1tZWRpYXRlID0gX2dsb2JhbC5jbGVhckltbWVkaWF0ZTtcbiAgICB9XG5cbiAgICBpZiAoaHJ0aW1lUHJlc2VudCkge1xuICAgICAgICB0aW1lcnMuaHJ0aW1lID0gX2dsb2JhbC5wcm9jZXNzLmhydGltZTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFRpY2tQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5uZXh0VGljayA9IF9nbG9iYWwucHJvY2Vzcy5uZXh0VGljaztcbiAgICB9XG5cbiAgICBpZiAocGVyZm9ybWFuY2VQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5wZXJmb3JtYW5jZSA9IF9nbG9iYWwucGVyZm9ybWFuY2U7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RBbmltYXRpb25GcmFtZVByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IF9nbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZU1pY3JvdGFza1ByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLnF1ZXVlTWljcm90YXNrID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2FuY2VsQW5pbWF0aW9uRnJhbWVQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RJZGxlQ2FsbGJhY2tQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5yZXF1ZXN0SWRsZUNhbGxiYWNrID0gX2dsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrO1xuICAgIH1cblxuICAgIGlmIChjYW5jZWxJZGxlQ2FsbGJhY2tQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5jYW5jZWxJZGxlQ2FsbGJhY2sgPSBfZ2xvYmFsLmNhbmNlbElkbGVDYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIga2V5cyA9XG4gICAgICAgIE9iamVjdC5rZXlzIHx8XG4gICAgICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgdmFyIGtzID0gW107XG4gICAgICAgICAgICB2YXIga2V5O1xuXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAga3MucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGtzO1xuICAgICAgICB9O1xuXG4gICAgdmFyIG9yaWdpbmFsU2V0VGltZW91dCA9IF9nbG9iYWwuc2V0SW1tZWRpYXRlIHx8IF9nbG9iYWwuc2V0VGltZW91dDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzdGFydCB7RGF0ZXxudW1iZXJ9IHRoZSBzeXN0ZW0gdGltZSAtIG5vbi1pbnRlZ2VyIHZhbHVlcyBhcmUgZmxvb3JlZFxuICAgICAqIEBwYXJhbSBsb29wTGltaXQge251bWJlcn0gIG1heGltdW0gbnVtYmVyIG9mIHRpbWVycyB0aGF0IHdpbGwgYmUgcnVuIHdoZW4gY2FsbGluZyBydW5BbGwoKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNsb2NrKHN0YXJ0LCBsb29wTGltaXQpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihnZXRFcG9jaChzdGFydCkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgbG9vcExpbWl0ID0gbG9vcExpbWl0IHx8IDEwMDA7XG4gICAgICAgIHZhciBuYW5vcyA9IDA7XG4gICAgICAgIHZhciBhZGp1c3RlZFN5c3RlbVRpbWUgPSBbMCwgMF07IC8vIFttaWxsaXMsIG5hbm9yZW1haW5kZXJdXG5cbiAgICAgICAgaWYgKE5hdGl2ZURhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhlIGdsb2JhbCBzY29wZSBkb2Vzbid0IGhhdmUgYSBgRGF0ZWAgb2JqZWN0XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5vbmpzL3Npbm9uL2lzc3Vlcy8xODUyI2lzc3VlY29tbWVudC00MTk2MjI3ODApXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2xvY2sgPSB7XG4gICAgICAgICAgICBub3c6IHN0YXJ0LFxuICAgICAgICAgICAgdGltZW91dHM6IHt9LFxuICAgICAgICAgICAgRGF0ZTogY3JlYXRlRGF0ZSgpLFxuICAgICAgICAgICAgbG9vcExpbWl0OiBsb29wTGltaXRcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5EYXRlLmNsb2NrID0gY2xvY2s7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VGltZVRvTmV4dEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIDE2IC0gKChjbG9jay5ub3cgLSBzdGFydCkgJSAxNik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBocnRpbWUocHJldikge1xuICAgICAgICAgICAgdmFyIG1pbGxpc1NpbmNlU3RhcnQgPSBjbG9jay5ub3cgLSBhZGp1c3RlZFN5c3RlbVRpbWVbMF0gLSBzdGFydDtcbiAgICAgICAgICAgIHZhciBzZWNzU2luY2VTdGFydCA9IE1hdGguZmxvb3IobWlsbGlzU2luY2VTdGFydCAvIDEwMDApO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmRlckluTmFub3MgPVxuICAgICAgICAgICAgICAgIChtaWxsaXNTaW5jZVN0YXJ0IC0gc2Vjc1NpbmNlU3RhcnQgKiAxZTMpICogMWU2ICtcbiAgICAgICAgICAgICAgICBuYW5vcyAtXG4gICAgICAgICAgICAgICAgYWRqdXN0ZWRTeXN0ZW1UaW1lWzFdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2WzFdID4gMWU5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk51bWJlciBvZiBuYW5vc2Vjb25kcyBjYW4ndCBleGNlZWQgYSBiaWxsaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgb2xkU2VjcyA9IHByZXZbMF07XG4gICAgICAgICAgICAgICAgdmFyIG5hbm9EaWZmID0gcmVtYWluZGVySW5OYW5vcyAtIHByZXZbMV07XG4gICAgICAgICAgICAgICAgdmFyIHNlY0RpZmYgPSBzZWNzU2luY2VTdGFydCAtIG9sZFNlY3M7XG5cbiAgICAgICAgICAgICAgICBpZiAobmFub0RpZmYgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbm9EaWZmICs9IDFlOTtcbiAgICAgICAgICAgICAgICAgICAgc2VjRGlmZiAtPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbc2VjRGlmZiwgbmFub0RpZmZdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtzZWNzU2luY2VTdGFydCwgcmVtYWluZGVySW5OYW5vc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaHJ0aW1lQmlnaW50UHJlc2VudCkge1xuICAgICAgICAgICAgaHJ0aW1lLmJpZ2ludCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IGhydGltZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBCaWdJbnQocGFydHNbMF0pICogQmlnSW50KDFlOSkgKyBCaWdJbnQocGFydHNbMV0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvY2sucmVxdWVzdElkbGVDYWxsYmFjayA9IGZ1bmN0aW9uIHJlcXVlc3RJZGxlQ2FsbGJhY2soXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgdGltZW91dFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciB0aW1lVG9OZXh0SWRsZVBlcmlvZCA9IDA7XG5cbiAgICAgICAgICAgIGlmIChjbG9jay5jb3VudFRpbWVycygpID4gMCkge1xuICAgICAgICAgICAgICAgIHRpbWVUb05leHRJZGxlUGVyaW9kID0gNTA7IC8vIGNvbnN0IGZvciBub3dcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgICAgICAgICAgIGRlbGF5OlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGltZW91dCA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aW1lVG9OZXh0SWRsZVBlcmlvZFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1pbih0aW1lb3V0LCB0aW1lVG9OZXh0SWRsZVBlcmlvZClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmlkIHx8IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jYW5jZWxJZGxlQ2FsbGJhY2sgPSBmdW5jdGlvbiBjYW5jZWxJZGxlQ2FsbGJhY2sodGltZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiVGltZW91dFwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICAgICAgICAgICAgZGVsYXk6IHRpbWVvdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIF9nbG9iYWwuUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB1dGlsUHJvbWlzaWZ5KSB7XG4gICAgICAgICAgICBjbG9jay5zZXRUaW1lb3V0W1xuICAgICAgICAgICAgICAgIHV0aWxQcm9taXNpZnkuY3VzdG9tXG4gICAgICAgICAgICBdID0gZnVuY3Rpb24gcHJvbWlzaWZpZWRTZXRUaW1lb3V0KHRpbWVvdXQsIGFyZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgX2dsb2JhbC5Qcm9taXNlKGZ1bmN0aW9uIHNldFRpbWVvdXRFeGVjdXRvcihcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBhZGRUaW1lcihjbG9jaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFthcmddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IHRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvY2suY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gY2xlYXJUaW1lb3V0KHRpbWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIlRpbWVvdXRcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2submV4dFRpY2sgPSBmdW5jdGlvbiBuZXh0VGljayhmdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5xdWV1ZUpvYihjbG9jaywge1xuICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmMsXG4gICAgICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucXVldWVNaWNyb3Rhc2sgPSBmdW5jdGlvbiBxdWV1ZU1pY3JvdGFzayhmdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvY2submV4dFRpY2soZnVuYyk7IC8vIGV4cGxpY2l0bHkgZHJvcCBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnNldEludGVydmFsID0gZnVuY3Rpb24gc2V0SW50ZXJ2YWwoZnVuYywgdGltZW91dCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB0aW1lb3V0ID0gcGFyc2VJbnQodGltZW91dCwgMTApO1xuICAgICAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgICAgICAgICAgIGRlbGF5OiB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGludGVydmFsOiB0aW1lb3V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jbGVhckludGVydmFsID0gZnVuY3Rpb24gY2xlYXJJbnRlcnZhbCh0aW1lcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJJbnRlcnZhbFwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc2V0SW1tZWRpYXRlUHJlc2VudCkge1xuICAgICAgICAgICAgY2xvY2suc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIF9nbG9iYWwuUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB1dGlsUHJvbWlzaWZ5KSB7XG4gICAgICAgICAgICAgICAgY2xvY2suc2V0SW1tZWRpYXRlW1xuICAgICAgICAgICAgICAgICAgICB1dGlsUHJvbWlzaWZ5LmN1c3RvbVxuICAgICAgICAgICAgICAgIF0gPSBmdW5jdGlvbiBwcm9taXNpZmllZFNldEltbWVkaWF0ZShhcmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfZ2xvYmFsLlByb21pc2UoZnVuY3Rpb24gc2V0SW1tZWRpYXRlRXhlY3V0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jOiByZXNvbHZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFthcmddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsb2NrLmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUodGltZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIkltbWVkaWF0ZVwiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5jb3VudFRpbWVycyA9IGZ1bmN0aW9uIGNvdW50VGltZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjbG9jay50aW1lcnMgfHwge30pLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgKGNsb2NrLmpvYnMgfHwgW10pLmxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuYykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBkZWxheTogZ2V0VGltZVRvTmV4dEZyYW1lKCksXG4gICAgICAgICAgICAgICAgYXJnczogW2Nsb2NrLm5vdyArIGdldFRpbWVUb05leHRGcmFtZSgpXSxcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmlkIHx8IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIkFuaW1hdGlvbkZyYW1lXCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnJ1bk1pY3JvdGFza3MgPSBmdW5jdGlvbiBydW5NaWNyb3Rhc2tzKCkge1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gZG9UaWNrKHRpY2tWYWx1ZSwgaXNBc3luYywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgbXNGbG9hdCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRpY2tWYWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICA/IHRpY2tWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IHBhcnNlVGltZSh0aWNrVmFsdWUpO1xuICAgICAgICAgICAgdmFyIG1zID0gTWF0aC5mbG9vcihtc0Zsb2F0KTtcbiAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSBuYW5vUmVtYWluZGVyKG1zRmxvYXQpO1xuICAgICAgICAgICAgdmFyIG5hbm9zVG90YWwgPSBuYW5vcyArIHJlbWFpbmRlcjtcbiAgICAgICAgICAgIHZhciB0aWNrVG8gPSBjbG9jay5ub3cgKyBtcztcblxuICAgICAgICAgICAgaWYgKG1zRmxvYXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5lZ2F0aXZlIHRpY2tzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGp1c3QgZm9yIHBvc2l0aXZlIG92ZXJmbG93XG4gICAgICAgICAgICBpZiAobmFub3NUb3RhbCA+PSAxZTYpIHtcbiAgICAgICAgICAgICAgICB0aWNrVG8gKz0gMTtcbiAgICAgICAgICAgICAgICBuYW5vc1RvdGFsIC09IDFlNjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmFub3MgPSBuYW5vc1RvdGFsO1xuICAgICAgICAgICAgdmFyIHRpY2tGcm9tID0gY2xvY2subm93O1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvY2subm93O1xuICAgICAgICAgICAgdmFyIHRpbWVyLFxuICAgICAgICAgICAgICAgIGZpcnN0RXhjZXB0aW9uLFxuICAgICAgICAgICAgICAgIG9sZE5vdyxcbiAgICAgICAgICAgICAgICBuZXh0UHJvbWlzZVRpY2ssXG4gICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uQ2hlY2ssXG4gICAgICAgICAgICAgICAgcG9zdFRpbWVyQ2FsbDtcblxuICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIHBlcmZvcm0gbWljcm90YXNrc1xuICAgICAgICAgICAgb2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICBpZiAob2xkTm93ICE9PSBjbG9jay5ub3cpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wZW5zYXRlIGZvciBhbnkgc2V0U3lzdGVtVGltZSgpIGNhbGwgZHVyaW5nIG1pY3JvdGFzayBjYWxsYmFja1xuICAgICAgICAgICAgICAgIHRpY2tGcm9tICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgICAgICB0aWNrVG8gKz0gY2xvY2subm93IC0gb2xkTm93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBkb1RpY2tJbm5lcigpIHtcbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtIGVhY2ggdGltZXIgaW4gdGhlIHJlcXVlc3RlZCByYW5nZVxuICAgICAgICAgICAgICAgIHRpbWVyID0gZmlyc3RUaW1lckluUmFuZ2UoY2xvY2ssIHRpY2tGcm9tLCB0aWNrVG8pO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRpbWVyICYmIHRpY2tGcm9tIDw9IHRpY2tUbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xvY2sudGltZXJzW3RpbWVyLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlja0Zyb20gPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5ub3cgPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGROb3cgPSBjbG9jay5ub3c7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxUaW1lcihjbG9jaywgdGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjZXB0aW9uID0gZmlyc3RFeGNlcHRpb24gfHwgZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2ggdXAgYWZ0ZXIgbmF0aXZlIHNldEltbWVkaWF0ZSBjYWxsYmFjayB0byBhbGxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuYXRpdmUgZXM2IHByb21pc2VzIHRvIHByb2Nlc3MgdGhlaXIgY2FsbGJhY2tzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCB0aW1lciBmaXJlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNldFRpbWVvdXQobmV4dFByb21pc2VUaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGlvbkNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwb3N0VGltZXJDYWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcGVyZm9ybSBwcm9jZXNzLm5leHRUaWNrKClzIGFnYWluXG4gICAgICAgICAgICAgICAgb2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgICAgIGlmIChvbGROb3cgIT09IGNsb2NrLm5vdykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb21wZW5zYXRlIGZvciBhbnkgc2V0U3lzdGVtVGltZSgpIGNhbGwgZHVyaW5nIHByb2Nlc3MubmV4dFRpY2soKSBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICB0aWNrRnJvbSArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tUbyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIGNvcm5lciBjYXNlOiBkdXJpbmcgcnVuSm9icyBuZXcgdGltZXJzIHdlcmUgc2NoZWR1bGVkIHdoaWNoIGNvdWxkIGJlIGluIHRoZSByYW5nZSBbY2xvY2subm93LCB0aWNrVG9dXG4gICAgICAgICAgICAgICAgdGltZXIgPSBmaXJzdFRpbWVySW5SYW5nZShjbG9jaywgdGlja0Zyb20sIHRpY2tUbyk7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay50aWNrKHRpY2tUbyAtIGNsb2NrLm5vdyk7IC8vIGRvIGl0IGFsbCBhZ2FpbiAtIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNlcHRpb24gPSBmaXJzdEV4Y2VwdGlvbiB8fCBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm8gdGltZXJzIHJlbWFpbmluZyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlOiBtb3ZlIHRoZSBjbG9jayBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLm5vdyA9IHRpY2tUbztcblxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbmFub3NcbiAgICAgICAgICAgICAgICAgICAgbmFub3MgPSBuYW5vc1RvdGFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmlyc3RFeGNlcHRpb247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9jay5ub3c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXh0UHJvbWlzZVRpY2sgPVxuICAgICAgICAgICAgICAgIGlzQXN5bmMgJiZcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGlvbkNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0VGltZXJDYWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb1RpY2tJbm5lcigpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb21wZW5zYXRpb25DaGVjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBlbnNhdGUgZm9yIGFueSBzZXRTeXN0ZW1UaW1lKCkgY2FsbCBkdXJpbmcgdGltZXIgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICBpZiAob2xkTm93ICE9PSBjbG9jay5ub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGlja0Zyb20gKz0gY2xvY2subm93IC0gb2xkTm93O1xuICAgICAgICAgICAgICAgICAgICB0aWNrVG8gKz0gY2xvY2subm93IC0gb2xkTm93O1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcG9zdFRpbWVyQ2FsbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gZmlyc3RUaW1lckluUmFuZ2UoY2xvY2ssIHByZXZpb3VzLCB0aWNrVG8pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzID0gdGlja0Zyb207XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gZG9UaWNrSW5uZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge3RpY2tWYWx1ZX0ge1N0cmluZ3xOdW1iZXJ9IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3IgYSBodW1hbi1yZWFkYWJsZSB2YWx1ZSBsaWtlIFwiMDE6MTE6MTVcIlxuICAgICAgICAgKi9cbiAgICAgICAgY2xvY2sudGljayA9IGZ1bmN0aW9uIHRpY2sodGlja1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9UaWNrKHRpY2tWYWx1ZSwgZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgX2dsb2JhbC5Qcm9taXNlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjbG9jay50aWNrQXN5bmMgPSBmdW5jdGlvbiB0aWNrQXN5bmMobXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IF9nbG9iYWwuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1RpY2sobXMsIHRydWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5uZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgdmFyIHRpbWVyID0gZmlyc3RUaW1lcihjbG9jayk7XG4gICAgICAgICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNsb2NrLm5vdyA9IHRpbWVyLmNhbGxBdDtcbiAgICAgICAgICAgICAgICBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKTtcbiAgICAgICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjbG9jay5kdXJpbmdUaWNrID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfZ2xvYmFsLlByb21pc2UgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNsb2NrLm5leHRBc3luYyA9IGZ1bmN0aW9uIG5leHRBc3luYygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IF9nbG9iYWwuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltZXIgPSBmaXJzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2xvY2subm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2subm93ID0gdGltZXIuY2FsbEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxUaW1lcihjbG9jaywgdGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2xvY2subm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvY2sucnVuQWxsID0gZnVuY3Rpb24gcnVuQWxsKCkge1xuICAgICAgICAgICAgdmFyIG51bVRpbWVycywgaTtcbiAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNsb2NrLmxvb3BMaW1pdDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBudW1UaW1lcnMgPSBrZXlzKGNsb2NrLnRpbWVycykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChudW1UaW1lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjbG9jay5uZXh0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkFib3J0aW5nIGFmdGVyIHJ1bm5pbmcgXCIgK1xuICAgICAgICAgICAgICAgICAgICBjbG9jay5sb29wTGltaXQgK1xuICAgICAgICAgICAgICAgICAgICBcIiB0aW1lcnMsIGFzc3VtaW5nIGFuIGluZmluaXRlIGxvb3AhXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuVG9GcmFtZSA9IGZ1bmN0aW9uIHJ1blRvRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvY2sudGljayhnZXRUaW1lVG9OZXh0RnJhbWUoKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfZ2xvYmFsLlByb21pc2UgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNsb2NrLnJ1bkFsbEFzeW5jID0gZnVuY3Rpb24gcnVuQWxsQXN5bmMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfZ2xvYmFsLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bVRpbWVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBjbG9jay5sb29wTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xvY2sudGltZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGltZXJzID0gT2JqZWN0LmtleXMoY2xvY2sudGltZXJzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVGltZXJzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2submV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBYm9ydGluZyBhZnRlciBydW5uaW5nIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2subG9vcExpbWl0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgdGltZXJzLCBhc3N1bWluZyBhbiBpbmZpbml0ZSBsb29wIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5ydW5Ub0xhc3QgPSBmdW5jdGlvbiBydW5Ub0xhc3QoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIgPSBsYXN0VGltZXIoY2xvY2spO1xuICAgICAgICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9jay5ub3c7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjbG9jay50aWNrKHRpbWVyLmNhbGxBdCAtIGNsb2NrLm5vdyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfZ2xvYmFsLlByb21pc2UgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNsb2NrLnJ1blRvTGFzdEFzeW5jID0gZnVuY3Rpb24gcnVuVG9MYXN0QXN5bmMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfZ2xvYmFsLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVyID0gbGFzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2xvY2subm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNsb2NrLnRpY2tBc3luYyh0aW1lci5jYWxsQXQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsb2NrLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICBuYW5vcyA9IDA7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSB7fTtcbiAgICAgICAgICAgIGNsb2NrLmpvYnMgPSBbXTtcbiAgICAgICAgICAgIGNsb2NrLm5vdyA9IHN0YXJ0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnNldFN5c3RlbVRpbWUgPSBmdW5jdGlvbiBzZXRTeXN0ZW1UaW1lKHN5c3RlbVRpbWUpIHtcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0aW1lIGRpZmZlcmVuY2VcbiAgICAgICAgICAgIHZhciBuZXdOb3cgPSBnZXRFcG9jaChzeXN0ZW1UaW1lKTtcbiAgICAgICAgICAgIHZhciBkaWZmZXJlbmNlID0gbmV3Tm93IC0gY2xvY2subm93O1xuICAgICAgICAgICAgdmFyIGlkLCB0aW1lcjtcblxuICAgICAgICAgICAgYWRqdXN0ZWRTeXN0ZW1UaW1lWzBdID0gYWRqdXN0ZWRTeXN0ZW1UaW1lWzBdICsgZGlmZmVyZW5jZTtcbiAgICAgICAgICAgIGFkanVzdGVkU3lzdGVtVGltZVsxXSA9IGFkanVzdGVkU3lzdGVtVGltZVsxXSArIG5hbm9zO1xuICAgICAgICAgICAgLy8gdXBkYXRlICdzeXN0ZW0gY2xvY2snXG4gICAgICAgICAgICBjbG9jay5ub3cgPSBuZXdOb3c7XG4gICAgICAgICAgICBuYW5vcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aW1lcnMgYW5kIGludGVydmFscyB0byBrZWVwIHRoZW0gc3RhYmxlXG4gICAgICAgICAgICBmb3IgKGlkIGluIGNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgICAgIGlmIChjbG9jay50aW1lcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gY2xvY2sudGltZXJzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIuY3JlYXRlZEF0ICs9IGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyLmNhbGxBdCArPSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocGVyZm9ybWFuY2VQcmVzZW50KSB7XG4gICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChoYXNQZXJmb3JtYW5jZVByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm90byA9IF9nbG9iYWwuUGVyZm9ybWFuY2UucHJvdG90eXBlO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKFwiZ2V0RW50cmllc1wiKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggZXhwZWN0ZWQgcmV0dXJuIHR5cGUgZm9yIGdldEVudHJpZXMgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZVtuYW1lXSA9IE5PT1BfQVJSQVk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZVtuYW1lXSA9IE5PT1A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xvY2sucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gRmFrZVRpbWVyc05vdygpIHtcbiAgICAgICAgICAgICAgICB2YXIgaHJ0ID0gaHJ0aW1lKCk7XG4gICAgICAgICAgICAgICAgdmFyIG1pbGxpcyA9IGhydFswXSAqIDEwMDAgKyBocnRbMV0gLyAxZTY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pbGxpcztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaHJ0aW1lUHJlc2VudCkge1xuICAgICAgICAgICAgY2xvY2suaHJ0aW1lID0gaHJ0aW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb2NrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25maWcge09iamVjdH0gb3B0aW9uYWwgY29uZmlnXG4gICAgICogQHBhcmFtIGNvbmZpZy50YXJnZXQge09iamVjdH0gdGhlIHRhcmdldCB0byBpbnN0YWxsIHRpbWVycyBpbiAoZGVmYXVsdCBgd2luZG93YClcbiAgICAgKiBAcGFyYW0gY29uZmlnLm5vdyB7bnVtYmVyfERhdGV9ICBhIG51bWJlciAoaW4gbWlsbGlzZWNvbmRzKSBvciBhIERhdGUgb2JqZWN0IChkZWZhdWx0IGVwb2NoKVxuICAgICAqIEBwYXJhbSBjb25maWcudG9GYWtlIHtzdHJpbmdbXX0gbmFtZXMgb2YgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgZmFrZWQuXG4gICAgICogQHBhcmFtIGNvbmZpZy5sb29wTGltaXQge251bWJlcn0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVycyB0aGF0IHdpbGwgYmUgcnVuIHdoZW4gY2FsbGluZyBydW5BbGwoKVxuICAgICAqIEBwYXJhbSBjb25maWcuc2hvdWxkQWR2YW5jZVRpbWUge0Jvb2xlYW59IHRlbGxzIEZha2VUaW1lcnMgdG8gaW5jcmVtZW50IG1vY2tlZCB0aW1lIGF1dG9tYXRpY2FsbHkgKGRlZmF1bHQgZmFsc2UpXG4gICAgICogQHBhcmFtIGNvbmZpZy5hZHZhbmNlVGltZURlbHRhIHtOdW1iZXJ9IGluY3JlbWVudCBtb2NrZWQgdGltZSBldmVyeSA8PGFkdmFuY2VUaW1lRGVsdGE+PiBtcyAoZGVmYXVsdDogMjBtcylcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIGZ1bmN0aW9uIGluc3RhbGwoY29uZmlnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxIHx8XG4gICAgICAgICAgICBjb25maWcgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNvbmZpZykgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcgPT09IFwibnVtYmVyXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiRmFrZVRpbWVycy5pbnN0YWxsIGNhbGxlZCB3aXRoIFwiICtcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nKGNvbmZpZykgK1xuICAgICAgICAgICAgICAgICAgICBcIiBpbnN0YWxsIHJlcXVpcmVzIGFuIG9iamVjdCBwYXJhbWV0ZXJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjb25maWcgPSB0eXBlb2YgY29uZmlnICE9PSBcInVuZGVmaW5lZFwiID8gY29uZmlnIDoge307XG4gICAgICAgIGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSA9IGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSB8fCBmYWxzZTtcbiAgICAgICAgY29uZmlnLmFkdmFuY2VUaW1lRGVsdGEgPSBjb25maWcuYWR2YW5jZVRpbWVEZWx0YSB8fCAyMDtcblxuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgdmFyIHRhcmdldCA9IGNvbmZpZy50YXJnZXQgfHwgX2dsb2JhbDtcbiAgICAgICAgdmFyIGNsb2NrID0gY3JlYXRlQ2xvY2soY29uZmlnLm5vdywgY29uZmlnLmxvb3BMaW1pdCk7XG5cbiAgICAgICAgY2xvY2sudW5pbnN0YWxsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5pbnN0YWxsKGNsb2NrLCB0YXJnZXQsIGNvbmZpZyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2subWV0aG9kcyA9IGNvbmZpZy50b0Zha2UgfHwgW107XG5cbiAgICAgICAgaWYgKGNsb2NrLm1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBkbyBub3QgZmFrZSBuZXh0VGljayBieSBkZWZhdWx0IC0gR2l0SHViIzEyNlxuICAgICAgICAgICAgY2xvY2subWV0aG9kcyA9IGtleXModGltZXJzKS5maWx0ZXIoZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSAhPT0gXCJuZXh0VGlja1wiICYmIGtleSAhPT0gXCJxdWV1ZU1pY3JvdGFza1wiO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gY2xvY2subWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbG9jay5tZXRob2RzW2ldID09PSBcImhydGltZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHJvY2VzcyAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGFyZ2V0LnByb2Nlc3MuaHJ0aW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaGlqYWNrTWV0aG9kKHRhcmdldC5wcm9jZXNzLCBjbG9jay5tZXRob2RzW2ldLCBjbG9jayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbG9jay5tZXRob2RzW2ldID09PSBcIm5leHRUaWNrXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0YXJnZXQucHJvY2Vzcy5uZXh0VGljayA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpamFja01ldGhvZCh0YXJnZXQucHJvY2VzcywgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjbG9jay5tZXRob2RzW2ldID09PSBcInNldEludGVydmFsXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lID09PSB0cnVlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnZhbFRpY2sgPSBkb0ludGVydmFsVGljay5iaW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFkdmFuY2VUaW1lRGVsdGFcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsSWQgPSB0YXJnZXRbY2xvY2subWV0aG9kc1tpXV0oXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbFRpY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYWR2YW5jZVRpbWVEZWx0YVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjbG9jay5hdHRhY2hlZEludGVydmFsID0gaW50ZXJ2YWxJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGlqYWNrTWV0aG9kKHRhcmdldCwgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb2NrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVyczogdGltZXJzLFxuICAgICAgICBjcmVhdGVDbG9jazogY3JlYXRlQ2xvY2ssXG4gICAgICAgIGluc3RhbGw6IGluc3RhbGwsXG4gICAgICAgIHdpdGhHbG9iYWw6IHdpdGhHbG9iYWxcbiAgICB9O1xufVxuXG52YXIgZGVmYXVsdEltcGxlbWVudGF0aW9uID0gd2l0aEdsb2JhbChnbG9iYWxPYmplY3QpO1xuXG5leHBvcnRzLnRpbWVycyA9IGRlZmF1bHRJbXBsZW1lbnRhdGlvbi50aW1lcnM7XG5leHBvcnRzLmNyZWF0ZUNsb2NrID0gZGVmYXVsdEltcGxlbWVudGF0aW9uLmNyZWF0ZUNsb2NrO1xuZXhwb3J0cy5pbnN0YWxsID0gZGVmYXVsdEltcGxlbWVudGF0aW9uLmluc3RhbGw7XG5leHBvcnRzLndpdGhHbG9iYWwgPSB3aXRoR2xvYmFsO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBBUlJBWV9UWVBFUyA9IFtcbiAgICBBcnJheSxcbiAgICBJbnQ4QXJyYXksXG4gICAgVWludDhBcnJheSxcbiAgICBVaW50OENsYW1wZWRBcnJheSxcbiAgICBJbnQxNkFycmF5LFxuICAgIFVpbnQxNkFycmF5LFxuICAgIEludDMyQXJyYXksXG4gICAgVWludDMyQXJyYXksXG4gICAgRmxvYXQzMkFycmF5LFxuICAgIEZsb2F0NjRBcnJheVxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBBUlJBWV9UWVBFUztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZShcIi4vZGVlcC1lcXVhbFwiKS51c2UoY3JlYXRlTWF0Y2hlcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbnZhciBldmVyeSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmV2ZXJ5O1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciBnZXQgPSByZXF1aXJlKFwibG9kYXNoLmdldFwiKTtcbnZhciBpdGVyYWJsZVRvU3RyaW5nID0gcmVxdWlyZShcIi4vaXRlcmFibGUtdG8tc3RyaW5nXCIpO1xudmFyIG9iamVjdFByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5vYmplY3Q7XG52YXIgdHlwZU9mID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudHlwZU9mO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xuXG52YXIgYXNzZXJ0TWF0Y2hlciA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyL2Fzc2VydC1tYXRjaGVyXCIpO1xudmFyIGFzc2VydE1ldGhvZEV4aXN0cyA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyL2Fzc2VydC1tZXRob2QtZXhpc3RzXCIpO1xudmFyIGFzc2VydFR5cGUgPSByZXF1aXJlKFwiLi9jcmVhdGUtbWF0Y2hlci9hc3NlcnQtdHlwZVwiKTtcbnZhciBpc0l0ZXJhYmxlID0gcmVxdWlyZShcIi4vY3JlYXRlLW1hdGNoZXIvaXMtaXRlcmFibGVcIik7XG52YXIgaXNNYXRjaGVyID0gcmVxdWlyZShcIi4vY3JlYXRlLW1hdGNoZXIvaXMtbWF0Y2hlclwiKTtcblxudmFyIG1hdGNoZXJQcm90b3R5cGUgPSByZXF1aXJlKFwiLi9jcmVhdGUtbWF0Y2hlci9tYXRjaGVyLXByb3RvdHlwZVwiKTtcblxudmFyIGFycmF5SW5kZXhPZiA9IGFycmF5UHJvdG8uaW5kZXhPZjtcbnZhciBzb21lID0gYXJyYXlQcm90by5zb21lO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG52YXIgVFlQRV9NQVAgPSByZXF1aXJlKFwiLi9jcmVhdGUtbWF0Y2hlci90eXBlLW1hcFwiKShjcmVhdGVNYXRjaGVyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRjaGVyIG9iamVjdCBmb3IgdGhlIHBhc3NlZCBleHBlY3RhdGlvblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLmNyZWF0ZU1hdGNoZXJcbiAqIEBwYXJhbSB7Kn0gZXhwZWN0YXRpb24gQW4gZXhwZWN0dGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBBIG1lc3NhZ2UgZm9yIHRoZSBleHBlY3RhdGlvblxuICogQHJldHVybnMge29iamVjdH0gQSBtYXRjaGVyIG9iamVjdFxuICovXG5mdW5jdGlvbiBjcmVhdGVNYXRjaGVyKGV4cGVjdGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgdmFyIG0gPSBPYmplY3QuY3JlYXRlKG1hdGNoZXJQcm90b3R5cGUpO1xuICAgIHZhciB0eXBlID0gdHlwZU9mKGV4cGVjdGF0aW9uKTtcblxuICAgIGlmIChtZXNzYWdlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1lc3NhZ2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2Ugc2hvdWxkIGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCAxIG9yIDIgYXJndW1lbnRzLCByZWNlaXZlZCBcIiArIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSBpbiBUWVBFX01BUCkge1xuICAgICAgICBUWVBFX01BUFt0eXBlXShtLCBleHBlY3RhdGlvbiwgbWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbS50ZXN0ID0gZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0YXRpb24pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmICghbS5tZXNzYWdlKSB7XG4gICAgICAgIG0ubWVzc2FnZSA9IFwibWF0Y2goXCIgKyB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiKVwiO1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG5jcmVhdGVNYXRjaGVyLmlzTWF0Y2hlciA9IGlzTWF0Y2hlcjtcblxuY3JlYXRlTWF0Y2hlci5hbnkgPSBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xufSwgXCJhbnlcIik7XG5cbmNyZWF0ZU1hdGNoZXIuZGVmaW5lZCA9IGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgcmV0dXJuIGFjdHVhbCAhPT0gbnVsbCAmJiBhY3R1YWwgIT09IHVuZGVmaW5lZDtcbn0sIFwiZGVmaW5lZFwiKTtcblxuY3JlYXRlTWF0Y2hlci50cnV0aHkgPSBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgIHJldHVybiBCb29sZWFuKGFjdHVhbCk7XG59LCBcInRydXRoeVwiKTtcblxuY3JlYXRlTWF0Y2hlci5mYWxzeSA9IGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgcmV0dXJuICFhY3R1YWw7XG59LCBcImZhbHN5XCIpO1xuXG5jcmVhdGVNYXRjaGVyLnNhbWUgPSBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24gPT09IGFjdHVhbDtcbiAgICB9LCBcInNhbWUoXCIgKyB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiKVwiKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuaW4gPSBmdW5jdGlvbihhcnJheU9mRXhwZWN0YXRpb25zKSB7XG4gICAgaWYgKHR5cGVPZihhcnJheU9mRXhwZWN0YXRpb25zKSAhPT0gXCJhcnJheVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcnJheSBleHBlY3RlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIHNvbWUoYXJyYXlPZkV4cGVjdGF0aW9ucywgZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbiA9PT0gYWN0dWFsO1xuICAgICAgICB9KTtcbiAgICB9LCBcImluKFwiICsgdmFsdWVUb1N0cmluZyhhcnJheU9mRXhwZWN0YXRpb25zKSArIFwiKVwiKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIudHlwZU9mID0gZnVuY3Rpb24odHlwZSkge1xuICAgIGFzc2VydFR5cGUodHlwZSwgXCJzdHJpbmdcIiwgXCJ0eXBlXCIpO1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gdHlwZU9mKGFjdHVhbCkgPT09IHR5cGU7XG4gICAgfSwgJ3R5cGVPZihcIicgKyB0eXBlICsgJ1wiKScpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5pbnN0YW5jZU9mID0gZnVuY3Rpb24odHlwZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChcbiAgICAgICAgdHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICB0eXBlb2YgU3ltYm9sLmhhc0luc3RhbmNlID09PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICAgIGFzc2VydFR5cGUodHlwZSwgXCJmdW5jdGlvblwiLCBcInR5cGVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0TWV0aG9kRXhpc3RzKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIFN5bWJvbC5oYXNJbnN0YW5jZSxcbiAgICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgICAgXCJbU3ltYm9sLmhhc0luc3RhbmNlXVwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gYWN0dWFsIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9LCBcImluc3RhbmNlT2YoXCIgKyAoZnVuY3Rpb25OYW1lKHR5cGUpIHx8IG9iamVjdFRvU3RyaW5nKHR5cGUpKSArIFwiKVwiKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb3BlcnR5IG1hdGNoZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvcGVydHlUZXN0IEEgZnVuY3Rpb24gdG8gdGVzdCB0aGUgcHJvcGVydHkgYWdhaW5zdCBhIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVByZWZpeCBBIHByZWZpeCB0byB1c2UgZm9yIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSB0aGUgbWF0Y2hlclxuICogQHJldHVybnMge29iamVjdH0gQSBtYXRjaGVyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5TWF0Y2hlcihwcm9wZXJ0eVRlc3QsIG1lc3NhZ2VQcmVmaXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAgIGFzc2VydFR5cGUocHJvcGVydHksIFwic3RyaW5nXCIsIFwicHJvcGVydHlcIik7XG4gICAgICAgIHZhciBvbmx5UHJvcGVydHkgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VQcmVmaXggKyAnKFwiJyArIHByb3BlcnR5ICsgJ1wiJztcbiAgICAgICAgaWYgKCFvbmx5UHJvcGVydHkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gXCIsIFwiICsgdmFsdWVUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSBcIilcIjtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYWN0dWFsID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBhY3R1YWwgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAhcHJvcGVydHlUZXN0KGFjdHVhbCwgcHJvcGVydHkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb25seVByb3BlcnR5IHx8IGRlZXBFcXVhbChhY3R1YWxbcHJvcGVydHldLCB2YWx1ZSk7XG4gICAgICAgIH0sIG1lc3NhZ2UpO1xuICAgIH07XG59XG5cbmNyZWF0ZU1hdGNoZXIuaGFzID0gY3JlYXRlUHJvcGVydHlNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCwgcHJvcGVydHkpIHtcbiAgICBpZiAodHlwZW9mIGFjdHVhbCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gcHJvcGVydHkgaW4gYWN0dWFsO1xuICAgIH1cbiAgICByZXR1cm4gYWN0dWFsW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkO1xufSwgXCJoYXNcIik7XG5cbmNyZWF0ZU1hdGNoZXIuaGFzT3duID0gY3JlYXRlUHJvcGVydHlNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gaGFzT3duUHJvcGVydHkoYWN0dWFsLCBwcm9wZXJ0eSk7XG59LCBcImhhc093blwiKTtcblxuY3JlYXRlTWF0Y2hlci5oYXNOZXN0ZWQgPSBmdW5jdGlvbihwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBhc3NlcnRUeXBlKHByb3BlcnR5LCBcInN0cmluZ1wiLCBcInByb3BlcnR5XCIpO1xuICAgIHZhciBvbmx5UHJvcGVydHkgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuICAgIHZhciBtZXNzYWdlID0gJ2hhc05lc3RlZChcIicgKyBwcm9wZXJ0eSArICdcIic7XG4gICAgaWYgKCFvbmx5UHJvcGVydHkpIHtcbiAgICAgICAgbWVzc2FnZSArPSBcIiwgXCIgKyB2YWx1ZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgbWVzc2FnZSArPSBcIilcIjtcbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWN0dWFsID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGFjdHVhbCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgZ2V0KGFjdHVhbCwgcHJvcGVydHkpID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ubHlQcm9wZXJ0eSB8fCBkZWVwRXF1YWwoZ2V0KGFjdHVhbCwgcHJvcGVydHkpLCB2YWx1ZSk7XG4gICAgfSwgbWVzc2FnZSk7XG59O1xuXG52YXIganNvblBhcnNlUmVzdWx0VHlwZXMgPSB7XG4gICAgbnVsbDogdHJ1ZSxcbiAgICBib29sZWFuOiB0cnVlLFxuICAgIG51bWJlcjogdHJ1ZSxcbiAgICBzdHJpbmc6IHRydWUsXG4gICAgb2JqZWN0OiB0cnVlLFxuICAgIGFycmF5OiB0cnVlXG59O1xuY3JlYXRlTWF0Y2hlci5qc29uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoIWpzb25QYXJzZVJlc3VsdFR5cGVzW3R5cGVPZih2YWx1ZSldKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJWYWx1ZSBjYW5ub3QgYmUgdGhlIHJlc3VsdCBvZiBKU09OLnBhcnNlXCIpO1xuICAgIH1cbiAgICB2YXIgbWVzc2FnZSA9IFwianNvbihcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCBcIiAgXCIpICsgXCIpXCI7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIHZhciBwYXJzZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGFjdHVhbCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKHBhcnNlZCwgdmFsdWUpO1xuICAgIH0sIG1lc3NhZ2UpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5ldmVyeSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgIGFzc2VydE1hdGNoZXIocHJlZGljYXRlKTtcblxuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICBpZiAodHlwZU9mKGFjdHVhbCkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVyeShPYmplY3Qua2V5cyhhY3R1YWwpLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlLnRlc3QoYWN0dWFsW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNJdGVyYWJsZShhY3R1YWwpICYmXG4gICAgICAgICAgICBldmVyeShhY3R1YWwsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlLnRlc3QoZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiZXZlcnkoXCIgKyBwcmVkaWNhdGUubWVzc2FnZSArIFwiKVwiKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuc29tZSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgIGFzc2VydE1hdGNoZXIocHJlZGljYXRlKTtcblxuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICBpZiAodHlwZU9mKGFjdHVhbCkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiAhZXZlcnkoT2JqZWN0LmtleXMoYWN0dWFsKSwgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUudGVzdChhY3R1YWxba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc0l0ZXJhYmxlKGFjdHVhbCkgJiZcbiAgICAgICAgICAgICFldmVyeShhY3R1YWwsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS50ZXN0KGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBcInNvbWUoXCIgKyBwcmVkaWNhdGUubWVzc2FnZSArIFwiKVwiKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuYXJyYXkgPSBjcmVhdGVNYXRjaGVyLnR5cGVPZihcImFycmF5XCIpO1xuXG5jcmVhdGVNYXRjaGVyLmFycmF5LmRlZXBFcXVhbHMgPSBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAvLyBDb21wYXJpbmcgbGVuZ3RocyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gc3BvdCBhIGRpZmZlcmVuY2UgYmVmb3JlIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IGl0ZW1cbiAgICAgICAgdmFyIHNhbWVMZW5ndGggPSBhY3R1YWwubGVuZ3RoID09PSBleHBlY3RhdGlvbi5sZW5ndGg7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlT2YoYWN0dWFsKSA9PT0gXCJhcnJheVwiICYmXG4gICAgICAgICAgICBzYW1lTGVuZ3RoICYmXG4gICAgICAgICAgICBldmVyeShhY3R1YWwsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gZXhwZWN0YXRpb25baW5kZXhdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlT2YoZXhwZWN0ZWQpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZU9mKGVsZW1lbnQpID09PSBcImFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgPyBjcmVhdGVNYXRjaGVyLmFycmF5LmRlZXBFcXVhbHMoZXhwZWN0ZWQpLnRlc3QoZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgOiBkZWVwRXF1YWwoZXhwZWN0ZWQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBcImRlZXBFcXVhbHMoW1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5hcnJheS5zdGFydHNXaXRoID0gZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlTWF0Y2hlcihmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbihleHBlY3RlZEVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFtpbmRleF0gPT09IGV4cGVjdGVkRWxlbWVudDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgXCJzdGFydHNXaXRoKFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIuYXJyYXkuZW5kc1dpdGggPSBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGUgaW5kZXggaW4gd2hpY2ggd2Ugc2hvdWxkIHN0YXJ0IG1hdGNoaW5nXG4gICAgICAgIHZhciBvZmZzZXQgPSBhY3R1YWwubGVuZ3RoIC0gZXhwZWN0YXRpb24ubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlT2YoYWN0dWFsKSA9PT0gXCJhcnJheVwiICYmXG4gICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24oZXhwZWN0ZWRFbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxbb2Zmc2V0ICsgaW5kZXhdID09PSBleHBlY3RlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiZW5kc1dpdGgoW1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5hcnJheS5jb250YWlucyA9IGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlT2YoYWN0dWFsKSA9PT0gXCJhcnJheVwiICYmXG4gICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24oZXhwZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZihhY3R1YWwsIGV4cGVjdGVkRWxlbWVudCkgIT09IC0xO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBcImNvbnRhaW5zKFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbmNyZWF0ZU1hdGNoZXIubWFwID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJtYXBcIik7XG5cbmNyZWF0ZU1hdGNoZXIubWFwLmRlZXBFcXVhbHMgPSBmdW5jdGlvbiBtYXBEZWVwRXF1YWxzKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIC8vIENvbXBhcmluZyBsZW5ndGhzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBzcG90IGEgZGlmZmVyZW5jZSBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnkgaXRlbVxuICAgICAgICB2YXIgc2FtZUxlbmd0aCA9IGFjdHVhbC5zaXplID09PSBleHBlY3RhdGlvbi5zaXplO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwibWFwXCIgJiZcbiAgICAgICAgICAgIHNhbWVMZW5ndGggJiZcbiAgICAgICAgICAgIGV2ZXJ5KGFjdHVhbCwgZnVuY3Rpb24oZWxlbWVudCwga2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLmhhcyhrZXkpICYmIGV4cGVjdGF0aW9uLmdldChrZXkpID09PSBlbGVtZW50O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBcImRlZXBFcXVhbHMoTWFwW1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5tYXAuY29udGFpbnMgPSBmdW5jdGlvbiBtYXBDb250YWlucyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwibWFwXCIgJiZcbiAgICAgICAgICAgIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbihlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsLmhhcyhrZXkpICYmIGFjdHVhbC5nZXQoa2V5KSA9PT0gZWxlbWVudDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgXCJjb250YWlucyhNYXBbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5jcmVhdGVNYXRjaGVyLnNldCA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwic2V0XCIpO1xuXG5jcmVhdGVNYXRjaGVyLnNldC5kZWVwRXF1YWxzID0gZnVuY3Rpb24gc2V0RGVlcEVxdWFscyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAvLyBDb21wYXJpbmcgbGVuZ3RocyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gc3BvdCBhIGRpZmZlcmVuY2UgYmVmb3JlIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IGl0ZW1cbiAgICAgICAgdmFyIHNhbWVMZW5ndGggPSBhY3R1YWwuc2l6ZSA9PT0gZXhwZWN0YXRpb24uc2l6ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcInNldFwiICYmXG4gICAgICAgICAgICBzYW1lTGVuZ3RoICYmXG4gICAgICAgICAgICBldmVyeShhY3R1YWwsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24uaGFzKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBcImRlZXBFcXVhbHMoU2V0W1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5zZXQuY29udGFpbnMgPSBmdW5jdGlvbiBzZXRDb250YWlucyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBjcmVhdGVNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwic2V0XCIgJiZcbiAgICAgICAgICAgIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC5oYXMoZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiY29udGFpbnMoU2V0W1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxuY3JlYXRlTWF0Y2hlci5ib29sID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJib29sZWFuXCIpO1xuY3JlYXRlTWF0Y2hlci5udW1iZXIgPSBjcmVhdGVNYXRjaGVyLnR5cGVPZihcIm51bWJlclwiKTtcbmNyZWF0ZU1hdGNoZXIuc3RyaW5nID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJzdHJpbmdcIik7XG5jcmVhdGVNYXRjaGVyLm9iamVjdCA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwib2JqZWN0XCIpO1xuY3JlYXRlTWF0Y2hlci5mdW5jID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJmdW5jdGlvblwiKTtcbmNyZWF0ZU1hdGNoZXIucmVnZXhwID0gY3JlYXRlTWF0Y2hlci50eXBlT2YoXCJyZWdleHBcIik7XG5jcmVhdGVNYXRjaGVyLmRhdGUgPSBjcmVhdGVNYXRjaGVyLnR5cGVPZihcImRhdGVcIik7XG5jcmVhdGVNYXRjaGVyLnN5bWJvbCA9IGNyZWF0ZU1hdGNoZXIudHlwZU9mKFwic3ltYm9sXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZU1hdGNoZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGlzTWF0Y2hlciA9IHJlcXVpcmUoXCIuL2lzLW1hdGNoZXJcIik7XG5cbi8qKlxuICogVGhyb3dzIGEgVHlwZUVycm9yIHdoZW4gYHZhbHVlYCBpcyBub3QgYSBtYXRjaGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TWF0Y2hlcih2YWx1ZSkge1xuICAgIGlmICghaXNNYXRjaGVyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF0Y2hlciBleHBlY3RlZFwiKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0TWF0Y2hlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFRocm93cyBhIFR5cGVFcnJvciB3aGVuIGV4cGVjdGVkIG1ldGhvZCBkb2Vzbid0IGV4aXN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gbG9vayBmb3JcbiAqIEBwYXJhbSB7bmFtZX0gbmFtZSBBIG5hbWUgdG8gdXNlIGZvciB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFBhdGggVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byB1c2UgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdoZW4gdGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydE1ldGhvZEV4aXN0cyh2YWx1ZSwgbWV0aG9kLCBuYW1lLCBtZXRob2RQYXRoKSB7XG4gICAgaWYgKHZhbHVlW21ldGhvZF0gPT09IG51bGwgfHwgdmFsdWVbbWV0aG9kXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIFwiICsgbmFtZSArIFwiIHRvIGhhdmUgbWV0aG9kIFwiICsgbWV0aG9kUGF0aFxuICAgICAgICApO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NlcnRNZXRob2RFeGlzdHM7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHR5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnR5cGVPZjtcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdmFsdWUgaXMgb2YgdHlwZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgQSBiYXNpYyBKYXZhU2NyaXB0IHR5cGUgdG8gY29tcGFyZSB0bywgZS5nLiBcIm9iamVjdFwiLCBcInN0cmluZ1wiXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBBIHN0cmluZyB0byB1c2UgZm9yIHRoZSBlcnJvciBtZXNzYWdlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHZhbHVlIGlzIG5vdCBvZiB0aGUgZXhwZWN0ZWQgdHlwZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZSwgbmFtZSkge1xuICAgIHZhciBhY3R1YWwgPSB0eXBlT2YodmFsdWUpO1xuICAgIGlmIChhY3R1YWwgIT09IHR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgdHlwZSBvZiBcIiArXG4gICAgICAgICAgICAgICAgbmFtZSArXG4gICAgICAgICAgICAgICAgXCIgdG8gYmUgXCIgK1xuICAgICAgICAgICAgICAgIHR5cGUgK1xuICAgICAgICAgICAgICAgIFwiLCBidXQgd2FzIFwiICtcbiAgICAgICAgICAgICAgICBhY3R1YWxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0VHlwZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdHlwZU9mID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudHlwZU9mO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGZvciBpdGVyYWJsZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBBIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCB3aGVuIGB2YWx1ZWAgbG9va3MgbGlrZSBhbiBpdGVyYWJsZVxuICovXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpICYmIHR5cGVPZih2YWx1ZS5mb3JFYWNoKSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSXRlcmFibGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdC5pc1Byb3RvdHlwZU9mO1xuXG52YXIgbWF0Y2hlclByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL21hdGNoZXItcHJvdG90eXBlXCIpO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYSBtYXRjaGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYSBtYXRjaGVyXG4gKi9cbmZ1bmN0aW9uIGlzTWF0Y2hlcihvYmplY3QpIHtcbiAgICByZXR1cm4gaXNQcm90b3R5cGVPZihtYXRjaGVyUHJvdG90eXBlLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWF0Y2hlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZXZlcnkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmV2ZXJ5O1xudmFyIGNvbmNhdCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXkuY29uY2F0O1xudmFyIHR5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnR5cGVPZjtcblxudmFyIGRlZXBFcXVhbEZhY3RvcnkgPSByZXF1aXJlKFwiLi4vZGVlcC1lcXVhbFwiKS51c2U7XG5cbnZhciBpc01hdGNoZXIgPSByZXF1aXJlKFwiLi9pcy1tYXRjaGVyXCIpO1xuXG52YXIga2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogTWF0Y2hlcyBgYWN0dWFsYCB3aXRoIGBleHBlY3RhdGlvbmBcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBhY3R1YWwgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwZWN0YXRpb24gQW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byBtYXRjaCBvblxuICogQHBhcmFtIHtvYmplY3R9IG1hdGNoZXIgQSBtYXRjaGVyIHRvIHVzZSBmb3IgY29tcGFyaXNvblxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSB3aGVuIGBhY3R1YWxgIG1hdGNoZXMgYWxsIHByb3BlcnRpZXMgaW4gYGV4cGVjdGF0aW9uYFxuICovXG5mdW5jdGlvbiBtYXRjaE9iamVjdChhY3R1YWwsIGV4cGVjdGF0aW9uLCBtYXRjaGVyKSB7XG4gICAgdmFyIGRlZXBFcXVhbCA9IGRlZXBFcXVhbEZhY3RvcnkobWF0Y2hlcik7XG4gICAgaWYgKGFjdHVhbCA9PT0gbnVsbCB8fCBhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGV4cGVjdGVkS2V5cyA9IGtleXMoZXhwZWN0YXRpb24pO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBjYW5ub3QgY29sbGVjdCBjb3ZlcmFnZSBmb3IgZW5naW5lIHRoYXQgZG9lc24ndCBzdXBwb3J0IFN5bWJvbCAqL1xuICAgIGlmICh0eXBlT2YoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4cGVjdGVkS2V5cyA9IGNvbmNhdChleHBlY3RlZEtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhleHBlY3RhdGlvbikpO1xuICAgIH1cblxuICAgIHJldHVybiBldmVyeShleHBlY3RlZEtleXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB2YXIgZXhwID0gZXhwZWN0YXRpb25ba2V5XTtcbiAgICAgICAgdmFyIGFjdCA9IGFjdHVhbFtrZXldO1xuXG4gICAgICAgIGlmIChpc01hdGNoZXIoZXhwKSkge1xuICAgICAgICAgICAgaWYgKCFleHAudGVzdChhY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVPZihleHApID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoT2JqZWN0KGFjdCwgZXhwLCBtYXRjaGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghZGVlcEVxdWFsKGFjdCwgZXhwKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hPYmplY3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1hdGNoZXJQcm90b3R5cGUgPSB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn07XG5cbm1hdGNoZXJQcm90b3R5cGUub3IgPSBmdW5jdGlvbih2YWx1ZU9yTWF0Y2hlcikge1xuICAgIHZhciBjcmVhdGVNYXRjaGVyID0gcmVxdWlyZShcIi4uL2NyZWF0ZS1tYXRjaGVyXCIpO1xuICAgIHZhciBpc01hdGNoZXIgPSBjcmVhdGVNYXRjaGVyLmlzTWF0Y2hlcjtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF0Y2hlciBleHBlY3RlZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgbTIgPSBpc01hdGNoZXIodmFsdWVPck1hdGNoZXIpXG4gICAgICAgID8gdmFsdWVPck1hdGNoZXJcbiAgICAgICAgOiBjcmVhdGVNYXRjaGVyKHZhbHVlT3JNYXRjaGVyKTtcbiAgICB2YXIgbTEgPSB0aGlzO1xuICAgIHZhciBvciA9IE9iamVjdC5jcmVhdGUobWF0Y2hlclByb3RvdHlwZSk7XG4gICAgb3IudGVzdCA9IGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gbTEudGVzdChhY3R1YWwpIHx8IG0yLnRlc3QoYWN0dWFsKTtcbiAgICB9O1xuICAgIG9yLm1lc3NhZ2UgPSBtMS5tZXNzYWdlICsgXCIub3IoXCIgKyBtMi5tZXNzYWdlICsgXCIpXCI7XG4gICAgcmV0dXJuIG9yO1xufTtcblxubWF0Y2hlclByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbih2YWx1ZU9yTWF0Y2hlcikge1xuICAgIHZhciBjcmVhdGVNYXRjaGVyID0gcmVxdWlyZShcIi4uL2NyZWF0ZS1tYXRjaGVyXCIpO1xuICAgIHZhciBpc01hdGNoZXIgPSBjcmVhdGVNYXRjaGVyLmlzTWF0Y2hlcjtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF0Y2hlciBleHBlY3RlZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgbTIgPSBpc01hdGNoZXIodmFsdWVPck1hdGNoZXIpXG4gICAgICAgID8gdmFsdWVPck1hdGNoZXJcbiAgICAgICAgOiBjcmVhdGVNYXRjaGVyKHZhbHVlT3JNYXRjaGVyKTtcbiAgICB2YXIgbTEgPSB0aGlzO1xuICAgIHZhciBhbmQgPSBPYmplY3QuY3JlYXRlKG1hdGNoZXJQcm90b3R5cGUpO1xuICAgIGFuZC50ZXN0ID0gZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiBtMS50ZXN0KGFjdHVhbCkgJiYgbTIudGVzdChhY3R1YWwpO1xuICAgIH07XG4gICAgYW5kLm1lc3NhZ2UgPSBtMS5tZXNzYWdlICsgXCIuYW5kKFwiICsgbTIubWVzc2FnZSArIFwiKVwiO1xuICAgIHJldHVybiBhbmQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdGNoZXJQcm90b3R5cGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciBqb2luID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5qb2luO1xudmFyIG1hcCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXkubWFwO1xudmFyIHN0cmluZ0luZGV4T2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZy5pbmRleE9mO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xuXG52YXIgbWF0Y2hPYmplY3QgPSByZXF1aXJlKFwiLi9tYXRjaC1vYmplY3RcIik7XG5cbnZhciBjcmVhdGVUeXBlTWFwID0gZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmdW5jdGlvbjogZnVuY3Rpb24obSwgZXhwZWN0YXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIG0udGVzdCA9IGV4cGVjdGF0aW9uO1xuICAgICAgICAgICAgbS5tZXNzYWdlID0gbWVzc2FnZSB8fCBcIm1hdGNoKFwiICsgZnVuY3Rpb25OYW1lKGV4cGVjdGF0aW9uKSArIFwiKVwiO1xuICAgICAgICB9LFxuICAgICAgICBudW1iZXI6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHR5cGUgY29lcmNpb24gaGVyZVxuICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbiA9PSBhY3R1YWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvYmplY3Q6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBlY3RhdGlvbi50ZXN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLnRlc3QoYWN0dWFsKSA9PT0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG0ubWVzc2FnZSA9IFwibWF0Y2goXCIgKyBmdW5jdGlvbk5hbWUoZXhwZWN0YXRpb24udGVzdCkgKyBcIilcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXJyYXkgPSBtYXAoT2JqZWN0LmtleXMoZXhwZWN0YXRpb24pLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ICsgXCI6IFwiICsgdmFsdWVUb1N0cmluZyhleHBlY3RhdGlvbltrZXldKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hPYmplY3QoYWN0dWFsLCBleHBlY3RhdGlvbiwgbWF0Y2gpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG0ubWVzc2FnZSA9IFwibWF0Y2goXCIgKyBqb2luKGFycmF5LCBcIiwgXCIpICsgXCIpXCI7XG5cbiAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICB9LFxuICAgICAgICByZWdleHA6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBleHBlY3RhdGlvbi50ZXN0KGFjdHVhbCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBzdHJpbmc6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYWN0dWFsID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ0luZGV4T2YoYWN0dWFsLCBleHBlY3RhdGlvbikgIT09IC0xXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtLm1lc3NhZ2UgPSAnbWF0Y2goXCInICsgZXhwZWN0YXRpb24gKyAnXCIpJztcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVR5cGVNYXA7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xudmFyIGNsYXNzTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmNsYXNzTmFtZTtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgb2JqZWN0UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdDtcbnZhciBtYXBGb3JFYWNoID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5tYXAuZm9yRWFjaDtcblxudmFyIGdldENsYXNzID0gcmVxdWlyZShcIi4vZ2V0LWNsYXNzXCIpO1xudmFyIGlkZW50aWNhbCA9IHJlcXVpcmUoXCIuL2lkZW50aWNhbFwiKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoXCIuL2lzLWFyZ3VtZW50c1wiKTtcbnZhciBpc0RhdGUgPSByZXF1aXJlKFwiLi9pcy1kYXRlXCIpO1xudmFyIGlzRWxlbWVudCA9IHJlcXVpcmUoXCIuL2lzLWVsZW1lbnRcIik7XG52YXIgaXNNYXAgPSByZXF1aXJlKFwiLi9pcy1tYXBcIik7XG52YXIgaXNOYU4gPSByZXF1aXJlKFwiLi9pcy1uYW5cIik7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKFwiLi9pcy1vYmplY3RcIik7XG52YXIgaXNTZXQgPSByZXF1aXJlKFwiLi9pcy1zZXRcIik7XG52YXIgaXNTdWJzZXQgPSByZXF1aXJlKFwiLi9pcy1zdWJzZXRcIik7XG5cbnZhciBjb25jYXQgPSBhcnJheVByb3RvLmNvbmNhdDtcbnZhciBldmVyeSA9IGFycmF5UHJvdG8uZXZlcnk7XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcblxudmFyIGdldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lO1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG52YXIgaW5kZXhPZiA9IGFycmF5UHJvdG8uaW5kZXhPZjtcbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBEZWVwIGVxdWFsIGNvbXBhcmlzb24uIFR3byB2YWx1ZXMgYXJlIFwiZGVlcCBlcXVhbFwiIHdoZW46XG4gKlxuICogICAtIFRoZXkgYXJlIGVxdWFsLCBhY2NvcmRpbmcgdG8gc2Ftc2FtLmlkZW50aWNhbFxuICogICAtIFRoZXkgYXJlIGJvdGggZGF0ZSBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgc2FtZSB0aW1lXG4gKiAgIC0gVGhleSBhcmUgYm90aCBhcnJheXMgY29udGFpbmluZyBlbGVtZW50cyB0aGF0IGFyZSBhbGwgZGVlcEVxdWFsXG4gKiAgIC0gVGhleSBhcmUgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLCBhbmQgZWFjaCBwcm9wZXJ0eVxuICogICAgIGluIGBgYWN0dWFsYGAgaXMgZGVlcEVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGluIGBgZXhwZWN0YXRpb25gYFxuICpcbiAqIFN1cHBvcnRzIGN5Y2xpYyBvYmplY3RzLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLmRlZXBFcXVhbFxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcGFyYW0geyp9IGV4cGVjdGF0aW9uIFRoZSBvYmplY3QgYWN0dWFsIGlzIGV4cGVjdGVkIHRvIGJlIGVxdWFsIHRvXG4gKiBAcGFyYW0ge29iamVjdH0gbWF0Y2ggQSB2YWx1ZSB0byBtYXRjaCBvblxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSB3aGVuIGFjdHVhbCBhbmQgZXhwZWN0YXRpb24gYXJlIGNvbnNpZGVyZWQgZXF1YWxcbiAqL1xuZnVuY3Rpb24gZGVlcEVxdWFsQ3ljbGljKGFjdHVhbCwgZXhwZWN0YXRpb24sIG1hdGNoKSB7XG4gICAgLy8gdXNlZCBmb3IgY3ljbGljIGNvbXBhcmlzb25cbiAgICAvLyBjb250YWluIGFscmVhZHkgdmlzaXRlZCBvYmplY3RzXG4gICAgdmFyIGFjdHVhbE9iamVjdHMgPSBbXTtcbiAgICB2YXIgZXhwZWN0YXRpb25PYmplY3RzID0gW107XG4gICAgLy8gY29udGFpbiBwYXRoZXMgKHBvc2l0aW9uIGluIHRoZSBvYmplY3Qgc3RydWN0dXJlKVxuICAgIC8vIG9mIHRoZSBhbHJlYWR5IHZpc2l0ZWQgb2JqZWN0c1xuICAgIC8vIGluZGV4ZXMgc2FtZSBhcyBpbiBvYmplY3RzIGFycmF5c1xuICAgIHZhciBhY3R1YWxQYXRocyA9IFtdO1xuICAgIHZhciBleHBlY3RhdGlvblBhdGhzID0gW107XG4gICAgLy8gY29udGFpbnMgY29tYmluYXRpb25zIG9mIGFscmVhZHkgY29tcGFyZWQgb2JqZWN0c1xuICAgIC8vIGluIHRoZSBtYW5uZXI6IHsgXCIkMVsncmVmJ10kMlsncmVmJ11cIjogdHJ1ZSB9XG4gICAgdmFyIGNvbXBhcmVkID0ge307XG5cbiAgICAvLyBkb2VzIHRoZSByZWN1cnNpb24gZm9yIHRoZSBkZWVwIGVxdWFsIGNoZWNrXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICByZXR1cm4gKGZ1bmN0aW9uIGRlZXBFcXVhbChcbiAgICAgICAgYWN0dWFsT2JqLFxuICAgICAgICBleHBlY3RhdGlvbk9iaixcbiAgICAgICAgYWN0dWFsUGF0aCxcbiAgICAgICAgZXhwZWN0YXRpb25QYXRoXG4gICAgKSB7XG4gICAgICAgIC8vIElmIGJvdGggYXJlIG1hdGNoZXJzIHRoZXkgbXVzdCBiZSB0aGUgc2FtZSBpbnN0YW5jZSBpbiBvcmRlciB0byBiZVxuICAgICAgICAvLyBjb25zaWRlcmVkIGVxdWFsIElmIHdlIGRpZG4ndCBkbyB0aGF0IHdlIHdvdWxkIGVuZCB1cCBydW5uaW5nIG9uZVxuICAgICAgICAvLyBtYXRjaGVyIGFnYWluc3QgdGhlIG90aGVyXG4gICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pc01hdGNoZXIoZXhwZWN0YXRpb25PYmopKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2guaXNNYXRjaGVyKGFjdHVhbE9iaikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbk9iai50ZXN0KGFjdHVhbE9iaik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0dWFsVHlwZSA9IHR5cGVvZiBhY3R1YWxPYmo7XG4gICAgICAgIHZhciBleHBlY3RhdGlvblR5cGUgPSB0eXBlb2YgZXhwZWN0YXRpb25PYmo7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iaiB8fFxuICAgICAgICAgICAgaXNOYU4oYWN0dWFsT2JqKSB8fFxuICAgICAgICAgICAgaXNOYU4oZXhwZWN0YXRpb25PYmopIHx8XG4gICAgICAgICAgICBhY3R1YWxPYmogPT09IG51bGwgfHxcbiAgICAgICAgICAgIGV4cGVjdGF0aW9uT2JqID09PSBudWxsIHx8XG4gICAgICAgICAgICBhY3R1YWxPYmogPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgZXhwZWN0YXRpb25PYmogPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgYWN0dWFsVHlwZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAgICAgZXhwZWN0YXRpb25UeXBlICE9PSBcIm9iamVjdFwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGlkZW50aWNhbChhY3R1YWxPYmosIGV4cGVjdGF0aW9uT2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVsZW1lbnRzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbChleHBlY3RlZCwgYWN0dWFsKVxuICAgICAgICBpZiAoaXNFbGVtZW50KGFjdHVhbE9iaikgfHwgaXNFbGVtZW50KGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlzQWN0dWFsRGF0ZSA9IGlzRGF0ZShhY3R1YWxPYmopO1xuICAgICAgICB2YXIgaXNFeHBlY3RhdGlvbkRhdGUgPSBpc0RhdGUoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICBpZiAoaXNBY3R1YWxEYXRlIHx8IGlzRXhwZWN0YXRpb25EYXRlKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWlzQWN0dWFsRGF0ZSB8fFxuICAgICAgICAgICAgICAgICFpc0V4cGVjdGF0aW9uRGF0ZSB8fFxuICAgICAgICAgICAgICAgIGdldFRpbWUuY2FsbChhY3R1YWxPYmopICE9PSBnZXRUaW1lLmNhbGwoZXhwZWN0YXRpb25PYmopXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0dWFsT2JqIGluc3RhbmNlb2YgUmVnRXhwICYmIGV4cGVjdGF0aW9uT2JqIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVUb1N0cmluZyhhY3R1YWxPYmopICE9PSB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxPYmogaW5zdGFuY2VvZiBFcnJvciAmJiBleHBlY3RhdGlvbk9iaiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3R1YWxDbGFzcyA9IGdldENsYXNzKGFjdHVhbE9iaik7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbkNsYXNzID0gZ2V0Q2xhc3MoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB2YXIgYWN0dWFsS2V5cyA9IGtleXMoYWN0dWFsT2JqKTtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uS2V5cyA9IGtleXMoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB2YXIgYWN0dWFsTmFtZSA9IGNsYXNzTmFtZShhY3R1YWxPYmopO1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25OYW1lID0gY2xhc3NOYW1lKGV4cGVjdGF0aW9uT2JqKTtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uU3ltYm9scyA9XG4gICAgICAgICAgICB0eXBlT2YoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgPyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXhwZWN0YXRpb25PYmopXG4gICAgICAgICAgICAgICAgOiAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogY2Fubm90IGNvbGxlY3QgY292ZXJhZ2UgZm9yIGVuZ2luZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBTeW1ib2wgKi9cbiAgICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25LZXlzQW5kU3ltYm9scyA9IGNvbmNhdChcbiAgICAgICAgICAgIGV4cGVjdGF0aW9uS2V5cyxcbiAgICAgICAgICAgIGV4cGVjdGF0aW9uU3ltYm9sc1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpc0FyZ3VtZW50cyhhY3R1YWxPYmopIHx8IGlzQXJndW1lbnRzKGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgaWYgKGFjdHVhbE9iai5sZW5ndGggIT09IGV4cGVjdGF0aW9uT2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3R1YWxUeXBlICE9PSBleHBlY3RhdGlvblR5cGUgfHxcbiAgICAgICAgICAgICAgICBhY3R1YWxDbGFzcyAhPT0gZXhwZWN0YXRpb25DbGFzcyB8fFxuICAgICAgICAgICAgICAgIGFjdHVhbEtleXMubGVuZ3RoICE9PSBleHBlY3RhdGlvbktleXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgKGFjdHVhbE5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0YXRpb25OYW1lICYmXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbE5hbWUgIT09IGV4cGVjdGF0aW9uTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NldChhY3R1YWxPYmopIHx8IGlzU2V0KGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFpc1NldChhY3R1YWxPYmopIHx8XG4gICAgICAgICAgICAgICAgIWlzU2V0KGV4cGVjdGF0aW9uT2JqKSB8fFxuICAgICAgICAgICAgICAgIGFjdHVhbE9iai5zaXplICE9PSBleHBlY3RhdGlvbk9iai5zaXplXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpc1N1YnNldChhY3R1YWxPYmosIGV4cGVjdGF0aW9uT2JqLCBkZWVwRXF1YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTWFwKGFjdHVhbE9iaikgfHwgaXNNYXAoZXhwZWN0YXRpb25PYmopKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWlzTWFwKGFjdHVhbE9iaikgfHxcbiAgICAgICAgICAgICAgICAhaXNNYXAoZXhwZWN0YXRpb25PYmopIHx8XG4gICAgICAgICAgICAgICAgYWN0dWFsT2JqLnNpemUgIT09IGV4cGVjdGF0aW9uT2JqLnNpemVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1hcHNEZWVwbHlFcXVhbCA9IHRydWU7XG4gICAgICAgICAgICBtYXBGb3JFYWNoKGFjdHVhbE9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcHNEZWVwbHlFcXVhbCA9XG4gICAgICAgICAgICAgICAgICAgIG1hcHNEZWVwbHlFcXVhbCAmJlxuICAgICAgICAgICAgICAgICAgICBkZWVwRXF1YWxDeWNsaWModmFsdWUsIGV4cGVjdGF0aW9uT2JqLmdldChrZXkpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbWFwc0RlZXBseUVxdWFsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV2ZXJ5KGV4cGVjdGF0aW9uS2V5c0FuZFN5bWJvbHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShhY3R1YWxPYmosIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhY3R1YWxWYWx1ZSA9IGFjdHVhbE9ialtrZXldO1xuICAgICAgICAgICAgdmFyIGV4cGVjdGF0aW9uVmFsdWUgPSBleHBlY3RhdGlvbk9ialtrZXldO1xuICAgICAgICAgICAgdmFyIGFjdHVhbE9iamVjdCA9IGlzT2JqZWN0KGFjdHVhbFZhbHVlKTtcbiAgICAgICAgICAgIHZhciBleHBlY3RhdGlvbk9iamVjdCA9IGlzT2JqZWN0KGV4cGVjdGF0aW9uVmFsdWUpO1xuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lcywgaWYgdGhlIG9iamVjdHMgd2VyZSBhbHJlYWR5IHZpc2l0ZWRcbiAgICAgICAgICAgIC8vIChpdCdzIGZhc3RlciB0byBjaGVjayBmb3IgaXNPYmplY3QgZmlyc3QsIHRoYW4gdG9cbiAgICAgICAgICAgIC8vIGdldCAtMSBmcm9tIGdldEluZGV4IGZvciBub24gb2JqZWN0cylcbiAgICAgICAgICAgIHZhciBhY3R1YWxJbmRleCA9IGFjdHVhbE9iamVjdFxuICAgICAgICAgICAgICAgID8gaW5kZXhPZihhY3R1YWxPYmplY3RzLCBhY3R1YWxWYWx1ZSlcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICAgICAgdmFyIGV4cGVjdGF0aW9uSW5kZXggPSBleHBlY3RhdGlvbk9iamVjdFxuICAgICAgICAgICAgICAgID8gaW5kZXhPZihleHBlY3RhdGlvbk9iamVjdHMsIGV4cGVjdGF0aW9uVmFsdWUpXG4gICAgICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgICAgIC8vIGRldGVybWluZXMgdGhlIG5ldyBwYXRocyBvZiB0aGUgb2JqZWN0c1xuICAgICAgICAgICAgLy8gLSBmb3Igbm9uIGN5Y2xpYyBvYmplY3RzIHRoZSBjdXJyZW50IHBhdGggd2lsbCBiZSBleHRlbmRlZFxuICAgICAgICAgICAgLy8gICBieSBjdXJyZW50IHByb3BlcnR5IG5hbWVcbiAgICAgICAgICAgIC8vIC0gZm9yIGN5Y2xpYyBvYmplY3RzIHRoZSBzdG9yZWQgcGF0aCBpcyB0YWtlblxuICAgICAgICAgICAgdmFyIG5ld0FjdHVhbFBhdGggPVxuICAgICAgICAgICAgICAgIGFjdHVhbEluZGV4ICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IGFjdHVhbFBhdGhzW2FjdHVhbEluZGV4XVxuICAgICAgICAgICAgICAgICAgICA6IGFjdHVhbFBhdGggKyBcIltcIiArIEpTT04uc3RyaW5naWZ5KGtleSkgKyBcIl1cIjtcbiAgICAgICAgICAgIHZhciBuZXdFeHBlY3RhdGlvblBhdGggPVxuICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uSW5kZXggIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gZXhwZWN0YXRpb25QYXRoc1tleHBlY3RhdGlvbkluZGV4XVxuICAgICAgICAgICAgICAgICAgICA6IGV4cGVjdGF0aW9uUGF0aCArIFwiW1wiICsgSlNPTi5zdHJpbmdpZnkoa2V5KSArIFwiXVwiO1xuICAgICAgICAgICAgdmFyIGNvbWJpbmVkUGF0aCA9IG5ld0FjdHVhbFBhdGggKyBuZXdFeHBlY3RhdGlvblBhdGg7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgcmVjdXJzaW9uIGlmIGN1cnJlbnQgb2JqZWN0cyBhcmUgYWxyZWFkeSBjb21wYXJlZFxuICAgICAgICAgICAgaWYgKGNvbXBhcmVkW2NvbWJpbmVkUGF0aF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGN1cnJlbnQgb2JqZWN0cyBhbmQgdGhlaXIgcGF0aHNcbiAgICAgICAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gLTEgJiYgYWN0dWFsT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcHVzaChhY3R1YWxPYmplY3RzLCBhY3R1YWxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcHVzaChhY3R1YWxQYXRocywgbmV3QWN0dWFsUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwZWN0YXRpb25JbmRleCA9PT0gLTEgJiYgZXhwZWN0YXRpb25PYmplY3QpIHtcbiAgICAgICAgICAgICAgICBwdXNoKGV4cGVjdGF0aW9uT2JqZWN0cywgZXhwZWN0YXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgcHVzaChleHBlY3RhdGlvblBhdGhzLCBuZXdFeHBlY3RhdGlvblBhdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBjdXJyZW50IG9iamVjdHMgYXJlIGFscmVhZHkgY29tcGFyZWRcbiAgICAgICAgICAgIGlmIChhY3R1YWxPYmplY3QgJiYgZXhwZWN0YXRpb25PYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wYXJlZFtjb21iaW5lZFBhdGhdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRW5kIG9mIGN5Y2xpYyBsb2dpY1xuXG4gICAgICAgICAgICAvLyBuZWl0aGVyIGFjdHVhbFZhbHVlIG5vciBleHBlY3RhdGlvblZhbHVlIGlzIGEgY3ljbGVcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggbmV4dCBsZXZlbFxuICAgICAgICAgICAgcmV0dXJuIGRlZXBFcXVhbChcbiAgICAgICAgICAgICAgICBhY3R1YWxWYWx1ZSxcbiAgICAgICAgICAgICAgICBleHBlY3RhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgIG5ld0FjdHVhbFBhdGgsXG4gICAgICAgICAgICAgICAgbmV3RXhwZWN0YXRpb25QYXRoXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9KShhY3R1YWwsIGV4cGVjdGF0aW9uLCBcIiQxXCIsIFwiJDJcIik7XG59XG5cbmRlZXBFcXVhbEN5Y2xpYy51c2UgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsQ3ljbGljKGEsIGIsIG1hdGNoKTtcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWVwRXF1YWxDeWNsaWM7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5vYmplY3QudG9TdHJpbmc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW50ZXJuYWwgYENsYXNzYCBieSBjYWxsaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxuICogd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUgYXMgYHRoaXNgLiBSZXR1cm4gdmFsdWUgaXMgYSBgU3RyaW5nYCwgbmFtaW5nIHRoZVxuICogaW50ZXJuYWwgY2xhc3MsIGUuZy4gXCJBcnJheVwiXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgeyp9IHZhbHVlIC0gQW55IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgQ2xhc3NgIG9mIGB2YWx1ZWBcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xhc3ModmFsdWUpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnNwbGl0KC9bIFxcXV0vKVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRDbGFzcztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNOYU4gPSByZXF1aXJlKFwiLi9pcy1uYW5cIik7XG52YXIgaXNOZWdaZXJvID0gcmVxdWlyZShcIi4vaXMtbmVnLXplcm9cIik7XG5cbi8qKlxuICogU3RyaWN0IGVxdWFsaXR5IGNoZWNrIGFjY29yZGluZyB0byBFY21hU2NyaXB0IEhhcm1vbnkncyBgZWdhbGAuXG4gKlxuICogKipGcm9tIHRoZSBIYXJtb255IHdpa2k6KipcbiAqID4gQW4gYGVnYWxgIGZ1bmN0aW9uIHNpbXBseSBtYWtlcyBhdmFpbGFibGUgdGhlIGludGVybmFsIGBTYW1lVmFsdWVgIGZ1bmN0aW9uXG4gKiA+IGZyb20gc2VjdGlvbiA5LjEyIG9mIHRoZSBFUzUgc3BlYy4gSWYgdHdvIHZhbHVlcyBhcmUgZWdhbCwgdGhlbiB0aGV5IGFyZSBub3RcbiAqID4gb2JzZXJ2YWJseSBkaXN0aW5ndWlzaGFibGUuXG4gKlxuICogYGlkZW50aWNhbGAgcmV0dXJucyBgdHJ1ZWAgd2hlbiBgPT09YCBpcyBgdHJ1ZWAsIGV4Y2VwdCBmb3IgYC0wYCBhbmRcbiAqIGArMGAsIHdoZXJlIGl0IHJldHVybnMgYGZhbHNlYC4gQWRkaXRpb25hbGx5LCBpdCByZXR1cm5zIGB0cnVlYCB3aGVuXG4gKiBgTmFOYCBpcyBjb21wYXJlZCB0byBpdHNlbGYuXG4gKlxuICogQGFsaWFzIG1vZHVsZTpzYW1zYW0uaWRlbnRpY2FsXG4gKiBAcGFyYW0geyp9IG9iajEgVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSB7Kn0gb2JqMiBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBvYmplY3RzIGFyZSAqZWdhbCosIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aWNhbChvYmoxLCBvYmoyKSB7XG4gICAgaWYgKG9iajEgPT09IG9iajIgfHwgKGlzTmFOKG9iajEpICYmIGlzTmFOKG9iajIpKSkge1xuICAgICAgICByZXR1cm4gb2JqMSAhPT0gMCB8fCBpc05lZ1plcm8ob2JqMSkgPT09IGlzTmVnWmVybyhvYmoyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpY2FsO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBnZXRDbGFzcyA9IHJlcXVpcmUoXCIuL2dldC1jbGFzc1wiKTtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGBvYmplY3RgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5pc0FyZ3VtZW50c1xuICogQHBhcmFtICB7Kn0gIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCB3aGVuIGBvYmplY3RgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdFxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgICByZXR1cm4gZ2V0Q2xhc3Mob2JqZWN0KSA9PT0gXCJBcmd1bWVudHNcIjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmluZGV4T2Y7XG52YXIgbWFwID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5tYXA7XG52YXIgQVJSQVlfVFlQRVMgPSByZXF1aXJlKFwiLi9hcnJheS10eXBlc1wiKTtcbnZhciB0eXBlID0gcmVxdWlyZShcInR5cGUtZGV0ZWN0XCIpO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYW4gYXJyYXkgdHlwZSwgYGZhbHNlYCBvdGhlcndpc2VcbiAqXG4gKiBAcGFyYW0gIHsqfSAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYW4gYXJyYXkgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNBcnJheVR5cGUob2JqZWN0KSB7XG4gICAgcmV0dXJuIGluZGV4T2YobWFwKEFSUkFZX1RZUEVTLCBmdW5jdGlvbk5hbWUpLCB0eXBlKG9iamVjdCkpICE9PSAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5VHlwZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gYHZhbHVlYCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0RhdGV9ICB2YWx1ZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59ICAgICBgdHJ1ZWAgd2hlbiBgdmFsdWVgIGlzIGFuIGluc3RhbmNlIG9mIERhdGVcbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0RhdGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGRpdiA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gYG9iamVjdGAgaXMgYSBET00gZWxlbWVudCBub2RlLlxuICpcbiAqIFVubGlrZSBVbmRlcnNjb3JlLmpzL2xvZGFzaCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBgZmFsc2VgIGlmIGBvYmplY3RgXG4gKiBpcyBhbiAqZWxlbWVudC1saWtlKiBvYmplY3QsIGkuZS4gYSByZWd1bGFyIG9iamVjdCB3aXRoIGEgYG5vZGVUeXBlYFxuICogcHJvcGVydHkgdGhhdCBob2xkcyB0aGUgdmFsdWUgYDFgLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6c2Ftc2FtLmlzRWxlbWVudFxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBmb3IgRE9NIGVsZW1lbnQgbm9kZXNcbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICAgIGlmICghb2JqZWN0IHx8IG9iamVjdC5ub2RlVHlwZSAhPT0gMSB8fCAhZGl2KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIG9iamVjdC5yZW1vdmVDaGlsZChkaXYpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VsZW1lbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGB2YWx1ZWAgaXMgYSBNYXBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIEEgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCB3aGVuIGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYE1hcGAsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc01hcCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29tcGFyZXMgYSBgdmFsdWVgIHRvIGBOYU5gXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiBgdmFsdWVgIGlzIGBOYU5gXG4gKi9cbmZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgLy8gVW5saWtlIGdsb2JhbCBgaXNOYU5gLCB0aGlzIGZ1bmN0aW9uIGF2b2lkcyB0eXBlIGNvZXJjaW9uXG4gICAgLy8gYHR5cGVvZmAgY2hlY2sgYXZvaWRzIElFIGhvc3Qgb2JqZWN0IGlzc3VlcywgaGF0IHRpcCB0b1xuICAgIC8vIGxvZGFzaFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTmFOO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBgdmFsdWVgIGlzIGAtMGBcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5pc05lZ1plcm9cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiBgdmFsdWVgIGlzIGAtMGBcbiAqL1xuZnVuY3Rpb24gaXNOZWdaZXJvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA9PT0gLUluZmluaXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTmVnWmVybztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVndWxhciBPYmplY3QgYW5kIG5vdCBhIHNwZWNpYWxpemVkIE9iamVjdFxuICpcbiAqIFRoaXMgaGVscHMgc3BlZWQgdXAgZGVlcEVxdWFsIGN5Y2xpYyBjaGVja3NcbiAqXG4gKiBUaGUgcHJlbWlzZSBpcyB0aGF0IG9ubHkgT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRoZSB2aXNpdGVkIGFycmF5LlxuICogU28gaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoZVxuICogZXhwZW5zaXZlIG9wZXJhdGlvbiBvZiBzZWFyY2hpbmcgZm9yIHRoZSB2YWx1ZSBpbiB0aGUgdGhlIGFycmF5IG9mIGFscmVhZHlcbiAqIHZpc2l0ZWQgb2JqZWN0c1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgdmFsdWUgVGhlIG9iamVjdCB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gICAgICAgYHRydWVgIHdoZW4gdGhlIG9iamVjdCBpcyBhIG5vbi1zcGVjaWFsaXNlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgLy8gbm9uZSBvZiB0aGVzZSBhcmUgY29sbGVjdGlvbiBvYmplY3RzLCBzbyB3ZSBjYW4gcmV0dXJuIGZhbHNlXG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSAmJlxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSAmJlxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJlxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKVxuICAgICk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBTZXQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKlxuICogQGFsaWFzIG1vZHVsZTpzYW1zYW0uaXNTZXRcbiAqIEBwYXJhbSAgeyp9ICB2YWwgLSBBIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBTZXQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlzU2V0KHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIFNldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgaW5zdGFuY2VvZiBTZXQpIHx8IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2V0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBmb3JFYWNoID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5zZXQuZm9yRWFjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGBzMWAgaXMgYSBzdWJzZXQgb2YgYHMyYCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7QXJyYXl8U2V0fSAgczEgICAgICBUaGUgdGFyZ2V0IHZhbHVlXG4gKiBAcGFyYW0gIHtBcnJheXxTZXR9ICBzMiAgICAgIFRoZSBjb250YWluaW5nIHZhbHVlXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNvbXBhcmUgQSBjb21wYXJpc29uIGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIGB0cnVlYCB3aGVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGVxdWFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgd2hlbiBgczFgIGlzIGEgc3Vic2V0IG9mIGBzMmAsIGBmYWxzZWBgIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1N1YnNldChzMSwgczIsIGNvbXBhcmUpIHtcbiAgICB2YXIgYWxsQ29udGFpbmVkID0gdHJ1ZTtcbiAgICBmb3JFYWNoKHMxLCBmdW5jdGlvbih2MSkge1xuICAgICAgICB2YXIgaW5jbHVkZXMgPSBmYWxzZTtcbiAgICAgICAgZm9yRWFjaChzMiwgZnVuY3Rpb24odjIpIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlKHYyLCB2MSkpIHtcbiAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBhbGxDb250YWluZWQgPSBhbGxDb250YWluZWQgJiYgaW5jbHVkZXM7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWxsQ29udGFpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3Vic2V0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzbGljZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuc3RyaW5nLnNsaWNlO1xudmFyIHR5cGVPZiA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnR5cGVPZjtcbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VuYXRpb24gb2YgYW4gaXRlcmFibGUgb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IG9iaiBUaGUgaXRlcmFibGUgb2JqZWN0IHRvIHN0cmluZ2lmeVxuICogQHJldHVybnMge3N0cmluZ30gICAgIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhYmxlVG9TdHJpbmcob2JqKSB7XG4gICAgaWYgKHR5cGVPZihvYmopID09PSBcIm1hcFwiKSB7XG4gICAgICAgIHJldHVybiBtYXBUb1N0cmluZyhvYmopO1xuICAgIH1cblxuICAgIHJldHVybiBnZW5lcmljSXRlcmFibGVUb1N0cmluZyhvYmopO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBNYXBcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge01hcH0gbWFwICAgIFRoZSBtYXAgdG8gc3RyaW5naWZ5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZnVuY3Rpb24gbWFwVG9TdHJpbmcobWFwKSB7XG4gICAgdmFyIHJlcHJlc2VudGF0aW9uID0gXCJcIjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc2lub25qcy9uby1wcm90b3R5cGUtbWV0aG9kcy9uby1wcm90b3R5cGUtbWV0aG9kc1xuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmVwcmVzZW50YXRpb24gKz0gXCJbXCIgKyBzdHJpbmdpZnkoa2V5KSArIFwiLFwiICsgc3RyaW5naWZ5KHZhbHVlKSArIFwiXSxcIjtcbiAgICB9KTtcblxuICAgIHJlcHJlc2VudGF0aW9uID0gc2xpY2UocmVwcmVzZW50YXRpb24sIDAsIC0xKTtcbiAgICByZXR1cm4gcmVwcmVzZW50YXRpb247XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VuYXRpb24gZm9yIGFuIGl0ZXJhYmxlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IGl0ZXJhYmxlIFRoZSBpdGVyYWJsZSB0byBzdHJpbmdpZnlcbiAqIEByZXR1cm5zIHtzdHJpbmd9ICAgICAgICAgIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyaWNJdGVyYWJsZVRvU3RyaW5nKGl0ZXJhYmxlKSB7XG4gICAgdmFyIHJlcHJlc2VudGF0aW9uID0gXCJcIjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc2lub25qcy9uby1wcm90b3R5cGUtbWV0aG9kcy9uby1wcm90b3R5cGUtbWV0aG9kc1xuICAgIGl0ZXJhYmxlLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVwcmVzZW50YXRpb24gKz0gc3RyaW5naWZ5KHZhbHVlKSArIFwiLFwiO1xuICAgIH0pO1xuXG4gICAgcmVwcmVzZW50YXRpb24gPSBzbGljZShyZXByZXNlbnRhdGlvbiwgMCwgLTEpO1xuICAgIHJldHVybiByZXByZXNlbnRhdGlvbjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXNzZWQgYGl0ZW1gXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge29iamVjdH0gaXRlbSBUaGUgaXRlbSB0byBzdHJpbmdpZnlcbiAqIEByZXR1cm5zIHtzdHJpbmd9ICAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYGl0ZW1gXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeShpdGVtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBpdGVtICsgXCInXCIgOiB2YWx1ZVRvU3RyaW5nKGl0ZW0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGl0ZXJhYmxlVG9TdHJpbmc7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZy5pbmRleE9mO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5LmZvckVhY2g7XG52YXIgdHlwZSA9IHJlcXVpcmUoXCJ0eXBlLWRldGVjdFwiKTtcblxudmFyIGVuZ2luZUNhbkNvbXBhcmVNYXBzID0gdHlwZW9mIEFycmF5LmZyb20gPT09IFwiZnVuY3Rpb25cIjtcbnZhciBkZWVwRXF1YWwgPSByZXF1aXJlKFwiLi9kZWVwLWVxdWFsXCIpLnVzZShtYXRjaCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbnZhciBpc0FycmF5VHlwZSA9IHJlcXVpcmUoXCIuL2lzLWFycmF5LXR5cGVcIik7XG52YXIgaXNTdWJzZXQgPSByZXF1aXJlKFwiLi9pcy1zdWJzZXRcIik7XG52YXIgY3JlYXRlTWF0Y2hlciA9IHJlcXVpcmUoXCIuL2NyZWF0ZS1tYXRjaGVyXCIpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGBhcnJheWAgY29udGFpbnMgYWxsIG9mIGBzdWJzZXRgIGFzIGRlZmluZWQgYnkgdGhlIGBjb21wYXJlYFxuICogYXJndW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gYXJyYXkgICBBbiBhcnJheSB0byBzZWFyY2ggZm9yIGEgc3Vic2V0XG4gKiBAcGFyYW0gIHtBcnJheX0gc3Vic2V0ICBUaGUgc3Vic2V0IHRvIGZpbmQgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY29tcGFyZSBBIGNvbXBhcmlzb24gZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyYXksIHN1YnNldCwgY29tcGFyZSkge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgaSwgbCwgaiwgaztcbiAgICBmb3IgKGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmIChjb21wYXJlKGFycmF5W2ldLCBzdWJzZXRbMF0pKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwLCBrID0gc3Vic2V0Lmxlbmd0aDsgaiA8IGs7ICsraikge1xuICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlKGFycmF5W2kgKyBqXSwgc3Vic2V0W2pdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4vKipcbiAqIE1hdGNoZXMgYW4gb2JqZWN0IHdpdGggYSBtYXRjaGVyIChvciB2YWx1ZSlcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOnNhbXNhbS5tYXRjaFxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IGNhbmRpZGF0ZSB0byBtYXRjaFxuICogQHBhcmFtIHtvYmplY3R9IG1hdGNoZXJPclZhbHVlIEEgbWF0Y2hlciBvciB2YWx1ZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSB3aGVuIGBvYmplY3RgIG1hdGNoZXMgYG1hdGNoZXJPclZhbHVlYFxuICovXG5mdW5jdGlvbiBtYXRjaChvYmplY3QsIG1hdGNoZXJPclZhbHVlKSB7XG4gICAgaWYgKG1hdGNoZXJPclZhbHVlICYmIHR5cGVvZiBtYXRjaGVyT3JWYWx1ZS50ZXN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXJPclZhbHVlLnRlc3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUobWF0Y2hlck9yVmFsdWUpKSB7XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlck9yVmFsdWUgPT09IG9iamVjdDtcbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlck9yVmFsdWUob2JqZWN0KSA9PT0gdHJ1ZTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgdmFyIG5vdE51bGwgPSB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiIHx8IEJvb2xlYW4ob2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbm90TnVsbCAmJlxuICAgICAgICAgICAgICAgIGluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlVG9TdHJpbmcob2JqZWN0KS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3JWYWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgKSA+PSAwXG4gICAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09IFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgaWYgKHR5cGUob2JqZWN0KSA9PT0gXCJEYXRlXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LmdldFRpbWUoKSA9PT0gbWF0Y2hlck9yVmFsdWUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHRoaXMgaXMgYmFzaWNhbGx5IHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiwgd2hpY2ggaXMgY292ZXJlZCAqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50OEFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgICAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDE2QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkludDMyQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIlVpbnQzMkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBpc0FycmF5VHlwZShtYXRjaGVyT3JWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICBhcnJheUNvbnRhaW5zKG9iamVjdCwgbWF0Y2hlck9yVmFsdWUsIG1hdGNoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHRoaXMgaXMgY292ZXJlZCBieSBhIHRlc3QsIHRoYXQgaXMgb25seSBydW4gaW4gSUUsIGJ1dCB3ZSBjb2xsZWN0IGNvdmVyYWdlIGluZm9ybWF0aW9uIGluIG5vZGUqL1xuICAgICAgICAgICAgaWYgKCFlbmdpbmVDYW5Db21wYXJlTWFwcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUaGUgSmF2YVNjcmlwdCBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBBcnJheS5mcm9tIGFuZCBjYW5ub3QgcmVsaWFibHkgZG8gdmFsdWUgY29tcGFyaXNvbiBvZiBNYXAgaW5zdGFuY2VzXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGUob2JqZWN0KSA9PT0gXCJNYXBcIiAmJlxuICAgICAgICAgICAgICAgIGFycmF5Q29udGFpbnMoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20ob2JqZWN0KSxcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbShtYXRjaGVyT3JWYWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZShvYmplY3QpKSB7XG4gICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgIHJldHVybiBpc1N1YnNldChtYXRjaGVyT3JWYWx1ZSwgb2JqZWN0LCBtYXRjaCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChtYXRjaGVyT3JWYWx1ZSAmJiB0eXBlb2YgbWF0Y2hlck9yVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKG1hdGNoZXJPclZhbHVlID09PSBvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb3A7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgICAgZm9yIChwcm9wIGluIG1hdGNoZXJPclZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3RbcHJvcF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG9iamVjdC5nZXRBdHRyaWJ1dGUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBvYmplY3QuZ2V0QXR0cmlidXRlKHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1hdGNoZXJPclZhbHVlW3Byb3BdID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hdGNoZXJPclZhbHVlW3Byb3BdID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG1hdGNoZXJPclZhbHVlW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgICAgICFkZWVwRXF1YWwodmFsdWUsIG1hdGNoZXJPclZhbHVlW3Byb3BdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWF0Y2hlciB3YXMgYW4gdW5rbm93biBvciB1bnN1cHBvcnRlZCB0eXBlXCIpO1xufVxuLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbmZvckVhY2goT2JqZWN0LmtleXMoY3JlYXRlTWF0Y2hlciksIGZ1bmN0aW9uKGtleSkge1xuICAgIG1hdGNoW2tleV0gPSBjcmVhdGVNYXRjaGVyW2tleV07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIEBtb2R1bGUgc2Ftc2FtXG4gKi9cbnZhciBpZGVudGljYWwgPSByZXF1aXJlKFwiLi9pZGVudGljYWxcIik7XG52YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKFwiLi9pcy1hcmd1bWVudHNcIik7XG52YXIgaXNFbGVtZW50ID0gcmVxdWlyZShcIi4vaXMtZWxlbWVudFwiKTtcbnZhciBpc05lZ1plcm8gPSByZXF1aXJlKFwiLi9pcy1uZWctemVyb1wiKTtcbnZhciBpc1NldCA9IHJlcXVpcmUoXCIuL2lzLXNldFwiKTtcbnZhciBpc01hcCA9IHJlcXVpcmUoXCIuL2lzLW1hcFwiKTtcbnZhciBtYXRjaCA9IHJlcXVpcmUoXCIuL21hdGNoXCIpO1xudmFyIGRlZXBFcXVhbEN5Y2xpYyA9IHJlcXVpcmUoXCIuL2RlZXAtZXF1YWxcIikudXNlKG1hdGNoKTtcbnZhciBjcmVhdGVNYXRjaGVyID0gcmVxdWlyZShcIi4vY3JlYXRlLW1hdGNoZXJcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGNyZWF0ZU1hdGNoZXI6IGNyZWF0ZU1hdGNoZXIsXG4gICAgZGVlcEVxdWFsOiBkZWVwRXF1YWxDeWNsaWMsXG4gICAgaWRlbnRpY2FsOiBpZGVudGljYWwsXG4gICAgaXNBcmd1bWVudHM6IGlzQXJndW1lbnRzLFxuICAgIGlzRWxlbWVudDogaXNFbGVtZW50LFxuICAgIGlzTWFwOiBpc01hcCxcbiAgICBpc05lZ1plcm86IGlzTmVnWmVybyxcbiAgICBpc1NldDogaXNTZXQsXG4gICAgbWF0Y2g6IG1hdGNoXG59O1xuIiwiLy8gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbi8vIFNlZSBMSUNFTlNFLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG52YXIgZW5jb2RpbmcgPSByZXF1aXJlKFwiLi9saWIvZW5jb2RpbmcuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBUZXh0RW5jb2RlcjogZW5jb2RpbmcuVGV4dEVuY29kZXIsXG4gIFRleHREZWNvZGVyOiBlbmNvZGluZy5UZXh0RGVjb2Rlcixcbn07XG4iLCIoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuICB9XG5cbiAgZ2xvYmFsW1wiZW5jb2RpbmctaW5kZXhlc1wiXSA9XG57XG4gIFwiYmlnNVwiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxNzM5MiwxOTUwNiwxNzkyMywxNzgzMCwxNzc4NCwxNjAzNTksMTk4MzEsMTc4NDMsMTYyOTkzLDE5NjgyLDE2MzAxMywxNTI1MywxODIzMCwxODI0NCwxOTUyNywxOTUyMCwxNDgxNTksMTQ0OTE5LDE2MDU5NCwxNTkzNzEsMTU5OTU0LDE5NTQzLDE3Mjg4MSwxODI1NSwxNzg4MiwxOTU4OSwxNjI5MjQsMTk3MTksMTkxMDgsMTgwODEsMTU4NDk5LDI5MjIxLDE1NDE5NiwxMzc4MjcsMTQ2OTUwLDE0NzI5NywyNjE4OSwyMjI2NyxudWxsLDMyMTQ5LDIyODEzLDE2Njg0MSwxNTg2MCwzODcwOCwxNjI3OTksMjM1MTUsMTM4NTkwLDIzMjA0LDEzODYxLDE3MTY5NiwyMzI0OSwyMzQ3OSwyMzgwNCwyNjQ3OCwzNDE5NSwxNzAzMDksMjk3OTMsMjk4NTMsMTQ0NTMsMTM4NTc5LDE0NTA1NCwxNTU2ODEsMTYxMDgsMTUzODIyLDE1MDkzLDMxNDg0LDQwODU1LDE0NzgwOSwxNjYxNTcsMTQzODUwLDEzMzc3MCwxNDM5NjYsMTcxNjIsMzM5MjQsNDA4NTQsMzc5MzUsMTg3MzYsMzQzMjMsMjI2NzgsMzg3MzAsMzc0MDAsMzExODQsMzEyODIsMjYyMDgsMjcxNzcsMzQ5NzMsMjk3NzIsMzE2ODUsMjY0OTgsMzEyNzYsMjEwNzEsMzY5MzQsMTM1NDIsMjk2MzYsMTU1MDY1LDI5ODk0LDQwOTAzLDIyNDUxLDE4NzM1LDIxNTgwLDE2Njg5LDE0NTAzOCwyMjU1MiwzMTM0NiwxNjI2NjEsMzU3MjcsMTgwOTQsMTU5MzY4LDE2NzY5LDE1NTAzMywzMTY2MiwxNDA0NzYsNDA5MDQsMTQwNDgxLDE0MDQ4OSwxNDA0OTIsNDA5MDUsMzQwNTIsMTQ0ODI3LDE2NTY0LDQwOTA2LDE3NjMzLDE3NTYxNSwyNTI4MSwyODc4Miw0MDkwNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEyNzM2LDEyNzM3LDEyNzM4LDEyNzM5LDEyNzQwLDEzMTM0MCwxMjc0MSwxMzEyODEsMTMxMjc3LDEyNzQyLDEyNzQzLDEzMTI3NSwxMzkyNDAsMTI3NDQsMTMxMjc0LDEyNzQ1LDEyNzQ2LDEyNzQ3LDEyNzQ4LDEzMTM0MiwxMjc0OSwxMjc1MCwyNTYsMTkzLDQ2MSwxOTIsMjc0LDIwMSwyODIsMjAwLDMzMiwyMTEsNDY1LDIxMCxudWxsLDc4NzAsbnVsbCw3ODcyLDIwMiwyNTcsMjI1LDQ2MiwyMjQsNTkzLDI3NSwyMzMsMjgzLDIzMiwyOTksMjM3LDQ2NCwyMzYsMzMzLDI0Myw0NjYsMjQyLDM2MywyNTAsNDY4LDI0OSw0NzAsNDcyLDQ3NCw0NzYsMjUyLG51bGwsNzg3MSxudWxsLDc4NzMsMjM0LDYwOSw5MTc4LDkxNzksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTcyOTY5LDEzNTQ5MyxudWxsLDI1ODY2LG51bGwsbnVsbCwyMDAyOSwyODM4MSw0MDI3MCwzNzM0MyxudWxsLG51bGwsMTYxNTg5LDI1NzQ1LDIwMjUwLDIwMjY0LDIwMzkyLDIwODIyLDIwODUyLDIwODkyLDIwOTY0LDIxMTUzLDIxMTYwLDIxMzA3LDIxMzI2LDIxNDU3LDIxNDY0LDIyMjQyLDIyNzY4LDIyNzg4LDIyNzkxLDIyODM0LDIyODM2LDIzMzk4LDIzNDU0LDIzNDU1LDIzNzA2LDI0MTk4LDI0NjM1LDI1OTkzLDI2NjIyLDI2NjI4LDI2NzI1LDI3OTgyLDI4ODYwLDMwMDA1LDMyNDIwLDMyNDI4LDMyNDQyLDMyNDU1LDMyNDYzLDMyNDc5LDMyNTE4LDMyNTY3LDMzNDAyLDMzNDg3LDMzNjQ3LDM1MjcwLDM1Nzc0LDM1ODEwLDM2NzEwLDM2NzExLDM2NzE4LDI5NzEzLDMxOTk2LDMyMjA1LDI2OTUwLDMxNDMzLDIxMDMxLG51bGwsbnVsbCxudWxsLG51bGwsMzcyNjAsMzA5MDQsMzcyMTQsMzI5NTYsbnVsbCwzNjEwNywzMzAxNCwxMzM2MDcsbnVsbCxudWxsLDMyOTI3LDQwNjQ3LDE5NjYxLDQwMzkzLDQwNDYwLDE5NTE4LDE3MTUxMCwxNTk3NTgsNDA0NTgsMTcyMzM5LDEzNzYxLG51bGwsMjgzMTQsMzMzNDIsMjk5NzcsbnVsbCwxODcwNSwzOTUzMiwzOTU2Nyw0MDg1NywzMTExMSwxNjQ5NzIsMTM4Njk4LDEzMjU2MCwxNDIwNTQsMjAwMDQsMjAwOTcsMjAwOTYsMjAxMDMsMjAxNTksMjAyMDMsMjAyNzksMTMzODgsMjA0MTMsMTU5NDQsMjA0ODMsMjA2MTYsMTM0MzcsMTM0NTksMTM0NzcsMjA4NzAsMjI3ODksMjA5NTUsMjA5ODgsMjA5OTcsMjAxMDUsMjExMTMsMjExMzYsMjEyODcsMTM3NjcsMjE0MTcsMTM2NDksMjE0MjQsMTM2NTEsMjE0NDIsMjE1MzksMTM2NzcsMTM2ODIsMTM5NTMsMjE2NTEsMjE2NjcsMjE2ODQsMjE2ODksMjE3MTIsMjE3NDMsMjE3ODQsMjE3OTUsMjE4MDAsMTM3MjAsMjE4MjMsMTM3MzMsMTM3NTksMjE5NzUsMTM3NjUsMTYzMjA0LDIxNzk3LG51bGwsMTM0MjEwLDEzNDQyMSwxNTE4NTEsMjE5MDQsMTQyNTM0LDE0ODI4LDEzMTkwNSwzNjQyMiwxNTA5NjgsMTY5MTg5LDE2NDY3LDE2NDAzMCwzMDU4NiwxNDIzOTIsMTQ5MDAsMTgzODksMTY0MTg5LDE1ODE5NCwxNTEwMTgsMjU4MjEsMTM0NTI0LDEzNTA5MiwxMzQzNTcsMTM1NDEyLDI1NzQxLDM2NDc4LDEzNDgwNiwxMzQxNTUsMTM1MDEyLDE0MjUwNSwxNjQ0MzgsMTQ4NjkxLG51bGwsMTM0NDcwLDE3MDU3MywxNjQwNzMsMTg0MjAsMTUxMjA3LDE0MjUzMCwzOTYwMiwxNDk1MSwxNjk0NjAsMTYzNjUsMTM1NzQsMTUyMjYzLDE2OTk0MCwxNjE5OTIsMTQyNjYwLDQwMzAyLDM4OTMzLG51bGwsMTczNjksMTU1ODEzLDI1NzgwLDIxNzMxLDE0MjY2OCwxNDIyODIsMTM1Mjg3LDE0ODQzLDEzNTI3OSwxNTc0MDIsMTU3NDYyLDE2MjIwOCwyNTgzNCwxNTE2MzQsMTM0MjExLDM2NDU2LDEzOTY4MSwxNjY3MzIsMTMyOTEzLG51bGwsMTg0NDMsMTMxNDk3LDE2Mzc4LDIyNjQzLDE0MjczMyxudWxsLDE0ODkzNiwxMzIzNDgsMTU1Nzk5LDEzNDk4OCwxMzQ1NTAsMjE4ODEsMTY1NzEsMTczMzgsbnVsbCwxOTEyNCwxNDE5MjYsMTM1MzI1LDMzMTk0LDM5MTU3LDEzNDU1NiwyNTQ2NSwxNDg0NiwxNDExNzMsMzYyODgsMjIxNzcsMjU3MjQsMTU5MzksbnVsbCwxNzM1NjksMTM0NjY1LDE0MjAzMSwxNDI1MzcsbnVsbCwxMzUzNjgsMTQ1ODU4LDE0NzM4LDE0ODU0LDE2NDUwNywxMzY4OCwxNTUyMDksMTM5NDYzLDIyMDk4LDEzNDk2MSwxNDI1MTQsMTY5NzYwLDEzNTAwLDI3NzA5LDE1MTA5OSxudWxsLG51bGwsMTYxMTQwLDE0Mjk4NywxMzk3ODQsMTczNjU5LDE2NzExNywxMzQ3NzgsMTM0MTk2LDE1NzcyNCwzMjY1OSwxMzUzNzUsMTQxMzE1LDE0MTYyNSwxMzgxOSwxNTIwMzUsMTM0Nzk2LDEzNTA1MywxMzQ4MjYsMTYyNzUsMTM0OTYwLDEzNDQ3MSwxMzU1MDMsMTM0NzMyLG51bGwsMTM0ODI3LDEzNDA1NywxMzQ0NzIsMTM1MzYwLDEzNTQ4NSwxNjM3NywxNDA5NTAsMjU2NTAsMTM1MDg1LDE0NDM3MiwxNjEzMzcsMTQyMjg2LDEzNDUyNiwxMzQ1MjcsMTQyNDE3LDE0MjQyMSwxNDg3MiwxMzQ4MDgsMTM1MzY3LDEzNDk1OCwxNzM2MTgsMTU4NTQ0LDE2NzEyMiwxNjczMjEsMTY3MTE0LDM4MzE0LDIxNzA4LDMzNDc2LDIxOTQ1LG51bGwsMTcxNzE1LDM5OTc0LDM5NjA2LDE2MTYzMCwxNDI4MzAsMjg5OTIsMzMxMzMsMzMwMDQsMjM1ODAsMTU3MDQyLDMzMDc2LDE0MjMxLDIxMzQzLDE2NDAyOSwzNzMwMiwxMzQ5MDYsMTM0NjcxLDEzNDc3NSwxMzQ5MDcsMTM3ODksMTUxMDE5LDEzODMzLDEzNDM1OCwyMjE5MSwxNDEyMzcsMTM1MzY5LDEzNDY3MiwxMzQ3NzYsMTM1Mjg4LDEzNTQ5NiwxNjQzNTksMTM2Mjc3LDEzNDc3NywxNTExMjAsMTQyNzU2LDIzMTI0LDEzNTE5NywxMzUxOTgsMTM1NDEzLDEzNTQxNCwyMjQyOCwxMzQ2NzMsMTYxNDI4LDE2NDU1NywxMzUwOTMsMTM0Nzc5LDE1MTkzNCwxNDA4MywxMzUwOTQsMTM1NTUyLDE1MjI4MCwxNzI3MzMsMTQ5OTc4LDEzNzI3NCwxNDc4MzEsMTY0NDc2LDIyNjgxLDIxMDk2LDEzODUwLDE1MzQwNSwzMTY2NiwyMzQwMCwxODQzMiwxOTI0NCw0MDc0MywxODkxOSwzOTk2NywzOTgyMSwxNTQ0ODQsMTQzNjc3LDIyMDExLDEzODEwLDIyMTUzLDIwMDA4LDIyNzg2LDEzODE3NywxOTQ2ODAsMzg3MzcsMTMxMjA2LDIwMDU5LDIwMTU1LDEzNjMwLDIzNTg3LDI0NDAxLDI0NTE2LDE0NTg2LDI1MTY0LDI1OTA5LDI3NTE0LDI3NzAxLDI3NzA2LDI4NzgwLDI5MjI3LDIwMDEyLDI5MzU3LDE0OTczNywzMjU5NCwzMTAzNSwzMTk5MywzMjU5NSwxNTYyNjYsMTM1MDUsbnVsbCwxNTY0OTEsMzI3NzAsMzI4OTYsMTU3MjAyLDE1ODAzMywyMTM0MSwzNDkxNiwzNTI2NSwxNjE5NzAsMzU3NDQsMzYxMjUsMzgwMjEsMzgyNjQsMzgyNzEsMzgzNzYsMTY3NDM5LDM4ODg2LDM5MDI5LDM5MTE4LDM5MTM0LDM5MjY3LDE3MDAwMCw0MDA2MCw0MDQ3OSw0MDY0NCwyNzUwMyw2Mzc1MSwyMDAyMywxMzEyMDcsMzg0MjksMjUxNDMsMzgwNTAsbnVsbCwyMDUzOSwyODE1OCwxNzExMjMsNDA4NzAsMTU4MTcsMzQ5NTksMTQ3NzkwLDI4NzkxLDIzNzk3LDE5MjMyLDE1MjAxMywxMzY1NywxNTQ5MjgsMjQ4NjYsMTY2NDUwLDM2Nzc1LDM3MzY2LDI5MDczLDI2MzkzLDI5NjI2LDE0NDAwMSwxNzIyOTUsMTU0OTksMTM3NjAwLDE5MjE2LDMwOTQ4LDI5Njk4LDIwOTEwLDE2NTY0NywxNjM5MywyNzIzNSwxNzI3MzAsMTY5MzEsMzQzMTksMTMzNzQzLDMxMjc0LDE3MDMxMSwxNjY2MzQsMzg3NDEsMjg3NDksMjEyODQsMTM5MzkwLDM3ODc2LDMwNDI1LDE2NjM3MSw0MDg3MSwzMDY4NSwyMDEzMSwyMDQ2NCwyMDY2OCwyMDAxNSwyMDI0Nyw0MDg3MiwyMTU1NiwzMjEzOSwyMjY3NCwyMjczNiwxMzg2NzgsMjQyMTAsMjQyMTcsMjQ1MTQsMTQxMDc0LDI1OTk1LDE0NDM3NywyNjkwNSwyNzIwMywxNDY1MzEsMjc5MDMsbnVsbCwyOTE4NCwxNDg3NDEsMjk1ODAsMTYwOTEsMTUwMDM1LDIzMzE3LDI5ODgxLDM1NzE1LDE1NDc4OCwxNTMyMzcsMzEzNzksMzE3MjQsMzE5MzksMzIzNjQsMzM1MjgsMzQxOTksNDA4NzMsMzQ5NjAsNDA4NzQsMzY1MzcsNDA4NzUsMzY4MTUsMzQxNDMsMzkzOTIsMzc0MDksNDA4NzYsMTY3MzUzLDEzNjI1NSwxNjQ5NywxNzA1OCwyMzA2NixudWxsLG51bGwsbnVsbCwzOTAxNiwyNjQ3NSwxNzAxNCwyMjMzMyxudWxsLDM0MjYyLDE0OTg4MywzMzQ3MSwxNjAwMTMsMTk1ODUsMTU5MDkyLDIzOTMxLDE1ODQ4NSwxNTk2NzgsNDA4NzcsNDA4NzgsMjM0NDYsNDA4NzksMjYzNDMsMzIzNDcsMjgyNDcsMzExNzgsMTU3NTIsMTc2MDMsMTQzOTU4LDE0MTIwNiwxNzMwNiwxNzcxOCxudWxsLDIzNzY1LDE0NjIwMiwzNTU3NywyMzY3MiwxNTYzNCwxNDQ3MjEsMjM5MjgsNDA4ODIsMjkwMTUsMTc3NTIsMTQ3NjkyLDEzODc4NywxOTU3NSwxNDcxMiwxMzM4NiwxMzE0OTIsMTU4Nzg1LDM1NTMyLDIwNDA0LDEzMTY0MSwyMjk3NSwzMzEzMiwzODk5OCwxNzAyMzQsMjQzNzksMTM0MDQ3LG51bGwsMTM5NzEzLDE2NjI1MywxNjY0MiwxODEwNywxNjgwNTcsMTYxMzUsNDA4ODMsMTcyNDY5LDE2NjMyLDE0Mjk0LDE4MTY3LDE1ODc5MCwxNjc2NCwxNjU1NTQsMTYwNzY3LDE3NzczLDE0NTQ4LDE1MjczMCwxNzc2MSwxNzY5MSwxOTg0OSwxOTU3OSwxOTgzMCwxNzg5OCwxNjMyOCwxNTAyODcsMTM5MjEsMTc2MzAsMTc1OTcsMTY4NzcsMjM4NzAsMjM4ODAsMjM4OTQsMTU4NjgsMTQzNTEsMjM5NzIsMjM5OTMsMTQzNjgsMTQzOTIsMjQxMzAsMjQyNTMsMjQzNTcsMjQ0NTEsMTQ2MDAsMTQ2MTIsMTQ2NTUsMTQ2NjksMjQ3OTEsMjQ4OTMsMjM3ODEsMTQ3MjksMjUwMTUsMjUwMTcsMjUwMzksMTQ3NzYsMjUxMzIsMjUyMzIsMjUzMTcsMjUzNjgsMTQ4NDAsMjIxOTMsMTQ4NTEsMjU1NzAsMjU1OTUsMjU2MDcsMjU2OTAsMTQ5MjMsMjU3OTIsMjM4MjksMjIwNDksNDA4NjMsMTQ5OTksMjU5OTAsMTUwMzcsMjYxMTEsMjYxOTUsMTUwOTAsMjYyNTgsMTUxMzgsMjYzOTAsMTUxNzAsMjY1MzIsMjY2MjQsMTUxOTIsMjY2OTgsMjY3NTYsMTUyMTgsMTUyMTcsMTUyMjcsMjY4ODksMjY5NDcsMjkyNzYsMjY5ODAsMjcwMzksMjcwMTMsMTUyOTIsMjcwOTQsMTUzMjUsMjcyMzcsMjcyNTIsMjcyNDksMjcyNjYsMTUzNDAsMjcyODksMTUzNDYsMjczMDcsMjczMTcsMjczNDgsMjczODIsMjc1MjEsMjc1ODUsMjc2MjYsMjc3NjUsMjc4MTgsMTU1NjMsMjc5MDYsMjc5MTAsMjc5NDIsMjgwMzMsMTU1OTksMjgwNjgsMjgwODEsMjgxODEsMjgxODQsMjgyMDEsMjgyOTQsMTY2MzM2LDI4MzQ3LDI4Mzg2LDI4Mzc4LDQwODMxLDI4MzkyLDI4MzkzLDI4NDUyLDI4NDY4LDE1Njg2LDE0NzI2NSwyODU0NSwyODYwNiwxNTcyMiwxNTczMywyOTExMSwyMzcwNSwxNTc1NCwyODcxNiwxNTc2MSwyODc1MiwyODc1NiwyODc4MywyODc5OSwyODgwOSwxMzE4NzcsMTczNDUsMTM4MDksMTM0ODcyLDE0NzE1OSwyMjQ2MiwxNTk0NDMsMjg5OTAsMTUzNTY4LDEzOTAyLDI3MDQyLDE2Njg4OSwyMzQxMiwzMTMwNSwxNTM4MjUsMTY5MTc3LDMxMzMzLDMxMzU3LDE1NDAyOCwzMTQxOSwzMTQwOCwzMTQyNiwzMTQyNywyOTEzNywxNTY4MTMsMTY4NDIsMzE0NTAsMzE0NTMsMzE0NjYsMTY4NzksMjE2ODIsMTU0NjI1LDMxNDk5LDMxNTczLDMxNTI5LDE1MjMzNCwxNTQ4NzgsMzE2NTAsMzE1OTksMzM2OTIsMTU0NTQ4LDE1ODg0NywzMTY5NiwzMzgyNSwzMTYzNCwzMTY3MiwxNTQ5MTIsMTU3ODksMTU0NzI1LDMzOTM4LDMxNzM4LDMxNzUwLDMxNzk3LDE1NDgxNywzMTgxMiwzMTg3NSwxNDk2MzQsMzE5MTAsMjYyMzcsMTQ4ODU2LDMxOTQ1LDMxOTQzLDMxOTc0LDMxODYwLDMxOTg3LDMxOTg5LDMxOTUwLDMyMzU5LDE3NjkzLDE1OTMwMCwzMjA5MywxNTk0NDYsMjk4MzcsMzIxMzcsMzIxNzEsMjg5ODEsMzIxNzksMzIyMTAsMTQ3NTQzLDE1NTY4OSwzMjIyOCwxNTYzNSwzMjI0NSwxMzcyMDksMzIyMjksMTY0NzE3LDMyMjg1LDE1NTkzNywxNTU5OTQsMzIzNjYsMzI0MDIsMTcxOTUsMzc5OTYsMzIyOTUsMzI1NzYsMzI1NzcsMzI1ODMsMzEwMzAsMTU2MzY4LDM5MzkzLDMyNjYzLDE1NjQ5NywzMjY3NSwxMzY4MDEsMTMxMTc2LDE3NzU2LDE0NTI1NCwxNzY2NywxNjQ2NjYsMzI3NjIsMTU2ODA5LDMyNzczLDMyNzc2LDMyNzk3LDMyODA4LDMyODE1LDE3MjE2NywxNTg5MTUsMzI4MjcsMzI4MjgsMzI4NjUsMTQxMDc2LDE4ODI1LDE1NzIyMiwxNDY5MTUsMTU3NDE2LDI2NDA1LDMyOTM1LDE2NjQ3MiwzMzAzMSwzMzA1MCwyMjcwNCwxNDEwNDYsMjc3NzUsMTU2ODI0LDE1MTQ4MCwyNTgzMSwxMzYzMzAsMzMzMDQsMTM3MzEwLDI3MjE5LDE1MDExNywxNTAxNjUsMTc1MzAsMzMzMjEsMTMzOTAxLDE1ODI5MCwxNDY4MTQsMjA0NzMsMTM2NDQ1LDM0MDE4LDMzNjM0LDE1ODQ3NCwxNDk5MjcsMTQ0Njg4LDEzNzA3NSwxNDY5MzYsMzM0NTAsMjY5MDcsMTk0OTY0LDE2ODU5LDM0MTIzLDMzNDg4LDMzNTYyLDEzNDY3OCwxMzcxNDAsMTQwMTcsMTQzNzQxLDE0NDczMCwzMzQwMywzMzUwNiwzMzU2MCwxNDcwODMsMTU5MTM5LDE1ODQ2OSwxNTg2MTUsMTQ0ODQ2LDE1ODA3LDMzNTY1LDIxOTk2LDMzNjY5LDE3Njc1LDE1OTE0MSwzMzcwOCwzMzcyOSwzMzc0NywxMzQzOCwxNTk0NDQsMjcyMjMsMzQxMzgsMTM0NjIsMTU5Mjk4LDE0MzA4NywzMzg4MCwxNTQ1OTYsMzM5MDUsMTU4MjcsMTc2MzYsMjczMDMsMzM4NjYsMTQ2NjEzLDMxMDY0LDMzOTYwLDE1ODYxNCwxNTkzNTEsMTU5Mjk5LDM0MDE0LDMzODA3LDMzNjgxLDE3NTY4LDMzOTM5LDM0MDIwLDE1NDc2OSwxNjk2MCwxNTQ4MTYsMTc3MzEsMzQxMDAsMjMyODIsMTU5Mzg1LDE3NzAzLDM0MTYzLDE3Njg2LDI2NTU5LDM0MzI2LDE2NTQxMywxNjU0MzUsMzQyNDEsMTU5ODgwLDM0MzA2LDEzNjU3OCwxNTk5NDksMTk0OTk0LDE3NzcwLDM0MzQ0LDEzODk2LDEzNzM3OCwyMTQ5NSwxNjA2NjYsMzQ0MzAsMzQ2NzMsMTcyMjgwLDM0Nzk4LDE0MjM3NSwzNDczNywzNDc3OCwzNDgzMSwyMjExMywzNDQxMiwyNjcxMCwxNzkzNSwzNDg4NSwzNDg4NiwxNjEyNDgsMTQ2ODczLDE2MTI1MiwzNDkxMCwzNDk3MiwxODAxMSwzNDk5NiwzNDk5NywyNTUzNywzNTAxMywzMDU4MywxNjE1NTEsMzUyMDcsMzUyMTAsMzUyMzgsMzUyNDEsMzUyMzksMzUyNjAsMTY2NDM3LDM1MzAzLDE2MjA4NCwxNjI0OTMsMzU0ODQsMzA2MTEsMzczNzQsMzU0NzIsMTYyMzkzLDMxNDY1LDE2MjYxOCwxNDczNDMsMTgxOTUsMTYyNjE2LDI5MDUyLDM1NTk2LDM1NjE1LDE1MjYyNCwxNTI5MzMsMzU2NDcsMzU2NjAsMzU2NjEsMzU0OTcsMTUwMTM4LDM1NzI4LDM1NzM5LDM1NTAzLDEzNjkyNywxNzk0MSwzNDg5NSwzNTk5NSwxNjMxNTYsMTYzMjE1LDE5NTAyOCwxNDExNywxNjMxNTUsMzYwNTQsMTYzMjI0LDE2MzI2MSwzNjExNCwzNjA5OSwxMzc0ODgsMzYwNTksMjg3NjQsMzYxMTMsMTUwNzI5LDE2MDgwLDM2MjE1LDM2MjY1LDE2Mzg0MiwxMzUxODgsMTQ5ODk4LDE1MjI4LDE2NDI4NCwxNjAwMTIsMzE0NjMsMzY1MjUsMzY1MzQsMzY1NDcsMzc1ODgsMzY2MzMsMzY2NTMsMTY0NzA5LDE2NDg4MiwzNjc3MywzNzYzNSwxNzI3MDMsMTMzNzEyLDM2Nzg3LDE4NzMwLDE2NjM2NiwxNjUxODEsMTQ2ODc1LDI0MzEyLDE0Mzk3MCwzNjg1NywxNzIwNTIsMTY1NTY0LDE2NTEyMSwxNDAwNjksMTQ3MjAsMTU5NDQ3LDM2OTE5LDE2NTE4MCwxNjI0OTQsMzY5NjEsMTY1MjI4LDE2NTM4NywzNzAzMiwxNjU2NTEsMzcwNjAsMTY1NjA2LDM3MDM4LDM3MTE3LDM3MjIzLDE1MDg4LDM3Mjg5LDM3MzE2LDMxOTE2LDE2NjE5NSwxMzg4ODksMzczOTAsMjc4MDcsMzc0NDEsMzc0NzQsMTUzMDE3LDM3NTYxLDE2NjU5OCwxNDY1ODcsMTY2NjY4LDE1MzA1MSwxMzQ0NDksMzc2NzYsMzc3MzksMTY2NjI1LDE2Njg5MSwyODgxNSwyMzIzNSwxNjY2MjYsMTY2NjI5LDE4Nzg5LDM3NDQ0LDE2Njg5MiwxNjY5NjksMTY2OTExLDM3NzQ3LDM3OTc5LDM2NTQwLDM4Mjc3LDM4MzEwLDM3OTI2LDM4MzA0LDI4NjYyLDE3MDgxLDE0MDkyMiwxNjU1OTIsMTM1ODA0LDE0Njk5MCwxODkxMSwyNzY3NiwzODUyMywzODU1MCwxNjc0OCwzODU2MywxNTk0NDUsMjUwNTAsMzg1ODIsMzA5NjUsMTY2NjI0LDM4NTg5LDIxNDUyLDE4ODQ5LDE1ODkwNCwxMzE3MDAsMTU2Njg4LDE2ODExMSwxNjgxNjUsMTUwMjI1LDEzNzQ5MywxNDQxMzgsMzg3MDUsMzQzNzAsMzg3MTAsMTg5NTksMTc3MjUsMTc3OTcsMTUwMjQ5LDI4Nzg5LDIzMzYxLDM4NjgzLDM4NzQ4LDE2ODQwNSwzODc0MywyMzM3MCwxNjg0MjcsMzg3NTEsMzc5MjUsMjA2ODgsMTQzNTQzLDE0MzU0OCwzODc5MywzODgxNSwzODgzMywzODg0NiwzODg0OCwzODg2NiwzODg4MCwxNTI2ODQsMzg4OTQsMjk3MjQsMTY5MDExLDM4OTExLDM4OTAxLDE2ODk4OSwxNjIxNzAsMTkxNTMsMzg5NjQsMzg5NjMsMzg5ODcsMzkwMTQsMTUxMTgsMTYwMTE3LDE1Njk3LDEzMjY1NiwxNDc4MDQsMTUzMzUwLDM5MTE0LDM5MDk1LDM5MTEyLDM5MTExLDE5MTk5LDE1OTAxNSwxMzY5MTUsMjE5MzYsMzkxMzcsMzkxNDIsMzkxNDgsMzc3NTIsMzkyMjUsMTUwMDU3LDE5MzE0LDE3MDA3MSwxNzAyNDUsMzk0MTMsMzk0MzYsMzk0ODMsMzk0NDAsMzk1MTIsMTUzMzgxLDE0MDIwLDE2ODExMywxNzA5NjUsMzk2NDgsMzk2NTAsMTcwNzU3LDM5NjY4LDE5NDcwLDM5NzAwLDM5NzI1LDE2NTM3NiwyMDUzMiwzOTczMiwxNTgxMjAsMTQ1MzEsMTQzNDg1LDM5NzYwLDM5NzQ0LDE3MTMyNiwyMzEwOSwxMzczMTUsMzk4MjIsMTQ4MDQzLDM5OTM4LDM5OTM1LDM5OTQ4LDE3MTYyNCw0MDQwNCwxNzE5NTksMTcyNDM0LDE3MjQ1OSwxNzIyNTcsMTcyMzIzLDE3MjUxMSw0MDMxOCw0MDMyMywxNzIzNDAsNDA0NjIsMjY3NjAsNDAzODgsMTM5NjExLDE3MjQzNSwxNzI1NzYsMTM3NTMxLDE3MjU5NSw0MDI0OSwxNzIyMTcsMTcyNzI0LDQwNTkyLDQwNTk3LDQwNjA2LDQwNjEwLDE5NzY0LDQwNjE4LDQwNjIzLDE0ODMyNCw0MDY0MSwxNTIwMCwxNDgyMSwxNTY0NSwyMDI3NCwxNDI3MCwxNjY5NTUsNDA3MDYsNDA3MTIsMTkzNTAsMzc5MjQsMTU5MTM4LDQwNzI3LDQwNzI2LDQwNzYxLDIyMTc1LDIyMTU0LDQwNzczLDM5MzUyLDE2ODA3NSwzODg5OCwzMzkxOSw0MDgwMiw0MDgwOSwzMTQ1Miw0MDg0NiwyOTIwNiwxOTM5MCwxNDk4NzcsMTQ5OTQ3LDI5MDQ3LDE1MDAwOCwxNDgyOTYsMTUwMDk3LDI5NTk4LDE2Njg3NCwxMzc0NjYsMzExMzUsMTY2MjcwLDE2NzQ3OCwzNzczNywzNzg3NSwxNjY0NjgsMzc2MTIsMzc3NjEsMzc4MzUsMTY2MjUyLDE0ODY2NSwyOTIwNywxNjEwNywzMDU3OCwzMTI5OSwyODg4MCwxNDg1OTUsMTQ4NDcyLDI5MDU0LDEzNzE5OSwyODgzNSwxMzc0MDYsMTQ0NzkzLDE2MDcxLDEzNzM0OSwxNTI2MjMsMTM3MjA4LDE0MTE0LDEzNjk1NSwxMzcyNzMsMTQwNDksMTM3MDc2LDEzNzQyNSwxNTU0NjcsMTQxMTUsMTM2ODk2LDIyMzYzLDE1MDA1MywxMzYxOTAsMTM1ODQ4LDEzNjEzNCwxMzYzNzQsMzQwNTEsMTQ1MDYyLDM0MDUxLDMzODc3LDE0OTkwOCwxNjAxMDEsMTQ2OTkzLDE1MjkyNCwxNDcxOTUsMTU5ODI2LDE3NjUyLDE0NTEzNCwxNzAzOTcsMTU5NTI2LDI2NjE3LDE0MTMxLDE1MzgxLDE1ODQ3LDIyNjM2LDEzNzUwNiwyNjY0MCwxNjQ3MSwxNDUyMTUsMTQ3NjgxLDE0NzU5NSwxNDc3MjcsMTU4NzUzLDIxNzA3LDIyMTc0LDE1NzM2MSwyMjE2MiwxMzUxMzUsMTM0MDU2LDEzNDY2OSwzNzgzMCwxNjY2NzUsMzc3ODgsMjAyMTYsMjA3NzksMTQzNjEsMTQ4NTM0LDIwMTU2LDEzMjE5NywxMzE5NjcsMjAyOTksMjAzNjIsMTUzMTY5LDIzMTQ0LDEzMTQ5OSwxMzIwNDMsMTQ3NDUsMTMxODUwLDEzMjExNiwxMzM2NSwyMDI2NSwxMzE3NzYsMTY3NjAzLDEzMTcwMSwzNTU0NiwxMzE1OTYsMjAxMjAsMjA2ODUsMjA3NDksMjAzODYsMjAyMjcsMTUwMDMwLDE0NzA4MiwyMDI5MCwyMDUyNiwyMDU4OCwyMDYwOSwyMDQyOCwyMDQ1MywyMDU2OCwyMDczMiwyMDgyNSwyMDgyNywyMDgyOSwyMDgzMCwyODI3OCwxNDQ3ODksMTQ3MDAxLDE0NzEzNSwyODAxOCwxMzczNDgsMTQ3MDgxLDIwOTA0LDIwOTMxLDEzMjU3NiwxNzYyOSwxMzIyNTksMTMyMjQyLDEzMjI0MSwzNjIxOCwxNjY1NTYsMTMyODc4LDIxMDgxLDIxMTU2LDEzMzIzNSwyMTIxNywzNzc0MiwxODA0MiwyOTA2OCwxNDgzNjQsMTM0MTc2LDE0OTkzMiwxMzUzOTYsMjcwODksMTM0Njg1LDI5ODE3LDE2MDk0LDI5ODQ5LDI5NzE2LDI5NzgyLDI5NTkyLDE5MzQyLDE1MDIwNCwxNDc1OTcsMjE0NTYsMTM3MDAsMjkxOTksMTQ3NjU3LDIxOTQwLDEzMTkwOSwyMTcwOSwxMzQwODYsMjIzMDEsMzc0NjksMzg2NDQsMzc3MzQsMjI0OTMsMjI0MTMsMjIzOTksMTM4ODYsMjI3MzEsMjMxOTMsMTY2NDcwLDEzNjk1NCwxMzcwNzEsMTM2OTc2LDIzMDg0LDIyOTY4LDM3NTE5LDIzMTY2LDIzMjQ3LDIzMDU4LDE1MzkyNiwxMzc3MTUsMTM3MzEzLDE0ODExNywxNDA2OSwyNzkwOSwyOTc2MywyMzA3MywxNTUyNjcsMjMxNjksMTY2ODcxLDEzMjExNSwzNzg1NiwyOTgzNiwxMzU5MzksMjg5MzMsMTg4MDIsMzc4OTYsMTY2Mzk1LDM3ODIxLDE0MjQwLDIzNTgyLDIzNzEwLDI0MTU4LDI0MTM2LDEzNzYyMiwxMzc1OTYsMTQ2MTU4LDI0MjY5LDIzMzc1LDEzNzQ3NSwxMzc0NzYsMTQwODEsMTM3Mzc2LDE0MDQ1LDEzNjk1OCwxNDAzNSwzMzA2NiwxNjY0NzEsMTM4NjgyLDE0NDQ5OCwxNjYzMTIsMjQzMzIsMjQzMzQsMTM3NTExLDEzNzEzMSwyMzE0NywxMzcwMTksMjMzNjQsMzQzMjQsMTYxMjc3LDM0OTEyLDI0NzAyLDE0MTQwOCwxNDA4NDMsMjQ1MzksMTYwNTYsMTQwNzE5LDE0MDczNCwxNjgwNzIsMTU5NjAzLDI1MDI0LDEzMTEzNCwxMzExNDIsMTQwODI3LDI0OTg1LDI0OTg0LDI0NjkzLDE0MjQ5MSwxNDI1OTksMTQ5MjA0LDE2ODI2OSwyNTcxMywxNDkwOTMsMTQyMTg2LDE0ODg5LDE0MjExNCwxNDQ0NjQsMTcwMjE4LDE0Mjk2OCwyNTM5OSwxNzMxNDcsMjU3ODIsMjUzOTMsMjU1NTMsMTQ5OTg3LDE0MjY5NSwyNTI1MiwxNDI0OTcsMjU2NTksMjU5NjMsMjY5OTQsMTUzNDgsMTQzNTAyLDE0NDA0NSwxNDk4OTcsMTQ0MDQzLDIxNzczLDE0NDA5NiwxMzc0MzMsMTY5MDIzLDI2MzE4LDE0NDAwOSwxNDM3OTUsMTUwNzIsMTY3ODQsMTUyOTY0LDE2NjY5MCwxNTI5NzUsMTM2OTU2LDE1MjkyMywxNTI2MTMsMzA5NTgsMTQzNjE5LDEzNzI1OCwxNDM5MjQsMTM0MTIsMTQzODg3LDE0Mzc0NiwxNDgxNjksMjYyNTQsMTU5MDEyLDI2MjE5LDE5MzQ3LDI2MTYwLDE2MTkwNCwxMzg3MzEsMjYyMTEsMTQ0MDgyLDE0NDA5NywyNjE0MiwxNTM3MTQsMTQ1NDUsMTQ1NDY2LDE0NTM0MCwxNTI1NywxNDUzMTQsMTQ0MzgyLDI5OTA0LDE1MjU0LDI2NTExLDE0OTAzNCwyNjgwNiwyNjY1NCwxNTMwMCwyNzMyNiwxNDQzNSwxNDUzNjUsMTQ4NjE1LDI3MTg3LDI3MjE4LDI3MzM3LDI3Mzk3LDEzNzQ5MCwyNTg3MywyNjc3NiwyNzIxMiwxNTMxOSwyNzI1OCwyNzQ3OSwxNDczOTIsMTQ2NTg2LDM3NzkyLDM3NjE4LDE2Njg5MCwxNjY2MDMsMzc1MTMsMTYzODcwLDE2NjM2NCwzNzk5MSwyODA2OSwyODQyNywxNDk5OTYsMjgwMDcsMTQ3MzI3LDE1NzU5LDI4MTY0LDE0NzUxNiwyMzEwMSwyODE3MCwyMjU5OSwyNzk0MCwzMDc4NiwyODk4NywxNDgyNTAsMTQ4MDg2LDI4OTEzLDI5MjY0LDI5MzE5LDI5MzMyLDE0OTM5MSwxNDkyODUsMjA4NTcsMTUwMTgwLDEzMjU4NywyOTgxOCwxNDcxOTIsMTQ0OTkxLDE1MDA5MCwxNDk3ODMsMTU1NjE3LDE2MTM0LDE2MDQ5LDE1MDIzOSwxNjY5NDcsMTQ3MjUzLDI0NzQzLDE2MTE1LDI5OTAwLDI5NzU2LDM3NzY3LDI5NzUxLDE3NTY3LDE1OTIxMCwxNzc0NSwzMDA4MywxNjIyNywxNTA3NDUsMTUwNzkwLDE2MjE2LDMwMDM3LDMwMzIzLDE3MzUxMCwxNTEyOSwyOTgwMCwxNjY2MDQsMTQ5OTMxLDE0OTkwMiwxNTA5OSwxNTgyMSwxNTAwOTQsMTYxMjcsMTQ5OTU3LDE0OTc0NywzNzM3MCwyMjMyMiwzNzY5OCwxNjY2MjcsMTM3MzE2LDIwNzAzLDE1MjA5NywxNTIwMzksMzA1ODQsMTQzOTIyLDMwNDc4LDMwNDc5LDMwNTg3LDE0OTE0MywxNDUyODEsMTQ5NDIsMTQ5NzQ0LDI5NzUyLDI5ODUxLDE2MDYzLDE1MDIwMiwxNTAyMTUsMTY1ODQsMTUwMTY2LDE1NjA3OCwzNzYzOSwxNTI5NjEsMzA3NTAsMzA4NjEsMzA4NTYsMzA5MzAsMjk2NDgsMzEwNjUsMTYxNjAxLDE1MzMxNSwxNjY1NCwzMTEzMSwzMzk0MiwzMTE0MSwyNzE4MSwxNDcxOTQsMzEyOTAsMzEyMjAsMTY3NTAsMTM2OTM0LDE2NjkwLDM3NDI5LDMxMjE3LDEzNDQ3NiwxNDk5MDAsMTMxNzM3LDE0Njg3NCwxMzcwNzAsMTM3MTksMjE4NjcsMTM2ODAsMTM5OTQsMTMxNTQwLDEzNDE1NywzMTQ1OCwyMzEyOSwxNDEwNDUsMTU0Mjg3LDE1NDI2OCwyMzA1MywxMzE2NzUsMzA5NjAsMjMwODIsMTU0NTY2LDMxNDg2LDE2ODg5LDMxODM3LDMxODUzLDE2OTEzLDE1NDU0NywxNTUzMjQsMTU1MzAyLDMxOTQ5LDE1MDAwOSwxMzcxMzYsMzE4ODYsMzE4NjgsMzE5MTgsMjczMTQsMzIyMjAsMzIyNjMsMzIyMTEsMzI1OTAsMTU2MjU3LDE1NTk5NiwxNjI2MzIsMzIxNTEsMTU1MjY2LDE3MDAyLDE1ODU4MSwxMzMzOTgsMjY1ODIsMTMxMTUwLDE0NDg0NywyMjQ2OCwxNTY2OTAsMTU2NjY0LDE0OTg1OCwzMjczMywzMTUyNywxMzMxNjQsMTU0MzQ1LDE1NDk0NywzMTUwMCwxNTUxNTAsMzkzOTgsMzQzNzMsMzk1MjMsMjcxNjQsMTQ0NDQ3LDE0ODE4LDE1MDAwNywxNTcxMDEsMzk0NTUsMTU3MDg4LDMzOTIwLDE2MDAzOSwxNTg5MjksMTc2NDIsMzMwNzksMTc0MTAsMzI5NjYsMzMwMzMsMzMwOTAsMTU3NjIwLDM5MTA3LDE1ODI3NCwzMzM3OCwzMzM4MSwxNTgyODksMzM4NzUsMTU5MTQzLDM0MzIwLDE2MDI4MywyMzE3NCwxNjc2NywxMzcyODAsMjMzMzksMTM3Mzc3LDIzMjY4LDEzNzQzMiwzNDQ2NCwxOTUwMDQsMTQ2ODMxLDM0ODYxLDE2MDgwMiwyMzA0MiwzNDkyNiwyMDI5MywzNDk1MSwzNTAwNywzNTA0NiwzNTE3MywzNTE0OSwxNTMyMTksMzUxNTYsMTYxNjY5LDE2MTY2OCwxNjY5MDEsMTY2ODczLDE2NjgxMiwxNjYzOTMsMTYwNDUsMzM5NTUsMTgxNjUsMTgxMjcsMTQzMjIsMzUzODksMzUzNTYsMTY5MDMyLDI0Mzk3LDM3NDE5LDE0ODEwMCwyNjA2OCwyODk2OSwyODg2OCwxMzcyODUsNDAzMDEsMzU5OTksMzYwNzMsMTYzMjkyLDIyOTM4LDMwNjU5LDIzMDI0LDE3MjYyLDE0MDM2LDM2Mzk0LDM2NTE5LDE1MDUzNywzNjY1NiwzNjY4MiwxNzE0MCwyNzczNiwyODYwMywxNDAwNjUsMTg1ODcsMjg1MzcsMjgyOTksMTM3MTc4LDM5OTEzLDE0MDA1LDE0OTgwNywzNzA1MSwzNzAxNSwyMTg3MywxODY5NCwzNzMwNywzNzg5MiwxNjY0NzUsMTY0ODIsMTY2NjUyLDM3OTI3LDE2Njk0MSwxNjY5NzEsMzQwMjEsMzUzNzEsMzgyOTcsMzgzMTEsMzgyOTUsMzgyOTQsMTY3MjIwLDI5NzY1LDE2MDY2LDE0OTc1OSwxNTAwODIsMTQ4NDU4LDE2MTAzLDE0MzkwOSwzODU0MywxNjc2NTUsMTY3NTI2LDE2NzUyNSwxNjA3NiwxNDk5OTcsMTUwMTM2LDE0NzQzOCwyOTcxNCwyOTgwMywxNjEyNCwzODcyMSwxNjgxMTIsMjY2OTUsMTg5NzMsMTY4MDgzLDE1MzU2NywzODc0OSwzNzczNiwxNjYyODEsMTY2OTUwLDE2NjcwMywxNTY2MDYsMzc1NjIsMjMzMTMsMzU2ODksMTg3NDgsMjk2ODksMTQ3OTk1LDM4ODExLDM4NzY5LDM5MjI0LDEzNDk1MCwyNDAwMSwxNjY4NTMsMTUwMTk0LDM4OTQzLDE2OTE3OCwzNzYyMiwxNjk0MzEsMzczNDksMTc2MDAsMTY2NzM2LDE1MDExOSwxNjY3NTYsMzkxMzIsMTY2NDY5LDE2MTI4LDM3NDE4LDE4NzI1LDMzODEyLDM5MjI3LDM5MjQ1LDE2MjU2NiwxNTg2OSwzOTMyMywxOTMxMSwzOTMzOCwzOTUxNiwxNjY3NTcsMTUzODAwLDI3Mjc5LDM5NDU3LDIzMjk0LDM5NDcxLDE3MDIyNSwxOTM0NCwxNzAzMTIsMzkzNTYsMTkzODksMTkzNTEsMzc3NTcsMjI2NDIsMTM1OTM4LDIyNTYyLDE0OTk0NCwxMzY0MjQsMzA3ODgsMTQxMDg3LDE0Njg3MiwyNjgyMSwxNTc0MSwzNzk3NiwxNDYzMSwyNDkxMiwxNDExODUsMTQxNjc1LDI0ODM5LDQwMDE1LDQwMDE5LDQwMDU5LDM5OTg5LDM5OTUyLDM5ODA3LDM5ODg3LDE3MTU2NSwzOTgzOSwxNzI1MzMsMTcyMjg2LDQwMjI1LDE5NjMwLDE0NzcxNiw0MDQ3MiwxOTYzMiw0MDIwNCwxNzI0NjgsMTcyMjY5LDE3MjI3NSwxNzAyODcsNDAzNTcsMzM5ODEsMTU5MjUwLDE1OTcxMSwxNTg1OTQsMzQzMDAsMTc3MTUsMTU5MTQwLDE1OTM2NCwxNTkyMTYsMzM4MjQsMzQyODYsMTU5MjMyLDE0NTM2NywxNTU3NDgsMzEyMDIsMTQ0Nzk2LDE0NDk2MCwxODczMywxNDk5ODIsMTU3MTQsMzc4NTEsMzc1NjYsMzc3MDQsMTMxNzc1LDMwOTA1LDM3NDk1LDM3OTY1LDIwNDUyLDEzMzc2LDM2OTY0LDE1MjkyNSwzMDc4MSwzMDgwNCwzMDkwMiwzMDc5NSwxMzcwNDcsMTQzODE3LDE0OTgyNSwxMzk3OCwyMDMzOCwyODYzNCwyODYzMywyODcwMiwyODcwMiwyMTUyNCwxNDc4OTMsMjI0NTksMjI3NzEsMjI0MTAsNDAyMTQsMjI0ODcsMjg5ODAsMTM0ODcsMTQ3ODg0LDI5MTYzLDE1ODc4NCwxNTE0NDcsMjMzMzYsMTM3MTQxLDE2NjQ3MywyNDg0NCwyMzI0NiwyMzA1MSwxNzA4NCwxNDg2MTYsMTQxMjQsMTkzMjMsMTY2Mzk2LDM3ODE5LDM3ODE2LDEzNzQzMCwxMzQ5NDEsMzM5MDYsMTU4OTEyLDEzNjIxMSwxNDgyMTgsMTQyMzc0LDE0ODQxNywyMjkzMiwxNDY4NzEsMTU3NTA1LDMyMTY4LDE1NTk5NSwxNTU4MTIsMTQ5OTQ1LDE0OTg5OSwxNjYzOTQsMzc2MDUsMjk2NjYsMTYxMDUsMjk4NzYsMTY2NzU1LDEzNzM3NSwxNjA5NywxNTAxOTUsMjczNTIsMjk2ODMsMjk2OTEsMTYwODYsMTUwMDc4LDE1MDE2NCwxMzcxNzcsMTUwMTE4LDEzMjAwNywxMzYyMjgsMTQ5OTg5LDI5NzY4LDE0OTc4MiwyODgzNywxNDk4NzgsMzc1MDgsMjk2NzAsMzc3MjcsMTMyMzUwLDM3NjgxLDE2NjYwNiwxNjY0MjIsMzc3NjYsMTY2ODg3LDE1MzA0NSwxODc0MSwxNjY1MzAsMjkwMzUsMTQ5ODI3LDEzNDM5OSwyMjE4MCwxMzI2MzQsMTM0MTIzLDEzNDMyOCwyMTc2MiwzMTE3MiwxMzcyMTAsMzIyNTQsMTM2ODk4LDE1MDA5NiwxMzcyOTgsMTc3MTAsMzc4ODksMTQwOTAsMTY2NTkyLDE0OTkzMywyMjk2MCwxMzc0MDcsMTM3MzQ3LDE2MDkwMCwyMzIwMSwxNDA1MCwxNDY3NzksMTQwMDAsMzc0NzEsMjMxNjEsMTY2NTI5LDEzNzMxNCwzNzc0OCwxNTU2NSwxMzM4MTIsMTkwOTQsMTQ3MzAsMjA3MjQsMTU3MjEsMTU2OTIsMTM2MDkyLDI5MDQ1LDE3MTQ3LDE2NDM3NiwyODE3NSwxNjgxNjQsMTc2NDMsMjc5OTEsMTYzNDA3LDI4Nzc1LDI3ODIzLDE1NTc0LDE0NzQzNywxNDY5ODksMjgxNjIsMjg0MjgsMTU3MjcsMTMyMDg1LDMwMDMzLDE0MDEyLDEzNTEyLDE4MDQ4LDE2MDkwLDE4NTQ1LDIyOTgwLDM3NDg2LDE4NzUwLDM2NjczLDE2Njk0MCwxNTg2NTYsMjI1NDYsMjI0NzIsMTQwMzgsMTM2Mjc0LDI4OTI2LDE0ODMyMiwxNTAxMjksMTQzMzMxLDEzNTg1NiwxNDAyMjEsMjY4MDksMjY5ODMsMTM2MDg4LDE0NDYxMywxNjI4MDQsMTQ1MTE5LDE2NjUzMSwxNDUzNjYsMTQ0Mzc4LDE1MDY4NywyNzE2MiwxNDUwNjksMTU4OTAzLDMzODU0LDE3NjMxLDE3NjE0LDE1OTAxNCwxNTkwNTcsMTU4ODUwLDE1OTcxMCwyODQzOSwxNjAwMDksMzM1OTcsMTM3MDE4LDMzNzczLDE1ODg0OCwxNTk4MjcsMTM3MTc5LDIyOTIxLDIzMTcwLDEzNzEzOSwyMzEzNywyMzE1MywxMzc0NzcsMTQ3OTY0LDE0MTI1LDIzMDIzLDEzNzAyMCwxNDAyMywyOTA3MCwzNzc3NiwyNjI2NiwxNDgxMzMsMjMxNTAsMjMwODMsMTQ4MTE1LDI3MTc5LDE0NzE5MywxNjE1OTAsMTQ4NTcxLDE0ODE3MCwyODk1NywxNDgwNTcsMTY2MzY5LDIwNDAwLDE1OTAxNiwyMzc0NiwxNDg2ODYsMTYzNDA1LDE0ODQxMywyNzE0OCwxNDgwNTQsMTM1OTQwLDI4ODM4LDI4OTc5LDE0ODQ1NywxNTc4MSwyNzg3MSwxOTQ1OTcsMTUwMDk1LDMyMzU3LDIzMDE5LDIzODU1LDE1ODU5LDI0NDEyLDE1MDEwOSwxMzcxODMsMzIxNjQsMzM4MzAsMjE2MzcsMTQ2MTcwLDE0NDEyOCwxMzE2MDQsMjIzOTgsMTMzMzMzLDEzMjYzMywxNjM1NywxMzkxNjYsMTcyNzI2LDI4Njc1LDE2ODI4MywyMzkyMCwyOTU4MywzMTk1NSwxNjY0ODksMTY4OTkyLDIwNDI0LDMyNzQzLDI5Mzg5LDI5NDU2LDE2MjU0OCwyOTQ5NiwyOTQ5NywxNTMzMzQsMjk1MDUsMjk1MTIsMTYwNDEsMTYyNTg0LDM2OTcyLDI5MTczLDE0OTc0NiwyOTY2NSwzMzI3MCwxNjA3NCwzMDQ3NiwxNjA4MSwyNzgxMCwyMjI2OSwyOTcyMSwyOTcyNiwyOTcyNywxNjA5OCwxNjExMiwxNjExNiwxNjEyMiwyOTkwNywxNjE0MiwxNjIxMSwzMDAxOCwzMDA2MSwzMDA2NiwzMDA5MywxNjI1MiwzMDE1MiwzMDE3MiwxNjMyMCwzMDI4NSwxNjM0MywzMDMyNCwxNjM0OCwzMDMzMCwxNTEzODgsMjkwNjQsMjIwNTEsMzUyMDAsMjI2MzMsMTY0MTMsMzA1MzEsMTY0NDEsMjY0NjUsMTY0NTMsMTM3ODcsMzA2MTYsMTY0OTAsMTY0OTUsMjM2NDYsMzA2NTQsMzA2NjcsMjI3NzAsMzA3NDQsMjg4NTcsMzA3NDgsMTY1NTIsMzA3NzcsMzA3OTEsMzA4MDEsMzA4MjIsMzM4NjQsMTUyODg1LDMxMDI3LDI2NjI3LDMxMDI2LDE2NjQzLDE2NjQ5LDMxMTIxLDMxMTI5LDM2Nzk1LDMxMjM4LDM2Nzk2LDE2NzQzLDMxMzc3LDE2ODE4LDMxNDIwLDMzNDAxLDE2ODM2LDMxNDM5LDMxNDUxLDE2ODQ3LDIwMDAxLDMxNTg2LDMxNTk2LDMxNjExLDMxNzYyLDMxNzcxLDE2OTkyLDE3MDE4LDMxODY3LDMxOTAwLDE3MDM2LDMxOTI4LDE3MDQ0LDMxOTgxLDM2NzU1LDI4ODY0LDEzNDM1MSwzMjIwNywzMjIxMiwzMjIwOCwzMjI1MywzMjY4NiwzMjY5MiwyOTM0MywxNzMwMywzMjgwMCwzMjgwNSwzMTU0NSwzMjgxNCwzMjgxNywzMjg1MiwxNTgyMCwyMjQ1MiwyODgzMiwzMjk1MSwzMzAwMSwxNzM4OSwzMzAzNiwyOTQ4MiwzMzAzOCwzMzA0MiwzMDA0OCwzMzA0NCwxNzQwOSwxNTE2MSwzMzExMCwzMzExMywzMzExNCwxNzQyNywyMjU4NiwzMzE0OCwzMzE1NiwxNzQ0NSwzMzE3MSwxNzQ1MywzMzE4OSwyMjUxMSwzMzIxNywzMzI1MiwzMzM2NCwxNzU1MSwzMzQ0NiwzMzM5OCwzMzQ4MiwzMzQ5NiwzMzUzNSwxNzU4NCwzMzYyMywzODUwNSwyNzAxOCwzMzc5NywyODkxNywzMzg5MiwyNDgwMywzMzkyOCwxNzY2OCwzMzk4MiwzNDAxNywzNDA0MCwzNDA2NCwzNDEwNCwzNDEzMCwxNzcyMywzNDE1OSwzNDE2MCwzNDI3MiwxNzc4MywzNDQxOCwzNDQ1MCwzNDQ4MiwzNDU0MywzODQ2OSwzNDY5OSwxNzkyNiwxNzk0MywzNDk5MCwzNTA3MSwzNTEwOCwzNTE0MywzNTIxNywxNjIxNTEsMzUzNjksMzUzODQsMzU0NzYsMzU1MDgsMzU5MjEsMzYwNTIsMzYwODIsMzYxMjQsMTgzMjgsMjI2MjMsMzYyOTEsMTg0MTMsMjAyMDYsMzY0MTAsMjE5NzYsMjIzNTYsMzY0NjUsMjIwMDUsMzY1MjgsMTg0ODcsMzY1NTgsMzY1NzgsMzY1ODAsMzY1ODksMzY1OTQsMzY3OTEsMzY4MDEsMzY4MTAsMzY4MTIsMzY5MTUsMzkzNjQsMTg2MDUsMzkxMzYsMzczOTUsMTg3MTgsMzc0MTYsMzc0NjQsMzc0ODMsMzc1NTMsMzc1NTAsMzc1NjcsMzc2MDMsMzc2MTEsMzc2MTksMzc2MjAsMzc2MjksMzc2OTksMzc3NjQsMzc4MDUsMTg3NTcsMTg3NjksNDA2MzksMzc5MTEsMjEyNDksMzc5MTcsMzc5MzMsMzc5NTAsMTg3OTQsMzc5NzIsMzgwMDksMzgxODksMzgzMDYsMTg4NTUsMzgzODgsMzg0NTEsMTg5MTcsMjY1MjgsMTg5ODAsMzg3MjAsMTg5OTcsMzg4MzQsMzg4NTAsMjIxMDAsMTkxNzIsMjQ4MDgsMzkwOTcsMTkyMjUsMzkxNTMsMjI1OTYsMzkxODIsMzkxOTMsMjA5MTYsMzkxOTYsMzkyMjMsMzkyMzQsMzkyNjEsMzkyNjYsMTkzMTIsMzkzNjUsMTkzNTcsMzk0ODQsMzk2OTUsMzEzNjMsMzk3ODUsMzk4MDksMzk5MDEsMzk5MjEsMzk5MjQsMTk1NjUsMzk5NjgsMTQxOTEsMTM4MTc4LDQwMjY1LDM5OTk0LDQwNzAyLDIyMDk2LDQwMzM5LDQwMzgxLDQwMzg0LDQwNDQ0LDM4MTM0LDM2NzkwLDQwNTcxLDQwNjIwLDQwNjI1LDQwNjM3LDQwNjQ2LDM4MTA4LDQwNjc0LDQwNjg5LDQwNjk2LDMxNDMyLDQwNzcyLDEzMTIyMCwxMzE3NjcsMTMyMDAwLDI2OTA2LDM4MDgzLDIyOTU2LDEzMjMxMSwyMjU5MiwzODA4MSwxNDI2NSwxMzI1NjUsMTMyNjI5LDEzMjcyNiwxMzY4OTAsMjIzNTksMjkwNDMsMTMzODI2LDEzMzgzNywxMzQwNzksMjE2MTAsMTk0NjE5LDEzNDA5MSwyMTY2MiwxMzQxMzksMTM0MjAzLDEzNDIyNywxMzQyNDUsMTM0MjY4LDI0ODA3LDEzNDI4NSwyMjEzOCwxMzQzMjUsMTM0MzY1LDEzNDM4MSwxMzQ1MTEsMTM0NTc4LDEzNDYwMCwyNjk2NSwzOTk4MywzNDcyNSwxMzQ2NjAsMTM0NjcwLDEzNDg3MSwxMzUwNTYsMTM0OTU3LDEzNDc3MSwyMzU4NCwxMzUxMDAsMjQwNzUsMTM1MjYwLDEzNTI0NywxMzUyODYsMjYzOTgsMTM1MjkxLDEzNTMwNCwxMzUzMTgsMTM4OTUsMTM1MzU5LDEzNTM3OSwxMzU0NzEsMTM1NDgzLDIxMzQ4LDMzOTY1LDEzNTkwNywxMzYwNTMsMTM1OTkwLDM1NzEzLDEzNjU2NywxMzY3MjksMTM3MTU1LDEzNzE1OSwyMDA4OCwyODg1OSwxMzcyNjEsMTM3NTc4LDEzNzc3MywxMzc3OTcsMTM4MjgyLDEzODM1MiwxMzg0MTIsMTM4OTUyLDI1MjgzLDEzODk2NSwxMzkwMjksMjkwODAsMjY3MDksMTM5MzMzLDI3MTEzLDE0MDI0LDEzOTkwMCwxNDAyNDcsMTQwMjgyLDE0MTA5OCwxNDE0MjUsMTQxNjQ3LDMzNTMzLDE0MTY3MSwxNDE3MTUsMTQyMDM3LDM1MjM3LDE0MjA1NiwzNjc2OCwxNDIwOTQsMzg4NDAsMTQyMTQzLDM4OTgzLDM5NjEzLDE0MjQxMixudWxsLDE0MjQ3MiwxNDI1MTksMTU0NjAwLDE0MjYwMCwxNDI2MTAsMTQyNzc1LDE0Mjc0MSwxNDI5MTQsMTQzMjIwLDE0MzMwOCwxNDM0MTEsMTQzNDYyLDE0NDE1OSwxNDQzNTAsMjQ0OTcsMjYxODQsMjYzMDMsMTYyNDI1LDE0NDc0MywxNDQ4ODMsMjkxODUsMTQ5OTQ2LDMwNjc5LDE0NDkyMiwxNDUxNzQsMzIzOTEsMTMxOTEwLDIyNzA5LDI2MzgyLDI2OTA0LDE0NjA4NywxNjEzNjcsMTU1NjE4LDE0Njk2MSwxNDcxMjksMTYxMjc4LDEzOTQxOCwxODY0MCwxOTEyOCwxNDc3MzcsMTY2NTU0LDE0ODIwNiwxNDgyMzcsMTQ3NTE1LDE0ODI3NiwxNDgzNzQsMTUwMDg1LDEzMjU1NCwyMDk0NiwxMzI2MjUsMjI5NDMsMTM4OTIwLDE1Mjk0LDE0NjY4NywxNDg0ODQsMTQ4Njk0LDIyNDA4LDE0OTEwOCwxNDc0NywxNDkyOTUsMTY1MzUyLDE3MDQ0MSwxNDE3OCwxMzk3MTUsMzU2NzgsMTY2NzM0LDM5MzgyLDE0OTUyMiwxNDk3NTUsMTUwMDM3LDI5MTkzLDE1MDIwOCwxMzQyNjQsMjI4ODUsMTUxMjA1LDE1MTQzMCwxMzI5ODUsMzY1NzAsMTUxNTk2LDIxMTM1LDIyMzM1LDI5MDQxLDE1MjIxNywxNTI2MDEsMTQ3Mjc0LDE1MDE4MywyMTk0OCwxNTI2NDYsMTUyNjg2LDE1ODU0NiwzNzMzMiwxMzQyNywxNTI4OTUsMTYxMzMwLDE1MjkyNiwxODIwMCwxNTI5MzAsMTUyOTM0LDE1MzU0MywxNDk4MjMsMTUzNjkzLDIwNTgyLDEzNTYzLDE0NDMzMiwyNDc5OCwxNTM4NTksMTgzMDAsMTY2MjE2LDE1NDI4NiwxNTQ1MDUsMTU0NjMwLDEzODY0MCwyMjQzMywyOTAwOSwyODU5OCwxNTU5MDYsMTYyODM0LDM2OTUwLDE1NjA4MiwxNTE0NTAsMzU2ODIsMTU2Njc0LDE1Njc0NiwyMzg5OSwxNTg3MTEsMzY2NjIsMTU2ODA0LDEzNzUwMCwzNTU2MiwxNTAwMDYsMTU2ODA4LDE0NzQzOSwxNTY5NDYsMTkzOTIsMTU3MTE5LDE1NzM2NSwxNDEwODMsMzc5ODksMTUzNTY5LDI0OTgxLDIzMDc5LDE5NDc2NSwyMDQxMSwyMjIwMSwxNDg3NjksMTU3NDM2LDIwMDc0LDE0OTgxMiwzODQ4NiwyODA0NywxNTg5MDksMTM4NDgsMzUxOTEsMTU3NTkzLDE1NzgwNiwxNTY2ODksMTU3NzkwLDI5MTUxLDE1Nzg5NSwzMTU1NCwxNjgxMjgsMTMzNjQ5LDE1Nzk5MCwzNzEyNCwxNTgwMDksMzEzMDEsNDA0MzIsMTU4MjAyLDM5NDYyLDE1ODI1MywxMzkxOSwxNTY3NzcsMTMxMTA1LDMxMTA3LDE1ODI2MCwxNTg1NTUsMjM4NTIsMTQ0NjY1LDMzNzQzLDE1ODYyMSwxODEyOCwxNTg4ODQsMzAwMTEsMzQ5MTcsMTU5MTUwLDIyNzEwLDE0MTA4LDE0MDY4NSwxNTk4MTksMTYwMjA1LDE1NDQ0LDE2MDM4NCwxNjAzODksMzc1MDUsMTM5NjQyLDE2MDM5NSwzNzY4MCwxNjA0ODYsMTQ5OTY4LDI3NzA1LDM4MDQ3LDE2MDg0OCwxMzQ5MDQsMzQ4NTUsMzUwNjEsMTQxNjA2LDE2NDk3OSwxMzcxMzcsMjgzNDQsMTUwMDU4LDEzNzI0OCwxNDc1NiwxNDAwOSwyMzU2OCwzMTIwMywxNzcyNywyNjI5NCwxNzExODEsMTcwMTQ4LDM1MTM5LDE2MTc0MCwxNjE4ODAsMjIyMzAsMTY2MDcsMTM2NzE0LDE0NzUzLDE0NTE5OSwxNjQwNzIsMTM2MTMzLDI5MTAxLDMzNjM4LDE2MjI2OSwxNjgzNjAsMjMxNDMsMTk2MzksMTU5OTE5LDE2NjMxNSwxNjIzMDEsMTYyMzE0LDE2MjU3MSwxNjMxNzQsMTQ3ODM0LDMxNTU1LDMxMTAyLDE2Mzg0OSwyODU5NywxNzI3NjcsMjcxMzksMTY0NjMyLDIxNDEwLDE1OTIzOSwzNzgyMywyNjY3OCwzODc0OSwxNjQyMDcsMTYzODc1LDE1ODEzMywxMzYxNzMsMTQzOTE5LDE2MzkxMiwyMzk0MSwxNjY5NjAsMTYzOTcxLDIyMjkzLDM4OTQ3LDE2NjIxNywyMzk3OSwxNDk4OTYsMjYwNDYsMjcwOTMsMjE0NTgsMTUwMTgxLDE0NzMyOSwxNTM3NywyNjQyMiwxNjM5ODQsMTY0MDg0LDE2NDE0MiwxMzkxNjksMTY0MTc1LDE2NDIzMywxNjQyNzEsMTY0Mzc4LDE2NDYxNCwxNjQ2NTUsMTY0NzQ2LDEzNzcwLDE2NDk2OCwxNjU1NDYsMTg2ODIsMjU1NzQsMTY2MjMwLDMwNzI4LDM3NDYxLDE2NjMyOCwxNzM5NCwxNjYzNzUsMTczNzUsMTY2Mzc2LDE2NjcyNiwxNjY4NjgsMjMwMzIsMTY2OTIxLDM2NjE5LDE2Nzg3NywxNjgxNzIsMzE1NjksMTY4MjA4LDE2ODI1MiwxNTg2MywxNjgyODYsMTUwMjE4LDM2ODE2LDI5MzI3LDIyMTU1LDE2OTE5MSwxNjk0NDksMTY5MzkyLDE2OTQwMCwxNjk3NzgsMTcwMTkzLDE3MDMxMywxNzAzNDYsMTcwNDM1LDE3MDUzNiwxNzA3NjYsMTcxMzU0LDE3MTQxOSwzMjQxNSwxNzE3NjgsMTcxODExLDE5NjIwLDM4MjE1LDE3MjY5MSwyOTA5MCwxNzI3OTksMTk4NTcsMzY4ODIsMTczNTE1LDE5ODY4LDEzNDMwMCwzNjc5OCwyMTk1MywzNjc5NCwxNDA0NjQsMzY3OTMsMTUwMTYzLDE3NjczLDMyMzgzLDI4NTAyLDI3MzEzLDIwMjAyLDEzNTQwLDE2NjcwMCwxNjE5NDksMTQxMzgsMzY0ODAsMTM3MjA1LDE2Mzg3NiwxNjY3NjQsMTY2ODA5LDE2MjM2NiwxNTczNTksMTU4NTEsMTYxMzY1LDE0NjYxNSwxNTMxNDEsMTUzOTQyLDIwMTIyLDE1NTI2NSwxNTYyNDgsMjIyMDcsMTM0NzY1LDM2MzY2LDIzNDA1LDE0NzA4MCwxNTA2ODYsMjU1NjYsMjUyOTYsMTM3MjA2LDEzNzMzOSwyNTkwNCwyMjA2MSwxNTQ2OTgsMjE1MzAsMTUyMzM3LDE1ODE0LDE3MTQxNiwxOTU4MSwyMjA1MCwyMjA0NiwzMjU4NSwxNTUzNTIsMjI5MDEsMTQ2NzUyLDM0NjcyLDE5OTk2LDEzNTE0NiwxMzQ0NzMsMTQ1MDgyLDMzMDQ3LDQwMjg2LDM2MTIwLDMwMjY3LDQwMDA1LDMwMjg2LDMwNjQ5LDM3NzAxLDIxNTU0LDMzMDk2LDMzNTI3LDIyMDUzLDMzMDc0LDMzODE2LDMyOTU3LDIxOTk0LDMxMDc0LDIyMDgzLDIxNTI2LDEzNDgxMywxMzc3NCwyMjAyMSwyMjAwMSwyNjM1MywxNjQ1NzgsMTM4NjksMzAwMDQsMjIwMDAsMjE5NDYsMjE2NTUsMjE4NzQsMTM0MjA5LDEzNDI5NCwyNDI3MiwxNTE4ODAsMTM0Nzc0LDE0MjQzNCwxMzQ4MTgsNDA2MTksMzIwOTAsMjE5ODIsMTM1Mjg1LDI1MjQ1LDM4NzY1LDIxNjUyLDM2MDQ1LDI5MTc0LDM3MjM4LDI1NTk2LDI1NTI5LDI1NTk4LDIxODY1LDE0MjE0Nyw0MDA1MCwxNDMwMjcsMjA4OTAsMTM1MzUsMTM0NTY3LDIwOTAzLDIxNTgxLDIxNzkwLDIxNzc5LDMwMzEwLDM2Mzk3LDE1NzgzNCwzMDEyOSwzMjk1MCwzNDgyMCwzNDY5NCwzNTAxNSwzMzIwNiwzMzgyMCwxMzUzNjEsMTc2NDQsMjk0NDQsMTQ5MjU0LDIzNDQwLDMzNTQ3LDE1Nzg0MywyMjEzOSwxNDEwNDQsMTYzMTE5LDE0Nzg3NSwxNjMxODcsMTU5NDQwLDE2MDQzOCwzNzIzMiwxMzU2NDEsMzczODQsMTQ2Njg0LDE3MzczNywxMzQ4MjgsMTM0OTA1LDI5Mjg2LDEzODQwMiwxODI1NCwxNTE0OTAsMTYzODMzLDEzNTE0NywxNjYzNCw0MDAyOSwyNTg4NywxNDI3NTIsMTg2NzUsMTQ5NDcyLDE3MTM4OCwxMzUxNDgsMTM0NjY2LDI0Njc0LDE2MTE4NywxMzUxNDksbnVsbCwxNTU3MjAsMTM1NTU5LDI5MDkxLDMyMzk4LDQwMjcyLDE5OTk0LDE5OTcyLDEzNjg3LDIzMzA5LDI3ODI2LDIxMzUxLDEzOTk2LDE0ODEyLDIxMzczLDEzOTg5LDE0OTAxNiwyMjY4MiwxNTAzODIsMzMzMjUsMjE1NzksMjI0NDIsMTU0MjYxLDEzMzQ5NyxudWxsLDE0OTMwLDE0MDM4OSwyOTU1NiwxNzE2OTIsMTk3MjEsMzk5MTcsMTQ2Njg2LDE3MTgyNCwxOTU0NywxNTE0NjUsMTY5Mzc0LDE3MTk5OCwzMzg4NCwxNDY4NzAsMTYwNDM0LDE1NzYxOSwxNDUxODQsMjUzOTAsMzIwMzcsMTQ3MTkxLDE0Njk4OCwxNDg5MCwzNjg3MiwyMTE5NiwxNTk4OCwxMzk0NiwxNzg5NywxMzIyMzgsMzAyNzIsMjMyODAsMTM0ODM4LDMwODQyLDE2MzYzMCwyMjY5NSwxNjU3NSwyMjE0MCwzOTgxOSwyMzkyNCwzMDI5MiwxNzMxMDgsNDA1ODEsMTk2ODEsMzAyMDEsMTQzMzEsMjQ4NTcsMTQzNTc4LDE0ODQ2NixudWxsLDIyMTA5LDEzNTg0OSwyMjQzOSwxNDk4NTksMTcxNTI2LDIxMDQ0LDE1OTkxOCwxMzc0MSwyNzcyMiw0MDMxNiwzMTgzMCwzOTczNywyMjQ5NCwxMzcwNjgsMjM2MzUsMjU4MTEsMTY5MTY4LDE1NjQ2OSwxNjAxMDAsMzQ0NzcsMTM0NDQwLDE1OTAxMCwxNTAyNDIsMTM0NTEzLG51bGwsMjA5OTAsMTM5MDIzLDIzOTUwLDM4NjU5LDEzODcwNSw0MDU3NywzNjk0MCwzMTUxOSwzOTY4MiwyMzc2MSwzMTY1MSwyNTE5MiwyNTM5NywzOTY3OSwzMTY5NSwzOTcyMiwzMTg3MCwzOTcyNiwzMTgxMCwzMTg3OCwzOTk1NywzMTc0MCwzOTY4OSw0MDcyNywzOTk2MywxNDk4MjIsNDA3OTQsMjE4NzUsMjM0OTEsMjA0NzcsNDA2MDAsMjA0NjYsMjEwODgsMTU4NzgsMjEyMDEsMjIzNzUsMjA1NjYsMjI5NjcsMjQwODIsMzg4NTYsNDAzNjMsMzY3MDAsMjE2MDksMzg4MzYsMzkyMzIsMzg4NDIsMjEyOTIsMjQ4ODAsMjY5MjQsMjE0NjYsMzk5NDYsNDAxOTQsMTk1MTUsMzg0NjUsMjcwMDgsMjA2NDYsMzAwMjIsMTM3MDY5LDM5Mzg2LDIxMTA3LG51bGwsMzcyMDksMzg1MjksMzcyMTIsbnVsbCwzNzIwMSwxNjc1NzUsMjU0NzEsMTU5MDExLDI3MzM4LDIyMDMzLDM3MjYyLDMwMDc0LDI1MjIxLDEzMjA5MiwyOTUxOSwzMTg1NiwxNTQ2NTcsMTQ2Njg1LG51bGwsMTQ5Nzg1LDMwNDIyLDM5ODM3LDIwMDEwLDEzNDM1NiwzMzcyNiwzNDg4MixudWxsLDIzNjI2LDI3MDcyLDIwNzE3LDIyMzk0LDIxMDIzLDI0MDUzLDIwMTc0LDI3Njk3LDEzMTU3MCwyMDI4MSwyMTY2MCwyMTcyMiwyMTE0NiwzNjIyNiwxMzgyMiwyNDMzMiwxMzgxMSxudWxsLDI3NDc0LDM3MjQ0LDQwODY5LDM5ODMxLDM4OTU4LDM5MDkyLDM5NjEwLDQwNjE2LDQwNTgwLDI5MDUwLDMxNTA4LG51bGwsMjc2NDIsMzQ4NDAsMzI2MzIsbnVsbCwyMjA0OCwxNzM2NDIsMzY0NzEsNDA3ODcsbnVsbCwzNjMwOCwzNjQzMSw0MDQ3NiwzNjM1MywyNTIxOCwxNjQ3MzMsMzYzOTIsMzY0NjksMzE0NDMsMTUwMTM1LDMxMjk0LDMwOTM2LDI3ODgyLDM1NDMxLDMwMjE1LDE2NjQ5MCw0MDc0MiwyNzg1NCwzNDc3NCwzMDE0NywxNzI3MjIsMzA4MDMsMTk0NjI0LDM2MTA4LDI5NDEwLDI5NTUzLDM1NjI5LDI5NDQyLDI5OTM3LDM2MDc1LDE1MDIwMywzNDM1MSwyNDUwNiwzNDk3NiwxNzU5MSxudWxsLDEzNzI3NSwxNTkyMzcsbnVsbCwzNTQ1NCwxNDA1NzEsbnVsbCwyNDgyOSwzMDMxMSwzOTYzOSw0MDI2MCwzNzc0MiwzOTgyMywzNDgwNSxudWxsLDM0ODMxLDM2MDg3LDI5NDg0LDM4Njg5LDM5ODU2LDEzNzgyLDI5MzYyLDE5NDYzLDMxODI1LDM5MjQyLDE1NTk5MywyNDkyMSwxOTQ2MCw0MDU5OCwyNDk1NyxudWxsLDIyMzY3LDI0OTQzLDI1MjU0LDI1MTQ1LDI1Mjk0LDE0OTQwLDI1MDU4LDIxNDE4LDE0NDM3MywyNTQ0NCwyNjYyNiwxMzc3OCwyMzg5NSwxNjY4NTAsMzY4MjYsMTY3NDgxLG51bGwsMjA2OTcsMTM4NTY2LDMwOTgyLDIxMjk4LDM4NDU2LDEzNDk3MSwxNjQ4NSxudWxsLDMwNzE4LG51bGwsMzE5MzgsMTU1NDE4LDMxOTYyLDMxMjc3LDMyODcwLDMyODY3LDMyMDc3LDI5OTU3LDI5OTM4LDM1MjIwLDMzMzA2LDI2MzgwLDMyODY2LDE2MDkwMiwzMjg1OSwyOTkzNiwzMzAyNywzMDUwMCwzNTIwOSwxNTc2NDQsMzAwMzUsMTU5NDQxLDM0NzI5LDM0NzY2LDMzMjI0LDM0NzAwLDM1NDAxLDM2MDEzLDM1NjUxLDMwNTA3LDI5OTQ0LDM0MDEwLDEzODc3LDI3MDU4LDM2MjYyLG51bGwsMzUyNDEsMjk4MDAsMjgwODksMzQ3NTMsMTQ3NDczLDI5OTI3LDE1ODM1LDI5MDQ2LDI0NzQwLDI0OTg4LDE1NTY5LDI5MDI2LDI0Njk1LG51bGwsMzI2MjUsMTY2NzAxLDI5MjY0LDI0ODA5LDE5MzI2LDIxMDI0LDE1Mzg0LDE0NjYzMSwxNTUzNTEsMTYxMzY2LDE1Mjg4MSwxMzc1NDAsMTM1OTM0LDE3MDI0MywxNTkxOTYsMTU5OTE3LDIzNzQ1LDE1NjA3NywxNjY0MTUsMTQ1MDE1LDEzMTMxMCwxNTc3NjYsMTUxMzEwLDE3NzYyLDIzMzI3LDE1NjQ5Miw0MDc4NCw0MDYxNCwxNTYyNjcsMTIyODgsNjUyOTIsMTIyODksMTIyOTAsNjUyOTQsODIzMSw2NTMwNyw2NTMwNiw2NTMxMSw2NTI4MSw2NTA3Miw4MjMwLDgyMjksNjUxMDQsNjUxMDUsNjUxMDYsMTgzLDY1MTA4LDY1MTA5LDY1MTEwLDY1MTExLDY1MzcyLDgyMTEsNjUwNzMsODIxMiw2NTA3NSw5NTg4LDY1MDc2LDY1MTAzLDY1Mjg4LDY1Mjg5LDY1MDc3LDY1MDc4LDY1MzcxLDY1MzczLDY1MDc5LDY1MDgwLDEyMzA4LDEyMzA5LDY1MDgxLDY1MDgyLDEyMzA0LDEyMzA1LDY1MDgzLDY1MDg0LDEyMjk4LDEyMjk5LDY1MDg1LDY1MDg2LDEyMjk2LDEyMjk3LDY1MDg3LDY1MDg4LDEyMzAwLDEyMzAxLDY1MDg5LDY1MDkwLDEyMzAyLDEyMzAzLDY1MDkxLDY1MDkyLDY1MTEzLDY1MTE0LDY1MTE1LDY1MTE2LDY1MTE3LDY1MTE4LDgyMTYsODIxNyw4MjIwLDgyMjEsMTIzMTcsMTIzMTgsODI0NSw4MjQyLDY1MjgzLDY1Mjg2LDY1MjkwLDgyNTEsMTY3LDEyMjkxLDk2NzUsOTY3OSw5NjUxLDk2NTAsOTY3OCw5NzM0LDk3MzMsOTY3MSw5NjcwLDk2MzMsOTYzMiw5NjYxLDk2NjAsMTI5NjMsODQ1MywxNzUsNjU1MDcsNjUzNDMsNzE3LDY1MDk3LDY1MDk4LDY1MTAxLDY1MTAyLDY1MDk5LDY1MTAwLDY1MTE5LDY1MTIwLDY1MTIxLDY1MjkxLDY1MjkzLDIxNSwyNDcsMTc3LDg3MzAsNjUzMDgsNjUzMTAsNjUzMDksODgwNiw4ODA3LDg4MDAsODczNCw4Nzg2LDg4MDEsNjUxMjIsNjUxMjMsNjUxMjQsNjUxMjUsNjUxMjYsNjUzNzQsODc0NSw4NzQ2LDg4NjksODczNiw4NzM1LDg4OTUsMTMyNjYsMTMyNjUsODc0Nyw4NzUwLDg3NTcsODc1Niw5NzkyLDk3OTQsODg1Myw4ODU3LDg1OTMsODU5NSw4NTkyLDg1OTQsODU5OCw4NTk5LDg2MDEsODYwMCw4NzQxLDg3MzksNjUyOTUsNjUzNDAsODcyNSw2NTEyOCw2NTI4NCw2NTUwOSwxMjMwNiw2NTUwNCw2NTUwNSw2NTI4NSw2NTMxMiw4NDUxLDg0NTcsNjUxMjksNjUxMzAsNjUxMzEsMTMyNjksMTMyMTIsMTMyMTMsMTMyMTQsMTMyNjIsMTMyMTcsMTMxOTgsMTMxOTksMTMyNTIsMTc2LDIwODI1LDIwODI3LDIwODMwLDIwODI5LDIwODMzLDIwODM1LDIxOTkxLDI5OTI5LDMxOTUwLDk2MDEsOTYwMiw5NjAzLDk2MDQsOTYwNSw5NjA2LDk2MDcsOTYwOCw5NjE1LDk2MTQsOTYxMyw5NjEyLDk2MTEsOTYxMCw5NjA5LDk1MzIsOTUyNCw5NTE2LDk1MDgsOTUwMCw5NjIwLDk0NzIsOTQ3NCw5NjIxLDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTU4MSw5NTgyLDk1ODQsOTU4Myw5NTUyLDk1NjYsOTU3OCw5NTY5LDk2OTgsOTY5OSw5NzAxLDk3MDAsOTU4NSw5NTg2LDk1ODcsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1MywxMjMyMSwxMjMyMiwxMjMyMywxMjMyNCwxMjMyNSwxMjMyNiwxMjMyNywxMjMyOCwxMjMyOSwyMTMxMywyMTMxNiwyMTMxNyw2NTMxMyw2NTMxNCw2NTMxNSw2NTMxNiw2NTMxNyw2NTMxOCw2NTMxOSw2NTMyMCw2NTMyMSw2NTMyMiw2NTMyMyw2NTMyNCw2NTMyNSw2NTMyNiw2NTMyNyw2NTMyOCw2NTMyOSw2NTMzMCw2NTMzMSw2NTMzMiw2NTMzMyw2NTMzNCw2NTMzNSw2NTMzNiw2NTMzNyw2NTMzOCw2NTM0NSw2NTM0Niw2NTM0Nyw2NTM0OCw2NTM0OSw2NTM1MCw2NTM1MSw2NTM1Miw2NTM1Myw2NTM1NCw2NTM1NSw2NTM1Niw2NTM1Nyw2NTM1OCw2NTM1OSw2NTM2MCw2NTM2MSw2NTM2Miw2NTM2Myw2NTM2NCw2NTM2NSw2NTM2Niw2NTM2Nyw2NTM2OCw2NTM2OSw2NTM3MCw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSwxMjU0OSwxMjU1MCwxMjU1MSwxMjU1MiwxMjU1MywxMjU1NCwxMjU1NSwxMjU1NiwxMjU1NywxMjU1OCwxMjU1OSwxMjU2MCwxMjU2MSwxMjU2MiwxMjU2MywxMjU2NCwxMjU2NSwxMjU2NiwxMjU2NywxMjU2OCwxMjU2OSwxMjU3MCwxMjU3MSwxMjU3MiwxMjU3MywxMjU3NCwxMjU3NSwxMjU3NiwxMjU3NywxMjU3OCwxMjU3OSwxMjU4MCwxMjU4MSwxMjU4MiwxMjU4MywxMjU4NCwxMjU4NSw3MjksNzEzLDcxNCw3MTEsNzE1LDkyMTYsOTIxNyw5MjE4LDkyMTksOTIyMCw5MjIxLDkyMjIsOTIyMyw5MjI0LDkyMjUsOTIyNiw5MjI3LDkyMjgsOTIyOSw5MjMwLDkyMzEsOTIzMiw5MjMzLDkyMzQsOTIzNSw5MjM2LDkyMzcsOTIzOCw5MjM5LDkyNDAsOTI0MSw5MjQyLDkyNDMsOTI0NCw5MjQ1LDkyNDYsOTI0Nyw5MjQ5LDgzNjQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE5OTY4LDIwMDU3LDE5OTY5LDE5OTcxLDIwMDM1LDIwMDYxLDIwMTAyLDIwMTA4LDIwMTU0LDIwNzk5LDIwODM3LDIwODQzLDIwOTYwLDIwOTkyLDIwOTkzLDIxMTQ3LDIxMjY5LDIxMzEzLDIxMzQwLDIxNDQ4LDE5OTc3LDE5OTc5LDE5OTc2LDE5OTc4LDIwMDExLDIwMDI0LDIwOTYxLDIwMDM3LDIwMDQwLDIwMDYzLDIwMDYyLDIwMTEwLDIwMTI5LDIwODAwLDIwOTk1LDIxMjQyLDIxMzE1LDIxNDQ5LDIxNDc1LDIyMzAzLDIyNzYzLDIyODA1LDIyODIzLDIyODk5LDIzMzc2LDIzMzc3LDIzMzc5LDIzNTQ0LDIzNTY3LDIzNTg2LDIzNjA4LDIzNjY1LDI0MDI5LDI0MDM3LDI0MDQ5LDI0MDUwLDI0MDUxLDI0MDYyLDI0MTc4LDI0MzE4LDI0MzMxLDI0MzM5LDI1MTY1LDE5OTg1LDE5OTg0LDE5OTgxLDIwMDEzLDIwMDE2LDIwMDI1LDIwMDQzLDIzNjA5LDIwMTA0LDIwMTEzLDIwMTE3LDIwMTE0LDIwMTE2LDIwMTMwLDIwMTYxLDIwMTYwLDIwMTYzLDIwMTY2LDIwMTY3LDIwMTczLDIwMTcwLDIwMTcxLDIwMTY0LDIwODAzLDIwODAxLDIwODM5LDIwODQ1LDIwODQ2LDIwODQ0LDIwODg3LDIwOTgyLDIwOTk4LDIwOTk5LDIxMDAwLDIxMjQzLDIxMjQ2LDIxMjQ3LDIxMjcwLDIxMzA1LDIxMzIwLDIxMzE5LDIxMzE3LDIxMzQyLDIxMzgwLDIxNDUxLDIxNDUwLDIxNDUzLDIyNzY0LDIyODI1LDIyODI3LDIyODI2LDIyODI5LDIzMzgwLDIzNTY5LDIzNTg4LDIzNjEwLDIzNjYzLDI0MDUyLDI0MTg3LDI0MzE5LDI0MzQwLDI0MzQxLDI0NTE1LDI1MDk2LDI1MTQyLDI1MTYzLDI1MTY2LDI1OTAzLDI1OTkxLDI2MDA3LDI2MDIwLDI2MDQxLDI2MDg1LDI2MzUyLDI2Mzc2LDI2NDA4LDI3NDI0LDI3NDkwLDI3NTEzLDI3NTk1LDI3NjA0LDI3NjExLDI3NjYzLDI3NzAwLDI4Nzc5LDI5MjI2LDI5MjM4LDI5MjQzLDI5MjU1LDI5MjczLDI5Mjc1LDI5MzU2LDI5NTc5LDE5OTkzLDE5OTkwLDE5OTg5LDE5OTg4LDE5OTkyLDIwMDI3LDIwMDQ1LDIwMDQ3LDIwMDQ2LDIwMTk3LDIwMTg0LDIwMTgwLDIwMTgxLDIwMTgyLDIwMTgzLDIwMTk1LDIwMTk2LDIwMTg1LDIwMTkwLDIwODA1LDIwODA0LDIwODczLDIwODc0LDIwOTA4LDIwOTg1LDIwOTg2LDIwOTg0LDIxMDAyLDIxMTUyLDIxMTUxLDIxMjUzLDIxMjU0LDIxMjcxLDIxMjc3LDIwMTkxLDIxMzIyLDIxMzIxLDIxMzQ1LDIxMzQ0LDIxMzU5LDIxMzU4LDIxNDM1LDIxNDg3LDIxNDc2LDIxNDkxLDIxNDg0LDIxNDg2LDIxNDgxLDIxNDgwLDIxNTAwLDIxNDk2LDIxNDkzLDIxNDgzLDIxNDc4LDIxNDgyLDIxNDkwLDIxNDg5LDIxNDg4LDIxNDc3LDIxNDg1LDIxNDk5LDIyMjM1LDIyMjM0LDIyODA2LDIyODMwLDIyODMzLDIyOTAwLDIyOTAyLDIzMzgxLDIzNDI3LDIzNjEyLDI0MDQwLDI0MDM5LDI0MDM4LDI0MDY2LDI0MDY3LDI0MTc5LDI0MTg4LDI0MzIxLDI0MzQ0LDI0MzQzLDI0NTE3LDI1MDk4LDI1MTcxLDI1MTcyLDI1MTcwLDI1MTY5LDI2MDIxLDI2MDg2LDI2NDE0LDI2NDEyLDI2NDEwLDI2NDExLDI2NDEzLDI3NDkxLDI3NTk3LDI3NjY1LDI3NjY0LDI3NzA0LDI3NzEzLDI3NzEyLDI3NzEwLDI5MzU5LDI5NTcyLDI5NTc3LDI5OTE2LDI5OTI2LDI5OTc2LDI5OTgzLDI5OTkyLDI5OTkzLDMwMDAwLDMwMDAxLDMwMDAyLDMwMDAzLDMwMDkxLDMwMzMzLDMwMzgyLDMwMzk5LDMwNDQ2LDMwNjgzLDMwNjkwLDMwNzA3LDMxMDM0LDMxMTY2LDMxMzQ4LDMxNDM1LDE5OTk4LDE5OTk5LDIwMDUwLDIwMDUxLDIwMDczLDIwMTIxLDIwMTMyLDIwMTM0LDIwMTMzLDIwMjIzLDIwMjMzLDIwMjQ5LDIwMjM0LDIwMjQ1LDIwMjM3LDIwMjQwLDIwMjQxLDIwMjM5LDIwMjEwLDIwMjE0LDIwMjE5LDIwMjA4LDIwMjExLDIwMjIxLDIwMjI1LDIwMjM1LDIwODA5LDIwODA3LDIwODA2LDIwODA4LDIwODQwLDIwODQ5LDIwODc3LDIwOTEyLDIxMDE1LDIxMDA5LDIxMDEwLDIxMDA2LDIxMDE0LDIxMTU1LDIxMjU2LDIxMjgxLDIxMjgwLDIxMzYwLDIxMzYxLDIxNTEzLDIxNTE5LDIxNTE2LDIxNTE0LDIxNTIwLDIxNTA1LDIxNTE1LDIxNTA4LDIxNTIxLDIxNTE3LDIxNTEyLDIxNTA3LDIxNTE4LDIxNTEwLDIxNTIyLDIyMjQwLDIyMjM4LDIyMjM3LDIyMzIzLDIyMzIwLDIyMzEyLDIyMzE3LDIyMzE2LDIyMzE5LDIyMzEzLDIyODA5LDIyODEwLDIyODM5LDIyODQwLDIyOTE2LDIyOTA0LDIyOTE1LDIyOTA5LDIyOTA1LDIyOTE0LDIyOTEzLDIzMzgzLDIzMzg0LDIzNDMxLDIzNDMyLDIzNDI5LDIzNDMzLDIzNTQ2LDIzNTc0LDIzNjczLDI0MDMwLDI0MDcwLDI0MTgyLDI0MTgwLDI0MzM1LDI0MzQ3LDI0NTM3LDI0NTM0LDI1MTAyLDI1MTAwLDI1MTAxLDI1MTA0LDI1MTg3LDI1MTc5LDI1MTc2LDI1OTEwLDI2MDg5LDI2MDg4LDI2MDkyLDI2MDkzLDI2MzU0LDI2MzU1LDI2Mzc3LDI2NDI5LDI2NDIwLDI2NDE3LDI2NDIxLDI3NDI1LDI3NDkyLDI3NTE1LDI3NjcwLDI3NzQxLDI3NzM1LDI3NzM3LDI3NzQzLDI3NzQ0LDI3NzI4LDI3NzMzLDI3NzQ1LDI3NzM5LDI3NzI1LDI3NzI2LDI4Nzg0LDI5Mjc5LDI5Mjc3LDMwMzM0LDMxNDgxLDMxODU5LDMxOTkyLDMyNTY2LDMyNjUwLDMyNzAxLDMyNzY5LDMyNzcxLDMyNzgwLDMyNzg2LDMyODE5LDMyODk1LDMyOTA1LDMyOTA3LDMyOTA4LDMzMjUxLDMzMjU4LDMzMjY3LDMzMjc2LDMzMjkyLDMzMzA3LDMzMzExLDMzMzkwLDMzMzk0LDMzNDA2LDM0NDExLDM0ODgwLDM0ODkyLDM0OTE1LDM1MTk5LDM4NDMzLDIwMDE4LDIwMTM2LDIwMzAxLDIwMzAzLDIwMjk1LDIwMzExLDIwMzE4LDIwMjc2LDIwMzE1LDIwMzA5LDIwMjcyLDIwMzA0LDIwMzA1LDIwMjg1LDIwMjgyLDIwMjgwLDIwMjkxLDIwMzA4LDIwMjg0LDIwMjk0LDIwMzIzLDIwMzE2LDIwMzIwLDIwMjcxLDIwMzAyLDIwMjc4LDIwMzEzLDIwMzE3LDIwMjk2LDIwMzE0LDIwODEyLDIwODExLDIwODEzLDIwODUzLDIwOTE4LDIwOTE5LDIxMDI5LDIxMDI4LDIxMDMzLDIxMDM0LDIxMDMyLDIxMTYzLDIxMTYxLDIxMTYyLDIxMTY0LDIxMjgzLDIxMzYzLDIxMzY1LDIxNTMzLDIxNTQ5LDIxNTM0LDIxNTY2LDIxNTQyLDIxNTgyLDIxNTQzLDIxNTc0LDIxNTcxLDIxNTU1LDIxNTc2LDIxNTcwLDIxNTMxLDIxNTQ1LDIxNTc4LDIxNTYxLDIxNTYzLDIxNTYwLDIxNTUwLDIxNTU3LDIxNTU4LDIxNTM2LDIxNTY0LDIxNTY4LDIxNTUzLDIxNTQ3LDIxNTM1LDIxNTQ4LDIyMjUwLDIyMjU2LDIyMjQ0LDIyMjUxLDIyMzQ2LDIyMzUzLDIyMzM2LDIyMzQ5LDIyMzQzLDIyMzUwLDIyMzM0LDIyMzUyLDIyMzUxLDIyMzMxLDIyNzY3LDIyODQ2LDIyOTQxLDIyOTMwLDIyOTUyLDIyOTQyLDIyOTQ3LDIyOTM3LDIyOTM0LDIyOTI1LDIyOTQ4LDIyOTMxLDIyOTIyLDIyOTQ5LDIzMzg5LDIzMzg4LDIzMzg2LDIzMzg3LDIzNDM2LDIzNDM1LDIzNDM5LDIzNTk2LDIzNjE2LDIzNjE3LDIzNjE1LDIzNjE0LDIzNjk2LDIzNjk3LDIzNzAwLDIzNjkyLDI0MDQzLDI0MDc2LDI0MjA3LDI0MTk5LDI0MjAyLDI0MzExLDI0MzI0LDI0MzUxLDI0NDIwLDI0NDE4LDI0NDM5LDI0NDQxLDI0NTM2LDI0NTI0LDI0NTM1LDI0NTI1LDI0NTYxLDI0NTU1LDI0NTY4LDI0NTU0LDI1MTA2LDI1MTA1LDI1MjIwLDI1MjM5LDI1MjM4LDI1MjE2LDI1MjA2LDI1MjI1LDI1MTk3LDI1MjI2LDI1MjEyLDI1MjE0LDI1MjA5LDI1MjAzLDI1MjM0LDI1MTk5LDI1MjQwLDI1MTk4LDI1MjM3LDI1MjM1LDI1MjMzLDI1MjIyLDI1OTEzLDI1OTE1LDI1OTEyLDI2MDk3LDI2MzU2LDI2NDYzLDI2NDQ2LDI2NDQ3LDI2NDQ4LDI2NDQ5LDI2NDYwLDI2NDU0LDI2NDYyLDI2NDQxLDI2NDM4LDI2NDY0LDI2NDUxLDI2NDU1LDI3NDkzLDI3NTk5LDI3NzE0LDI3NzQyLDI3ODAxLDI3Nzc3LDI3Nzg0LDI3Nzg1LDI3NzgxLDI3ODAzLDI3NzU0LDI3NzcwLDI3NzkyLDI3NzYwLDI3Nzg4LDI3NzUyLDI3Nzk4LDI3Nzk0LDI3NzczLDI3Nzc5LDI3NzYyLDI3Nzc0LDI3NzY0LDI3NzgyLDI3NzY2LDI3Nzg5LDI3Nzk2LDI3ODAwLDI3Nzc4LDI4NzkwLDI4Nzk2LDI4Nzk3LDI4NzkyLDI5MjgyLDI5MjgxLDI5MjgwLDI5MzgwLDI5Mzc4LDI5NTkwLDI5OTk2LDI5OTk1LDMwMDA3LDMwMDA4LDMwMzM4LDMwNDQ3LDMwNjkxLDMxMTY5LDMxMTY4LDMxMTY3LDMxMzUwLDMxOTk1LDMyNTk3LDMyOTE4LDMyOTE1LDMyOTI1LDMyOTIwLDMyOTIzLDMyOTIyLDMyOTQ2LDMzMzkxLDMzNDI2LDMzNDE5LDMzNDIxLDM1MjExLDM1MjgyLDM1MzI4LDM1ODk1LDM1OTEwLDM1OTI1LDM1OTk3LDM2MTk2LDM2MjA4LDM2Mjc1LDM2NTIzLDM2NTU0LDM2NzYzLDM2Nzg0LDM2ODAyLDM2ODA2LDM2ODA1LDM2ODA0LDI0MDMzLDM3MDA5LDM3MDI2LDM3MDM0LDM3MDMwLDM3MDI3LDM3MTkzLDM3MzE4LDM3MzI0LDM4NDUwLDM4NDQ2LDM4NDQ5LDM4NDQyLDM4NDQ0LDIwMDA2LDIwMDU0LDIwMDgzLDIwMTA3LDIwMTIzLDIwMTI2LDIwMTM5LDIwMTQwLDIwMzM1LDIwMzgxLDIwMzY1LDIwMzM5LDIwMzUxLDIwMzMyLDIwMzc5LDIwMzYzLDIwMzU4LDIwMzU1LDIwMzM2LDIwMzQxLDIwMzYwLDIwMzI5LDIwMzQ3LDIwMzc0LDIwMzUwLDIwMzY3LDIwMzY5LDIwMzQ2LDIwODIwLDIwODE4LDIwODIxLDIwODQxLDIwODU1LDIwODU0LDIwODU2LDIwOTI1LDIwOTg5LDIxMDUxLDIxMDQ4LDIxMDQ3LDIxMDUwLDIxMDQwLDIxMDM4LDIxMDQ2LDIxMDU3LDIxMTgyLDIxMTc5LDIxMzMwLDIxMzMyLDIxMzMxLDIxMzI5LDIxMzUwLDIxMzY3LDIxMzY4LDIxMzY5LDIxNDYyLDIxNDYwLDIxNDYzLDIxNjE5LDIxNjIxLDIxNjU0LDIxNjI0LDIxNjUzLDIxNjMyLDIxNjI3LDIxNjIzLDIxNjM2LDIxNjUwLDIxNjM4LDIxNjI4LDIxNjQ4LDIxNjE3LDIxNjIyLDIxNjQ0LDIxNjU4LDIxNjAyLDIxNjA4LDIxNjQzLDIxNjI5LDIxNjQ2LDIyMjY2LDIyNDAzLDIyMzkxLDIyMzc4LDIyMzc3LDIyMzY5LDIyMzc0LDIyMzcyLDIyMzk2LDIyODEyLDIyODU3LDIyODU1LDIyODU2LDIyODUyLDIyODY4LDIyOTc0LDIyOTcxLDIyOTk2LDIyOTY5LDIyOTU4LDIyOTkzLDIyOTgyLDIyOTkyLDIyOTg5LDIyOTg3LDIyOTk1LDIyOTg2LDIyOTU5LDIyOTYzLDIyOTk0LDIyOTgxLDIzMzkxLDIzMzk2LDIzMzk1LDIzNDQ3LDIzNDUwLDIzNDQ4LDIzNDUyLDIzNDQ5LDIzNDUxLDIzNTc4LDIzNjI0LDIzNjIxLDIzNjIyLDIzNzM1LDIzNzEzLDIzNzM2LDIzNzIxLDIzNzIzLDIzNzI5LDIzNzMxLDI0MDg4LDI0MDkwLDI0MDg2LDI0MDg1LDI0MDkxLDI0MDgxLDI0MTg0LDI0MjE4LDI0MjE1LDI0MjIwLDI0MjEzLDI0MjE0LDI0MzEwLDI0MzU4LDI0MzU5LDI0MzYxLDI0NDQ4LDI0NDQ5LDI0NDQ3LDI0NDQ0LDI0NTQxLDI0NTQ0LDI0NTczLDI0NTY1LDI0NTc1LDI0NTkxLDI0NTk2LDI0NjIzLDI0NjI5LDI0NTk4LDI0NjE4LDI0NTk3LDI0NjA5LDI0NjE1LDI0NjE3LDI0NjE5LDI0NjAzLDI1MTEwLDI1MTA5LDI1MTUxLDI1MTUwLDI1MTUyLDI1MjE1LDI1Mjg5LDI1MjkyLDI1Mjg0LDI1Mjc5LDI1MjgyLDI1MjczLDI1Mjk4LDI1MzA3LDI1MjU5LDI1Mjk5LDI1MzAwLDI1MjkxLDI1Mjg4LDI1MjU2LDI1Mjc3LDI1Mjc2LDI1Mjk2LDI1MzA1LDI1Mjg3LDI1MjkzLDI1MjY5LDI1MzA2LDI1MjY1LDI1MzA0LDI1MzAyLDI1MzAzLDI1Mjg2LDI1MjYwLDI1Mjk0LDI1OTE4LDI2MDIzLDI2MDQ0LDI2MTA2LDI2MTMyLDI2MTMxLDI2MTI0LDI2MTE4LDI2MTE0LDI2MTI2LDI2MTEyLDI2MTI3LDI2MTMzLDI2MTIyLDI2MTE5LDI2MzgxLDI2Mzc5LDI2NDc3LDI2NTA3LDI2NTE3LDI2NDgxLDI2NTI0LDI2NDgzLDI2NDg3LDI2NTAzLDI2NTI1LDI2NTE5LDI2NDc5LDI2NDgwLDI2NDk1LDI2NTA1LDI2NDk0LDI2NTEyLDI2NDg1LDI2NTIyLDI2NTE1LDI2NDkyLDI2NDc0LDI2NDgyLDI3NDI3LDI3NDk0LDI3NDk1LDI3NTE5LDI3NjY3LDI3Njc1LDI3ODc1LDI3ODgwLDI3ODkxLDI3ODI1LDI3ODUyLDI3ODc3LDI3ODI3LDI3ODM3LDI3ODM4LDI3ODM2LDI3ODc0LDI3ODE5LDI3ODYxLDI3ODU5LDI3ODMyLDI3ODQ0LDI3ODMzLDI3ODQxLDI3ODIyLDI3ODYzLDI3ODQ1LDI3ODg5LDI3ODM5LDI3ODM1LDI3ODczLDI3ODY3LDI3ODUwLDI3ODIwLDI3ODg3LDI3ODY4LDI3ODYyLDI3ODcyLDI4ODIxLDI4ODE0LDI4ODE4LDI4ODEwLDI4ODI1LDI5MjI4LDI5MjI5LDI5MjQwLDI5MjU2LDI5Mjg3LDI5Mjg5LDI5Mzc2LDI5MzkwLDI5NDAxLDI5Mzk5LDI5MzkyLDI5NjA5LDI5NjA4LDI5NTk5LDI5NjExLDI5NjA1LDMwMDEzLDMwMTA5LDMwMTA1LDMwMTA2LDMwMzQwLDMwNDAyLDMwNDUwLDMwNDUyLDMwNjkzLDMwNzE3LDMxMDM4LDMxMDQwLDMxMDQxLDMxMTc3LDMxMTc2LDMxMzU0LDMxMzUzLDMxNDgyLDMxOTk4LDMyNTk2LDMyNjUyLDMyNjUxLDMyNzczLDMyOTU0LDMyOTMzLDMyOTMwLDMyOTQ1LDMyOTI5LDMyOTM5LDMyOTM3LDMyOTQ4LDMyOTM4LDMyOTQzLDMzMjUzLDMzMjc4LDMzMjkzLDMzNDU5LDMzNDM3LDMzNDMzLDMzNDUzLDMzNDY5LDMzNDM5LDMzNDY1LDMzNDU3LDMzNDUyLDMzNDQ1LDMzNDU1LDMzNDY0LDMzNDQzLDMzNDU2LDMzNDcwLDMzNDYzLDM0MzgyLDM0NDE3LDIxMDIxLDM0OTIwLDM2NTU1LDM2ODE0LDM2ODIwLDM2ODE3LDM3MDQ1LDM3MDQ4LDM3MDQxLDM3MDQ2LDM3MzE5LDM3MzI5LDM4MjYzLDM4MjcyLDM4NDI4LDM4NDY0LDM4NDYzLDM4NDU5LDM4NDY4LDM4NDY2LDM4NTg1LDM4NjMyLDM4NzM4LDM4NzUwLDIwMTI3LDIwMTQxLDIwMTQyLDIwNDQ5LDIwNDA1LDIwMzk5LDIwNDE1LDIwNDQ4LDIwNDMzLDIwNDMxLDIwNDQ1LDIwNDE5LDIwNDA2LDIwNDQwLDIwNDQ3LDIwNDI2LDIwNDM5LDIwMzk4LDIwNDMyLDIwNDIwLDIwNDE4LDIwNDQyLDIwNDMwLDIwNDQ2LDIwNDA3LDIwODIzLDIwODgyLDIwODgxLDIwODk2LDIxMDcwLDIxMDU5LDIxMDY2LDIxMDY5LDIxMDY4LDIxMDY3LDIxMDYzLDIxMTkxLDIxMTkzLDIxMTg3LDIxMTg1LDIxMjYxLDIxMzM1LDIxMzcxLDIxNDAyLDIxNDY3LDIxNjc2LDIxNjk2LDIxNjcyLDIxNzEwLDIxNzA1LDIxNjg4LDIxNjcwLDIxNjgzLDIxNzAzLDIxNjk4LDIxNjkzLDIxNjc0LDIxNjk3LDIxNzAwLDIxNzA0LDIxNjc5LDIxNjc1LDIxNjgxLDIxNjkxLDIxNjczLDIxNjcxLDIxNjk1LDIyMjcxLDIyNDAyLDIyNDExLDIyNDMyLDIyNDM1LDIyNDM0LDIyNDc4LDIyNDQ2LDIyNDE5LDIyODY5LDIyODY1LDIyODYzLDIyODYyLDIyODY0LDIzMDA0LDIzMDAwLDIzMDM5LDIzMDExLDIzMDE2LDIzMDQzLDIzMDEzLDIzMDE4LDIzMDAyLDIzMDE0LDIzMDQxLDIzMDM1LDIzNDAxLDIzNDU5LDIzNDYyLDIzNDYwLDIzNDU4LDIzNDYxLDIzNTUzLDIzNjMwLDIzNjMxLDIzNjI5LDIzNjI3LDIzNzY5LDIzNzYyLDI0MDU1LDI0MDkzLDI0MTAxLDI0MDk1LDI0MTg5LDI0MjI0LDI0MjMwLDI0MzE0LDI0MzI4LDI0MzY1LDI0NDIxLDI0NDU2LDI0NDUzLDI0NDU4LDI0NDU5LDI0NDU1LDI0NDYwLDI0NDU3LDI0NTk0LDI0NjA1LDI0NjA4LDI0NjEzLDI0NTkwLDI0NjE2LDI0NjUzLDI0Njg4LDI0NjgwLDI0Njc0LDI0NjQ2LDI0NjQzLDI0Njg0LDI0NjgzLDI0NjgyLDI0Njc2LDI1MTUzLDI1MzA4LDI1MzY2LDI1MzUzLDI1MzQwLDI1MzI1LDI1MzQ1LDI1MzI2LDI1MzQxLDI1MzUxLDI1MzI5LDI1MzM1LDI1MzI3LDI1MzI0LDI1MzQyLDI1MzMyLDI1MzYxLDI1MzQ2LDI1OTE5LDI1OTI1LDI2MDI3LDI2MDQ1LDI2MDgyLDI2MTQ5LDI2MTU3LDI2MTQ0LDI2MTUxLDI2MTU5LDI2MTQzLDI2MTUyLDI2MTYxLDI2MTQ4LDI2MzU5LDI2NjIzLDI2NTc5LDI2NjA5LDI2NTgwLDI2NTc2LDI2NjA0LDI2NTUwLDI2NTQzLDI2NjEzLDI2NjAxLDI2NjA3LDI2NTY0LDI2NTc3LDI2NTQ4LDI2NTg2LDI2NTk3LDI2NTUyLDI2NTc1LDI2NTkwLDI2NjExLDI2NTQ0LDI2NTg1LDI2NTk0LDI2NTg5LDI2NTc4LDI3NDk4LDI3NTIzLDI3NTI2LDI3NTczLDI3NjAyLDI3NjA3LDI3Njc5LDI3ODQ5LDI3OTE1LDI3OTU0LDI3OTQ2LDI3OTY5LDI3OTQxLDI3OTE2LDI3OTUzLDI3OTM0LDI3OTI3LDI3OTYzLDI3OTY1LDI3OTY2LDI3OTU4LDI3OTMxLDI3ODkzLDI3OTYxLDI3OTQzLDI3OTYwLDI3OTQ1LDI3OTUwLDI3OTU3LDI3OTE4LDI3OTQ3LDI4ODQzLDI4ODU4LDI4ODUxLDI4ODQ0LDI4ODQ3LDI4ODQ1LDI4ODU2LDI4ODQ2LDI4ODM2LDI5MjMyLDI5Mjk4LDI5Mjk1LDI5MzAwLDI5NDE3LDI5NDA4LDI5NDA5LDI5NjIzLDI5NjQyLDI5NjI3LDI5NjE4LDI5NjQ1LDI5NjMyLDI5NjE5LDI5OTc4LDI5OTk3LDMwMDMxLDMwMDI4LDMwMDMwLDMwMDI3LDMwMTIzLDMwMTE2LDMwMTE3LDMwMTE0LDMwMTE1LDMwMzI4LDMwMzQyLDMwMzQzLDMwMzQ0LDMwNDA4LDMwNDA2LDMwNDAzLDMwNDA1LDMwNDY1LDMwNDU3LDMwNDU2LDMwNDczLDMwNDc1LDMwNDYyLDMwNDYwLDMwNDcxLDMwNjg0LDMwNzIyLDMwNzQwLDMwNzMyLDMwNzMzLDMxMDQ2LDMxMDQ5LDMxMDQ4LDMxMDQ3LDMxMTYxLDMxMTYyLDMxMTg1LDMxMTg2LDMxMTc5LDMxMzU5LDMxMzYxLDMxNDg3LDMxNDg1LDMxODY5LDMyMDAyLDMyMDA1LDMyMDAwLDMyMDA5LDMyMDA3LDMyMDA0LDMyMDA2LDMyNTY4LDMyNjU0LDMyNzAzLDMyNzcyLDMyNzg0LDMyNzgxLDMyNzg1LDMyODIyLDMyOTgyLDMyOTk3LDMyOTg2LDMyOTYzLDMyOTY0LDMyOTcyLDMyOTkzLDMyOTg3LDMyOTc0LDMyOTkwLDMyOTk2LDMyOTg5LDMzMjY4LDMzMzE0LDMzNTExLDMzNTM5LDMzNTQxLDMzNTA3LDMzNDk5LDMzNTEwLDMzNTQwLDMzNTA5LDMzNTM4LDMzNTQ1LDMzNDkwLDMzNDk1LDMzNTIxLDMzNTM3LDMzNTAwLDMzNDkyLDMzNDg5LDMzNTAyLDMzNDkxLDMzNTAzLDMzNTE5LDMzNTQyLDM0Mzg0LDM0NDI1LDM0NDI3LDM0NDI2LDM0ODkzLDM0OTIzLDM1MjAxLDM1Mjg0LDM1MzM2LDM1MzMwLDM1MzMxLDM1OTk4LDM2MDAwLDM2MjEyLDM2MjExLDM2Mjc2LDM2NTU3LDM2NTU2LDM2ODQ4LDM2ODM4LDM2ODM0LDM2ODQyLDM2ODM3LDM2ODQ1LDM2ODQzLDM2ODM2LDM2ODQwLDM3MDY2LDM3MDcwLDM3MDU3LDM3MDU5LDM3MTk1LDM3MTk0LDM3MzI1LDM4Mjc0LDM4NDgwLDM4NDc1LDM4NDc2LDM4NDc3LDM4NzU0LDM4NzYxLDM4ODU5LDM4ODkzLDM4ODk5LDM4OTEzLDM5MDgwLDM5MTMxLDM5MTM1LDM5MzE4LDM5MzIxLDIwMDU2LDIwMTQ3LDIwNDkyLDIwNDkzLDIwNTE1LDIwNDYzLDIwNTE4LDIwNTE3LDIwNDcyLDIwNTIxLDIwNTAyLDIwNDg2LDIwNTQwLDIwNTExLDIwNTA2LDIwNDk4LDIwNDk3LDIwNDc0LDIwNDgwLDIwNTAwLDIwNTIwLDIwNDY1LDIwNTEzLDIwNDkxLDIwNTA1LDIwNTA0LDIwNDY3LDIwNDYyLDIwNTI1LDIwNTIyLDIwNDc4LDIwNTIzLDIwNDg5LDIwODYwLDIwOTAwLDIwOTAxLDIwODk4LDIwOTQxLDIwOTQwLDIwOTM0LDIwOTM5LDIxMDc4LDIxMDg0LDIxMDc2LDIxMDgzLDIxMDg1LDIxMjkwLDIxMzc1LDIxNDA3LDIxNDA1LDIxNDcxLDIxNzM2LDIxNzc2LDIxNzYxLDIxODE1LDIxNzU2LDIxNzMzLDIxNzQ2LDIxNzY2LDIxNzU0LDIxNzgwLDIxNzM3LDIxNzQxLDIxNzI5LDIxNzY5LDIxNzQyLDIxNzM4LDIxNzM0LDIxNzk5LDIxNzY3LDIxNzU3LDIxNzc1LDIyMjc1LDIyMjc2LDIyNDY2LDIyNDg0LDIyNDc1LDIyNDY3LDIyNTM3LDIyNzk5LDIyODcxLDIyODcyLDIyODc0LDIzMDU3LDIzMDY0LDIzMDY4LDIzMDcxLDIzMDY3LDIzMDU5LDIzMDIwLDIzMDcyLDIzMDc1LDIzMDgxLDIzMDc3LDIzMDUyLDIzMDQ5LDIzNDAzLDIzNjQwLDIzNDcyLDIzNDc1LDIzNDc4LDIzNDc2LDIzNDcwLDIzNDc3LDIzNDgxLDIzNDgwLDIzNTU2LDIzNjMzLDIzNjM3LDIzNjMyLDIzNzg5LDIzODA1LDIzODAzLDIzNzg2LDIzNzg0LDIzNzkyLDIzNzk4LDIzODA5LDIzNzk2LDI0MDQ2LDI0MTA5LDI0MTA3LDI0MjM1LDI0MjM3LDI0MjMxLDI0MzY5LDI0NDY2LDI0NDY1LDI0NDY0LDI0NjY1LDI0Njc1LDI0Njc3LDI0NjU2LDI0NjYxLDI0Njg1LDI0NjgxLDI0Njg3LDI0NzA4LDI0NzM1LDI0NzMwLDI0NzE3LDI0NzI0LDI0NzE2LDI0NzA5LDI0NzI2LDI1MTU5LDI1MzMxLDI1MzUyLDI1MzQzLDI1NDIyLDI1NDA2LDI1MzkxLDI1NDI5LDI1NDEwLDI1NDE0LDI1NDIzLDI1NDE3LDI1NDAyLDI1NDI0LDI1NDA1LDI1Mzg2LDI1Mzg3LDI1Mzg0LDI1NDIxLDI1NDIwLDI1OTI4LDI1OTI5LDI2MDA5LDI2MDQ5LDI2MDUzLDI2MTc4LDI2MTg1LDI2MTkxLDI2MTc5LDI2MTk0LDI2MTg4LDI2MTgxLDI2MTc3LDI2MzYwLDI2Mzg4LDI2Mzg5LDI2MzkxLDI2NjU3LDI2NjgwLDI2Njk2LDI2Njk0LDI2NzA3LDI2NjgxLDI2NjkwLDI2NzA4LDI2NjY1LDI2ODAzLDI2NjQ3LDI2NzAwLDI2NzA1LDI2Njg1LDI2NjEyLDI2NzA0LDI2Njg4LDI2Njg0LDI2NjkxLDI2NjY2LDI2NjkzLDI2NjQzLDI2NjQ4LDI2Njg5LDI3NTMwLDI3NTI5LDI3NTc1LDI3NjgzLDI3Njg3LDI3Njg4LDI3Njg2LDI3Njg0LDI3ODg4LDI4MDEwLDI4MDUzLDI4MDQwLDI4MDM5LDI4MDA2LDI4MDI0LDI4MDIzLDI3OTkzLDI4MDUxLDI4MDEyLDI4MDQxLDI4MDE0LDI3OTk0LDI4MDIwLDI4MDA5LDI4MDQ0LDI4MDQyLDI4MDI1LDI4MDM3LDI4MDA1LDI4MDUyLDI4ODc0LDI4ODg4LDI4OTAwLDI4ODg5LDI4ODcyLDI4ODc5LDI5MjQxLDI5MzA1LDI5NDM2LDI5NDMzLDI5NDM3LDI5NDMyLDI5NDMxLDI5NTc0LDI5Njc3LDI5NzA1LDI5Njc4LDI5NjY0LDI5Njc0LDI5NjYyLDMwMDM2LDMwMDQ1LDMwMDQ0LDMwMDQyLDMwMDQxLDMwMTQyLDMwMTQ5LDMwMTUxLDMwMTMwLDMwMTMxLDMwMTQxLDMwMTQwLDMwMTM3LDMwMTQ2LDMwMTM2LDMwMzQ3LDMwMzg0LDMwNDEwLDMwNDEzLDMwNDE0LDMwNTA1LDMwNDk1LDMwNDk2LDMwNTA0LDMwNjk3LDMwNzY4LDMwNzU5LDMwNzc2LDMwNzQ5LDMwNzcyLDMwNzc1LDMwNzU3LDMwNzY1LDMwNzUyLDMwNzUxLDMwNzcwLDMxMDYxLDMxMDU2LDMxMDcyLDMxMDcxLDMxMDYyLDMxMDcwLDMxMDY5LDMxMDYzLDMxMDY2LDMxMjA0LDMxMjAzLDMxMjA3LDMxMTk5LDMxMjA2LDMxMjA5LDMxMTkyLDMxMzY0LDMxMzY4LDMxNDQ5LDMxNDk0LDMxNTA1LDMxODgxLDMyMDMzLDMyMDIzLDMyMDExLDMyMDEwLDMyMDMyLDMyMDM0LDMyMDIwLDMyMDE2LDMyMDIxLDMyMDI2LDMyMDI4LDMyMDEzLDMyMDI1LDMyMDI3LDMyNTcwLDMyNjA3LDMyNjYwLDMyNzA5LDMyNzA1LDMyNzc0LDMyNzkyLDMyNzg5LDMyNzkzLDMyNzkxLDMyODI5LDMyODMxLDMzMDA5LDMzMDI2LDMzMDA4LDMzMDI5LDMzMDA1LDMzMDEyLDMzMDMwLDMzMDE2LDMzMDExLDMzMDMyLDMzMDIxLDMzMDM0LDMzMDIwLDMzMDA3LDMzMjYxLDMzMjYwLDMzMjgwLDMzMjk2LDMzMzIyLDMzMzIzLDMzMzIwLDMzMzI0LDMzNDY3LDMzNTc5LDMzNjE4LDMzNjIwLDMzNjEwLDMzNTkyLDMzNjE2LDMzNjA5LDMzNTg5LDMzNTg4LDMzNjE1LDMzNTg2LDMzNTkzLDMzNTkwLDMzNTU5LDMzNjAwLDMzNTg1LDMzNTc2LDMzNjAzLDM0Mzg4LDM0NDQyLDM0NDc0LDM0NDUxLDM0NDY4LDM0NDczLDM0NDQ0LDM0NDY3LDM0NDYwLDM0OTI4LDM0OTM1LDM0OTQ1LDM0OTQ2LDM0OTQxLDM0OTM3LDM1MzUyLDM1MzQ0LDM1MzQyLDM1MzQwLDM1MzQ5LDM1MzM4LDM1MzUxLDM1MzQ3LDM1MzUwLDM1MzQzLDM1MzQ1LDM1OTEyLDM1OTYyLDM1OTYxLDM2MDAxLDM2MDAyLDM2MjE1LDM2NTI0LDM2NTYyLDM2NTY0LDM2NTU5LDM2Nzg1LDM2ODY1LDM2ODcwLDM2ODU1LDM2ODY0LDM2ODU4LDM2ODUyLDM2ODY3LDM2ODYxLDM2ODY5LDM2ODU2LDM3MDEzLDM3MDg5LDM3MDg1LDM3MDkwLDM3MjAyLDM3MTk3LDM3MTk2LDM3MzM2LDM3MzQxLDM3MzM1LDM3MzQwLDM3MzM3LDM4Mjc1LDM4NDk4LDM4NDk5LDM4NDk3LDM4NDkxLDM4NDkzLDM4NTAwLDM4NDg4LDM4NDk0LDM4NTg3LDM5MTM4LDM5MzQwLDM5NTkyLDM5NjQwLDM5NzE3LDM5NzMwLDM5NzQwLDIwMDk0LDIwNjAyLDIwNjA1LDIwNTcyLDIwNTUxLDIwNTQ3LDIwNTU2LDIwNTcwLDIwNTUzLDIwNTgxLDIwNTk4LDIwNTU4LDIwNTY1LDIwNTk3LDIwNTk2LDIwNTk5LDIwNTU5LDIwNDk1LDIwNTkxLDIwNTg5LDIwODI4LDIwODg1LDIwOTc2LDIxMDk4LDIxMTAzLDIxMjAyLDIxMjA5LDIxMjA4LDIxMjA1LDIxMjY0LDIxMjYzLDIxMjczLDIxMzExLDIxMzEyLDIxMzEwLDIxNDQzLDI2MzY0LDIxODMwLDIxODY2LDIxODYyLDIxODI4LDIxODU0LDIxODU3LDIxODI3LDIxODM0LDIxODA5LDIxODQ2LDIxODM5LDIxODQ1LDIxODA3LDIxODYwLDIxODE2LDIxODA2LDIxODUyLDIxODA0LDIxODU5LDIxODExLDIxODI1LDIxODQ3LDIyMjgwLDIyMjgzLDIyMjgxLDIyNDk1LDIyNTMzLDIyNTM4LDIyNTM0LDIyNDk2LDIyNTAwLDIyNTIyLDIyNTMwLDIyNTgxLDIyNTE5LDIyNTIxLDIyODE2LDIyODgyLDIzMDk0LDIzMTA1LDIzMTEzLDIzMTQyLDIzMTQ2LDIzMTA0LDIzMTAwLDIzMTM4LDIzMTMwLDIzMTEwLDIzMTE0LDIzNDA4LDIzNDk1LDIzNDkzLDIzNDkyLDIzNDkwLDIzNDg3LDIzNDk0LDIzNTYxLDIzNTYwLDIzNTU5LDIzNjQ4LDIzNjQ0LDIzNjQ1LDIzODE1LDIzODE0LDIzODIyLDIzODM1LDIzODMwLDIzODQyLDIzODI1LDIzODQ5LDIzODI4LDIzODMzLDIzODQ0LDIzODQ3LDIzODMxLDI0MDM0LDI0MTIwLDI0MTE4LDI0MTE1LDI0MTE5LDI0MjQ3LDI0MjQ4LDI0MjQ2LDI0MjQ1LDI0MjU0LDI0MzczLDI0Mzc1LDI0NDA3LDI0NDI4LDI0NDI1LDI0NDI3LDI0NDcxLDI0NDczLDI0NDc4LDI0NDcyLDI0NDgxLDI0NDgwLDI0NDc2LDI0NzAzLDI0NzM5LDI0NzEzLDI0NzM2LDI0NzQ0LDI0Nzc5LDI0NzU2LDI0ODA2LDI0NzY1LDI0NzczLDI0NzYzLDI0NzU3LDI0Nzk2LDI0NzY0LDI0NzkyLDI0Nzg5LDI0Nzc0LDI0Nzk5LDI0NzYwLDI0Nzk0LDI0Nzc1LDI1MTE0LDI1MTE1LDI1MTYwLDI1NTA0LDI1NTExLDI1NDU4LDI1NDk0LDI1NTA2LDI1NTA5LDI1NDYzLDI1NDQ3LDI1NDk2LDI1NTE0LDI1NDU3LDI1NTEzLDI1NDgxLDI1NDc1LDI1NDk5LDI1NDUxLDI1NTEyLDI1NDc2LDI1NDgwLDI1NDk3LDI1NTA1LDI1NTE2LDI1NDkwLDI1NDg3LDI1NDcyLDI1NDY3LDI1NDQ5LDI1NDQ4LDI1NDY2LDI1OTQ5LDI1OTQyLDI1OTM3LDI1OTQ1LDI1OTQzLDIxODU1LDI1OTM1LDI1OTQ0LDI1OTQxLDI1OTQwLDI2MDEyLDI2MDExLDI2MDI4LDI2MDYzLDI2MDU5LDI2MDYwLDI2MDYyLDI2MjA1LDI2MjAyLDI2MjEyLDI2MjE2LDI2MjE0LDI2MjA2LDI2MzYxLDIxMjA3LDI2Mzk1LDI2NzUzLDI2Nzk5LDI2Nzg2LDI2NzcxLDI2ODA1LDI2NzUxLDI2NzQyLDI2ODAxLDI2NzkxLDI2Nzc1LDI2ODAwLDI2NzU1LDI2ODIwLDI2Nzk3LDI2NzU4LDI2NzU3LDI2NzcyLDI2NzgxLDI2NzkyLDI2NzgzLDI2Nzg1LDI2NzU0LDI3NDQyLDI3NTc4LDI3NjI3LDI3NjI4LDI3NjkxLDI4MDQ2LDI4MDkyLDI4MTQ3LDI4MTIxLDI4MDgyLDI4MTI5LDI4MTA4LDI4MTMyLDI4MTU1LDI4MTU0LDI4MTY1LDI4MTAzLDI4MTA3LDI4MDc5LDI4MTEzLDI4MDc4LDI4MTI2LDI4MTUzLDI4MDg4LDI4MTUxLDI4MTQ5LDI4MTAxLDI4MTE0LDI4MTg2LDI4MDg1LDI4MTIyLDI4MTM5LDI4MTIwLDI4MTM4LDI4MTQ1LDI4MTQyLDI4MTM2LDI4MTAyLDI4MTAwLDI4MDc0LDI4MTQwLDI4MDk1LDI4MTM0LDI4OTIxLDI4OTM3LDI4OTM4LDI4OTI1LDI4OTExLDI5MjQ1LDI5MzA5LDI5MzEzLDI5NDY4LDI5NDY3LDI5NDYyLDI5NDU5LDI5NDY1LDI5NTc1LDI5NzAxLDI5NzA2LDI5Njk5LDI5NzAyLDI5Njk0LDI5NzA5LDI5OTIwLDI5OTQyLDI5OTQzLDI5OTgwLDI5OTg2LDMwMDUzLDMwMDU0LDMwMDUwLDMwMDY0LDMwMDk1LDMwMTY0LDMwMTY1LDMwMTMzLDMwMTU0LDMwMTU3LDMwMzUwLDMwNDIwLDMwNDE4LDMwNDI3LDMwNTE5LDMwNTI2LDMwNTI0LDMwNTE4LDMwNTIwLDMwNTIyLDMwODI3LDMwNzg3LDMwNzk4LDMxMDc3LDMxMDgwLDMxMDg1LDMxMjI3LDMxMzc4LDMxMzgxLDMxNTIwLDMxNTI4LDMxNTE1LDMxNTMyLDMxNTI2LDMxNTEzLDMxNTE4LDMxNTM0LDMxODkwLDMxODk1LDMxODkzLDMyMDcwLDMyMDY3LDMyMTEzLDMyMDQ2LDMyMDU3LDMyMDYwLDMyMDY0LDMyMDQ4LDMyMDUxLDMyMDY4LDMyMDQ3LDMyMDY2LDMyMDUwLDMyMDQ5LDMyNTczLDMyNjcwLDMyNjY2LDMyNzE2LDMyNzE4LDMyNzIyLDMyNzk2LDMyODQyLDMyODM4LDMzMDcxLDMzMDQ2LDMzMDU5LDMzMDY3LDMzMDY1LDMzMDcyLDMzMDYwLDMzMjgyLDMzMzMzLDMzMzM1LDMzMzM0LDMzMzM3LDMzNjc4LDMzNjk0LDMzNjg4LDMzNjU2LDMzNjk4LDMzNjg2LDMzNzI1LDMzNzA3LDMzNjgyLDMzNjc0LDMzNjgzLDMzNjczLDMzNjk2LDMzNjU1LDMzNjU5LDMzNjYwLDMzNjcwLDMzNzAzLDM0Mzg5LDI0NDI2LDM0NTAzLDM0NDk2LDM0NDg2LDM0NTAwLDM0NDg1LDM0NTAyLDM0NTA3LDM0NDgxLDM0NDc5LDM0NTA1LDM0ODk5LDM0OTc0LDM0OTUyLDM0OTg3LDM0OTYyLDM0OTY2LDM0OTU3LDM0OTU1LDM1MjE5LDM1MjE1LDM1MzcwLDM1MzU3LDM1MzYzLDM1MzY1LDM1Mzc3LDM1MzczLDM1MzU5LDM1MzU1LDM1MzYyLDM1OTEzLDM1OTMwLDM2MDA5LDM2MDEyLDM2MDExLDM2MDA4LDM2MDEwLDM2MDA3LDM2MTk5LDM2MTk4LDM2Mjg2LDM2MjgyLDM2NTcxLDM2NTc1LDM2ODg5LDM2ODc3LDM2ODkwLDM2ODg3LDM2ODk5LDM2ODk1LDM2ODkzLDM2ODgwLDM2ODg1LDM2ODk0LDM2ODk2LDM2ODc5LDM2ODk4LDM2ODg2LDM2ODkxLDM2ODg0LDM3MDk2LDM3MTAxLDM3MTE3LDM3MjA3LDM3MzI2LDM3MzY1LDM3MzUwLDM3MzQ3LDM3MzUxLDM3MzU3LDM3MzUzLDM4MjgxLDM4NTA2LDM4NTE3LDM4NTE1LDM4NTIwLDM4NTEyLDM4NTE2LDM4NTE4LDM4NTE5LDM4NTA4LDM4NTkyLDM4NjM0LDM4NjMzLDMxNDU2LDMxNDU1LDM4OTE0LDM4OTE1LDM5NzcwLDQwMTY1LDQwNTY1LDQwNTc1LDQwNjEzLDQwNjM1LDIwNjQyLDIwNjIxLDIwNjEzLDIwNjMzLDIwNjI1LDIwNjA4LDIwNjMwLDIwNjMyLDIwNjM0LDI2MzY4LDIwOTc3LDIxMTA2LDIxMTA4LDIxMTA5LDIxMDk3LDIxMjE0LDIxMjEzLDIxMjExLDIxMzM4LDIxNDEzLDIxODgzLDIxODg4LDIxOTI3LDIxODg0LDIxODk4LDIxOTE3LDIxOTEyLDIxODkwLDIxOTE2LDIxOTMwLDIxOTA4LDIxODk1LDIxODk5LDIxODkxLDIxOTM5LDIxOTM0LDIxOTE5LDIxODIyLDIxOTM4LDIxOTE0LDIxOTQ3LDIxOTMyLDIxOTM3LDIxODg2LDIxODk3LDIxOTMxLDIxOTEzLDIyMjg1LDIyNTc1LDIyNTcwLDIyNTgwLDIyNTY0LDIyNTc2LDIyNTc3LDIyNTYxLDIyNTU3LDIyNTYwLDIyNzc3LDIyNzc4LDIyODgwLDIzMTU5LDIzMTk0LDIzMTY3LDIzMTg2LDIzMTk1LDIzMjA3LDIzNDExLDIzNDA5LDIzNTA2LDIzNTAwLDIzNTA3LDIzNTA0LDIzNTYyLDIzNTYzLDIzNjAxLDIzODg0LDIzODg4LDIzODYwLDIzODc5LDI0MDYxLDI0MTMzLDI0MTI1LDI0MTI4LDI0MTMxLDI0MTkwLDI0MjY2LDI0MjU3LDI0MjU4LDI0MjYwLDI0MzgwLDI0NDI5LDI0NDg5LDI0NDkwLDI0NDg4LDI0Nzg1LDI0ODAxLDI0NzU0LDI0NzU4LDI0ODAwLDI0ODYwLDI0ODY3LDI0ODI2LDI0ODUzLDI0ODE2LDI0ODI3LDI0ODIwLDI0OTM2LDI0ODE3LDI0ODQ2LDI0ODIyLDI0ODQxLDI0ODMyLDI0ODUwLDI1MTE5LDI1MTYxLDI1NTA3LDI1NDg0LDI1NTUxLDI1NTM2LDI1NTc3LDI1NTQ1LDI1NTQyLDI1NTQ5LDI1NTU0LDI1NTcxLDI1NTUyLDI1NTY5LDI1NTU4LDI1NTgxLDI1NTgyLDI1NDYyLDI1NTg4LDI1NTc4LDI1NTYzLDI1NjgyLDI1NTYyLDI1NTkzLDI1OTUwLDI1OTU4LDI1OTU0LDI1OTU1LDI2MDAxLDI2MDAwLDI2MDMxLDI2MjIyLDI2MjI0LDI2MjI4LDI2MjMwLDI2MjIzLDI2MjU3LDI2MjM0LDI2MjM4LDI2MjMxLDI2MzY2LDI2MzY3LDI2Mzk5LDI2Mzk3LDI2ODc0LDI2ODM3LDI2ODQ4LDI2ODQwLDI2ODM5LDI2ODg1LDI2ODQ3LDI2ODY5LDI2ODYyLDI2ODU1LDI2ODczLDI2ODM0LDI2ODY2LDI2ODUxLDI2ODI3LDI2ODI5LDI2ODkzLDI2ODk4LDI2ODk0LDI2ODI1LDI2ODQyLDI2OTkwLDI2ODc1LDI3NDU0LDI3NDUwLDI3NDUzLDI3NTQ0LDI3NTQyLDI3NTgwLDI3NjMxLDI3Njk0LDI3Njk1LDI3NjkyLDI4MjA3LDI4MjE2LDI4MjQ0LDI4MTkzLDI4MjEwLDI4MjYzLDI4MjM0LDI4MTkyLDI4MTk3LDI4MTk1LDI4MTg3LDI4MjUxLDI4MjQ4LDI4MTk2LDI4MjQ2LDI4MjcwLDI4MjA1LDI4MTk4LDI4MjcxLDI4MjEyLDI4MjM3LDI4MjE4LDI4MjA0LDI4MjI3LDI4MTg5LDI4MjIyLDI4MzYzLDI4Mjk3LDI4MTg1LDI4MjM4LDI4MjU5LDI4MjI4LDI4Mjc0LDI4MjY1LDI4MjU1LDI4OTUzLDI4OTU0LDI4OTY2LDI4OTc2LDI4OTYxLDI4OTgyLDI5MDM4LDI4OTU2LDI5MjYwLDI5MzE2LDI5MzEyLDI5NDk0LDI5NDc3LDI5NDkyLDI5NDgxLDI5NzU0LDI5NzM4LDI5NzQ3LDI5NzMwLDI5NzMzLDI5NzQ5LDI5NzUwLDI5NzQ4LDI5NzQzLDI5NzIzLDI5NzM0LDI5NzM2LDI5OTg5LDI5OTkwLDMwMDU5LDMwMDU4LDMwMTc4LDMwMTcxLDMwMTc5LDMwMTY5LDMwMTY4LDMwMTc0LDMwMTc2LDMwMzMxLDMwMzMyLDMwMzU4LDMwMzU1LDMwMzg4LDMwNDI4LDMwNTQzLDMwNzAxLDMwODEzLDMwODI4LDMwODMxLDMxMjQ1LDMxMjQwLDMxMjQzLDMxMjM3LDMxMjMyLDMxMzg0LDMxMzgzLDMxMzgyLDMxNDYxLDMxNDU5LDMxNTYxLDMxNTc0LDMxNTU4LDMxNTY4LDMxNTcwLDMxNTcyLDMxNTY1LDMxNTYzLDMxNTY3LDMxNTY5LDMxOTAzLDMxOTA5LDMyMDk0LDMyMDgwLDMyMTA0LDMyMDg1LDMyMDQzLDMyMTEwLDMyMTE0LDMyMDk3LDMyMTAyLDMyMDk4LDMyMTEyLDMyMTE1LDIxODkyLDMyNzI0LDMyNzI1LDMyNzc5LDMyODUwLDMyOTAxLDMzMTA5LDMzMTA4LDMzMDk5LDMzMTA1LDMzMTAyLDMzMDgxLDMzMDk0LDMzMDg2LDMzMTAwLDMzMTA3LDMzMTQwLDMzMjk4LDMzMzA4LDMzNzY5LDMzNzk1LDMzNzg0LDMzODA1LDMzNzYwLDMzNzMzLDMzODAzLDMzNzI5LDMzNzc1LDMzNzc3LDMzNzgwLDMzODc5LDMzODAyLDMzNzc2LDMzODA0LDMzNzQwLDMzNzg5LDMzNzc4LDMzNzM4LDMzODQ4LDMzODA2LDMzNzk2LDMzNzU2LDMzNzk5LDMzNzQ4LDMzNzU5LDM0Mzk1LDM0NTI3LDM0NTIxLDM0NTQxLDM0NTE2LDM0NTIzLDM0NTMyLDM0NTEyLDM0NTI2LDM0OTAzLDM1MDA5LDM1MDEwLDM0OTkzLDM1MjAzLDM1MjIyLDM1Mzg3LDM1NDI0LDM1NDEzLDM1NDIyLDM1Mzg4LDM1MzkzLDM1NDEyLDM1NDE5LDM1NDA4LDM1Mzk4LDM1MzgwLDM1Mzg2LDM1MzgyLDM1NDE0LDM1OTM3LDM1OTcwLDM2MDE1LDM2MDI4LDM2MDE5LDM2MDI5LDM2MDMzLDM2MDI3LDM2MDMyLDM2MDIwLDM2MDIzLDM2MDIyLDM2MDMxLDM2MDI0LDM2MjM0LDM2MjI5LDM2MjI1LDM2MzAyLDM2MzE3LDM2Mjk5LDM2MzE0LDM2MzA1LDM2MzAwLDM2MzE1LDM2Mjk0LDM2NjAzLDM2NjAwLDM2NjA0LDM2NzY0LDM2OTEwLDM2OTE3LDM2OTEzLDM2OTIwLDM2OTE0LDM2OTE4LDM3MTIyLDM3MTA5LDM3MTI5LDM3MTE4LDM3MjE5LDM3MjIxLDM3MzI3LDM3Mzk2LDM3Mzk3LDM3NDExLDM3Mzg1LDM3NDA2LDM3Mzg5LDM3MzkyLDM3MzgzLDM3MzkzLDM4MjkyLDM4Mjg3LDM4MjgzLDM4Mjg5LDM4MjkxLDM4MjkwLDM4Mjg2LDM4NTM4LDM4NTQyLDM4NTM5LDM4NTI1LDM4NTMzLDM4NTM0LDM4NTQxLDM4NTE0LDM4NTMyLDM4NTkzLDM4NTk3LDM4NTk2LDM4NTk4LDM4NTk5LDM4NjM5LDM4NjQyLDM4ODYwLDM4OTE3LDM4OTE4LDM4OTIwLDM5MTQzLDM5MTQ2LDM5MTUxLDM5MTQ1LDM5MTU0LDM5MTQ5LDM5MzQyLDM5MzQxLDQwNjQzLDQwNjUzLDQwNjU3LDIwMDk4LDIwNjUzLDIwNjYxLDIwNjU4LDIwNjU5LDIwNjc3LDIwNjcwLDIwNjUyLDIwNjYzLDIwNjY3LDIwNjU1LDIwNjc5LDIxMTE5LDIxMTExLDIxMTE3LDIxMjE1LDIxMjIyLDIxMjIwLDIxMjE4LDIxMjE5LDIxMjk1LDIxOTgzLDIxOTkyLDIxOTcxLDIxOTkwLDIxOTY2LDIxOTgwLDIxOTU5LDIxOTY5LDIxOTg3LDIxOTg4LDIxOTk5LDIxOTc4LDIxOTg1LDIxOTU3LDIxOTU4LDIxOTg5LDIxOTYxLDIyMjkwLDIyMjkxLDIyNjIyLDIyNjA5LDIyNjE2LDIyNjE1LDIyNjE4LDIyNjEyLDIyNjM1LDIyNjA0LDIyNjM3LDIyNjAyLDIyNjI2LDIyNjEwLDIyNjAzLDIyODg3LDIzMjMzLDIzMjQxLDIzMjQ0LDIzMjMwLDIzMjI5LDIzMjI4LDIzMjE5LDIzMjM0LDIzMjE4LDIzOTEzLDIzOTE5LDI0MTQwLDI0MTg1LDI0MjY1LDI0MjY0LDI0MzM4LDI0NDA5LDI0NDkyLDI0NDk0LDI0ODU4LDI0ODQ3LDI0OTA0LDI0ODYzLDI0ODE5LDI0ODU5LDI0ODI1LDI0ODMzLDI0ODQwLDI0OTEwLDI0OTA4LDI0OTAwLDI0OTA5LDI0ODk0LDI0ODg0LDI0ODcxLDI0ODQ1LDI0ODM4LDI0ODg3LDI1MTIxLDI1MTIyLDI1NjE5LDI1NjYyLDI1NjMwLDI1NjQyLDI1NjQ1LDI1NjYxLDI1NjQ0LDI1NjE1LDI1NjI4LDI1NjIwLDI1NjEzLDI1NjU0LDI1NjIyLDI1NjIzLDI1NjA2LDI1OTY0LDI2MDE1LDI2MDMyLDI2MjYzLDI2MjQ5LDI2MjQ3LDI2MjQ4LDI2MjYyLDI2MjQ0LDI2MjY0LDI2MjUzLDI2MzcxLDI3MDI4LDI2OTg5LDI2OTcwLDI2OTk5LDI2OTc2LDI2OTY0LDI2OTk3LDI2OTI4LDI3MDEwLDI2OTU0LDI2OTg0LDI2OTg3LDI2OTc0LDI2OTYzLDI3MDAxLDI3MDE0LDI2OTczLDI2OTc5LDI2OTcxLDI3NDYzLDI3NTA2LDI3NTg0LDI3NTgzLDI3NjAzLDI3NjQ1LDI4MzIyLDI4MzM1LDI4MzcxLDI4MzQyLDI4MzU0LDI4MzA0LDI4MzE3LDI4MzU5LDI4MzU3LDI4MzI1LDI4MzEyLDI4MzQ4LDI4MzQ2LDI4MzMxLDI4MzY5LDI4MzEwLDI4MzE2LDI4MzU2LDI4MzcyLDI4MzMwLDI4MzI3LDI4MzQwLDI5MDA2LDI5MDE3LDI5MDMzLDI5MDI4LDI5MDAxLDI5MDMxLDI5MDIwLDI5MDM2LDI5MDMwLDI5MDA0LDI5MDI5LDI5MDIyLDI4OTk4LDI5MDMyLDI5MDE0LDI5MjQyLDI5MjY2LDI5NDk1LDI5NTA5LDI5NTAzLDI5NTAyLDI5ODA3LDI5Nzg2LDI5NzgxLDI5NzkxLDI5NzkwLDI5NzYxLDI5NzU5LDI5Nzg1LDI5Nzg3LDI5Nzg4LDMwMDcwLDMwMDcyLDMwMjA4LDMwMTkyLDMwMjA5LDMwMTk0LDMwMTkzLDMwMjAyLDMwMjA3LDMwMTk2LDMwMTk1LDMwNDMwLDMwNDMxLDMwNTU1LDMwNTcxLDMwNTY2LDMwNTU4LDMwNTYzLDMwNTg1LDMwNTcwLDMwNTcyLDMwNTU2LDMwNTY1LDMwNTY4LDMwNTYyLDMwNzAyLDMwODYyLDMwODk2LDMwODcxLDMwODcyLDMwODYwLDMwODU3LDMwODQ0LDMwODY1LDMwODY3LDMwODQ3LDMxMDk4LDMxMTAzLDMxMTA1LDMzODM2LDMxMTY1LDMxMjYwLDMxMjU4LDMxMjY0LDMxMjUyLDMxMjYzLDMxMjYyLDMxMzkxLDMxMzkyLDMxNjA3LDMxNjgwLDMxNTg0LDMxNTk4LDMxNTkxLDMxOTIxLDMxOTIzLDMxOTI1LDMyMTQ3LDMyMTIxLDMyMTQ1LDMyMTI5LDMyMTQzLDMyMDkxLDMyNjIyLDMyNjE3LDMyNjE4LDMyNjI2LDMyNjgxLDMyNjgwLDMyNjc2LDMyODU0LDMyODU2LDMyOTAyLDMyOTAwLDMzMTM3LDMzMTM2LDMzMTQ0LDMzMTI1LDMzMTM0LDMzMTM5LDMzMTMxLDMzMTQ1LDMzMTQ2LDMzMTI2LDMzMjg1LDMzMzUxLDMzOTIyLDMzOTExLDMzODUzLDMzODQxLDMzOTA5LDMzODk0LDMzODk5LDMzODY1LDMzOTAwLDMzODgzLDMzODUyLDMzODQ1LDMzODg5LDMzODkxLDMzODk3LDMzOTAxLDMzODYyLDM0Mzk4LDM0Mzk2LDM0Mzk5LDM0NTUzLDM0NTc5LDM0NTY4LDM0NTY3LDM0NTYwLDM0NTU4LDM0NTU1LDM0NTYyLDM0NTYzLDM0NTY2LDM0NTcwLDM0OTA1LDM1MDM5LDM1MDI4LDM1MDMzLDM1MDM2LDM1MDMyLDM1MDM3LDM1MDQxLDM1MDE4LDM1MDI5LDM1MDI2LDM1MjI4LDM1Mjk5LDM1NDM1LDM1NDQyLDM1NDQzLDM1NDMwLDM1NDMzLDM1NDQwLDM1NDYzLDM1NDUyLDM1NDI3LDM1NDg4LDM1NDQxLDM1NDYxLDM1NDM3LDM1NDI2LDM1NDM4LDM1NDM2LDM1NDQ5LDM1NDUxLDM1MzkwLDM1NDMyLDM1OTM4LDM1OTc4LDM1OTc3LDM2MDQyLDM2MDM5LDM2MDQwLDM2MDM2LDM2MDE4LDM2MDM1LDM2MDM0LDM2MDM3LDM2MzIxLDM2MzE5LDM2MzI4LDM2MzM1LDM2MzM5LDM2MzQ2LDM2MzMwLDM2MzI0LDM2MzI2LDM2NTMwLDM2NjExLDM2NjE3LDM2NjA2LDM2NjE4LDM2NzY3LDM2Nzg2LDM2OTM5LDM2OTM4LDM2OTQ3LDM2OTMwLDM2OTQ4LDM2OTI0LDM2OTQ5LDM2OTQ0LDM2OTM1LDM2OTQzLDM2OTQyLDM2OTQxLDM2OTQ1LDM2OTI2LDM2OTI5LDM3MTM4LDM3MTQzLDM3MjI4LDM3MjI2LDM3MjI1LDM3MzIxLDM3NDMxLDM3NDYzLDM3NDMyLDM3NDM3LDM3NDQwLDM3NDM4LDM3NDY3LDM3NDUxLDM3NDc2LDM3NDU3LDM3NDI4LDM3NDQ5LDM3NDUzLDM3NDQ1LDM3NDMzLDM3NDM5LDM3NDY2LDM4Mjk2LDM4NTUyLDM4NTQ4LDM4NTQ5LDM4NjA1LDM4NjAzLDM4NjAxLDM4NjAyLDM4NjQ3LDM4NjUxLDM4NjQ5LDM4NjQ2LDM4NzQyLDM4NzcyLDM4Nzc0LDM4OTI4LDM4OTI5LDM4OTMxLDM4OTIyLDM4OTMwLDM4OTI0LDM5MTY0LDM5MTU2LDM5MTY1LDM5MTY2LDM5MzQ3LDM5MzQ1LDM5MzQ4LDM5NjQ5LDQwMTY5LDQwNTc4LDQwNzE4LDQwNzIzLDQwNzM2LDIwNzExLDIwNzE4LDIwNzA5LDIwNjk0LDIwNzE3LDIwNjk4LDIwNjkzLDIwNjg3LDIwNjg5LDIwNzIxLDIwNjg2LDIwNzEzLDIwODM0LDIwOTc5LDIxMTIzLDIxMTIyLDIxMjk3LDIxNDIxLDIyMDE0LDIyMDE2LDIyMDQzLDIyMDM5LDIyMDEzLDIyMDM2LDIyMDIyLDIyMDI1LDIyMDI5LDIyMDMwLDIyMDA3LDIyMDM4LDIyMDQ3LDIyMDI0LDIyMDMyLDIyMDA2LDIyMjk2LDIyMjk0LDIyNjQ1LDIyNjU0LDIyNjU5LDIyNjc1LDIyNjY2LDIyNjQ5LDIyNjYxLDIyNjUzLDIyNzgxLDIyODIxLDIyODE4LDIyODIwLDIyODkwLDIyODg5LDIzMjY1LDIzMjcwLDIzMjczLDIzMjU1LDIzMjU0LDIzMjU2LDIzMjY3LDIzNDEzLDIzNTE4LDIzNTI3LDIzNTIxLDIzNTI1LDIzNTI2LDIzNTI4LDIzNTIyLDIzNTI0LDIzNTE5LDIzNTY1LDIzNjUwLDIzOTQwLDIzOTQzLDI0MTU1LDI0MTYzLDI0MTQ5LDI0MTUxLDI0MTQ4LDI0Mjc1LDI0Mjc4LDI0MzMwLDI0MzkwLDI0NDMyLDI0NTA1LDI0OTAzLDI0ODk1LDI0OTA3LDI0OTUxLDI0OTMwLDI0OTMxLDI0OTI3LDI0OTIyLDI0OTIwLDI0OTQ5LDI1MTMwLDI1NzM1LDI1Njg4LDI1Njg0LDI1NzY0LDI1NzIwLDI1Njk1LDI1NzIyLDI1NjgxLDI1NzAzLDI1NjUyLDI1NzA5LDI1NzIzLDI1OTcwLDI2MDE3LDI2MDcxLDI2MDcwLDI2Mjc0LDI2MjgwLDI2MjY5LDI3MDM2LDI3MDQ4LDI3MDI5LDI3MDczLDI3MDU0LDI3MDkxLDI3MDgzLDI3MDM1LDI3MDYzLDI3MDY3LDI3MDUxLDI3MDYwLDI3MDg4LDI3MDg1LDI3MDUzLDI3MDg0LDI3MDQ2LDI3MDc1LDI3MDQzLDI3NDY1LDI3NDY4LDI3Njk5LDI4NDY3LDI4NDM2LDI4NDE0LDI4NDM1LDI4NDA0LDI4NDU3LDI4NDc4LDI4NDQ4LDI4NDYwLDI4NDMxLDI4NDE4LDI4NDUwLDI4NDE1LDI4Mzk5LDI4NDIyLDI4NDY1LDI4NDcyLDI4NDY2LDI4NDUxLDI4NDM3LDI4NDU5LDI4NDYzLDI4NTUyLDI4NDU4LDI4Mzk2LDI4NDE3LDI4NDAyLDI4MzY0LDI4NDA3LDI5MDc2LDI5MDgxLDI5MDUzLDI5MDY2LDI5MDYwLDI5MDc0LDI5MjQ2LDI5MzMwLDI5MzM0LDI5NTA4LDI5NTIwLDI5Nzk2LDI5Nzk1LDI5ODAyLDI5ODA4LDI5ODA1LDI5OTU2LDMwMDk3LDMwMjQ3LDMwMjIxLDMwMjE5LDMwMjE3LDMwMjI3LDMwNDMzLDMwNDM1LDMwNTk2LDMwNTg5LDMwNTkxLDMwNTYxLDMwOTEzLDMwODc5LDMwODg3LDMwODk5LDMwODg5LDMwODgzLDMxMTE4LDMxMTE5LDMxMTE3LDMxMjc4LDMxMjgxLDMxNDAyLDMxNDAxLDMxNDY5LDMxNDcxLDMxNjQ5LDMxNjM3LDMxNjI3LDMxNjA1LDMxNjM5LDMxNjQ1LDMxNjM2LDMxNjMxLDMxNjcyLDMxNjIzLDMxNjIwLDMxOTI5LDMxOTMzLDMxOTM0LDMyMTg3LDMyMTc2LDMyMTU2LDMyMTg5LDMyMTkwLDMyMTYwLDMyMjAyLDMyMTgwLDMyMTc4LDMyMTc3LDMyMTg2LDMyMTYyLDMyMTkxLDMyMTgxLDMyMTg0LDMyMTczLDMyMjEwLDMyMTk5LDMyMTcyLDMyNjI0LDMyNzM2LDMyNzM3LDMyNzM1LDMyODYyLDMyODU4LDMyOTAzLDMzMTA0LDMzMTUyLDMzMTY3LDMzMTYwLDMzMTYyLDMzMTUxLDMzMTU0LDMzMjU1LDMzMjc0LDMzMjg3LDMzMzAwLDMzMzEwLDMzMzU1LDMzOTkzLDMzOTgzLDMzOTkwLDMzOTg4LDMzOTQ1LDMzOTUwLDMzOTcwLDMzOTQ4LDMzOTk1LDMzOTc2LDMzOTg0LDM0MDAzLDMzOTM2LDMzOTgwLDM0MDAxLDMzOTk0LDM0NjIzLDM0NTg4LDM0NjE5LDM0NTk0LDM0NTk3LDM0NjEyLDM0NTg0LDM0NjQ1LDM0NjE1LDM0NjAxLDM1MDU5LDM1MDc0LDM1MDYwLDM1MDY1LDM1MDY0LDM1MDY5LDM1MDQ4LDM1MDk4LDM1MDU1LDM1NDk0LDM1NDY4LDM1NDg2LDM1NDkxLDM1NDY5LDM1NDg5LDM1NDc1LDM1NDkyLDM1NDk4LDM1NDkzLDM1NDk2LDM1NDgwLDM1NDczLDM1NDgyLDM1NDk1LDM1OTQ2LDM1OTgxLDM1OTgwLDM2MDUxLDM2MDQ5LDM2MDUwLDM2MjAzLDM2MjQ5LDM2MjQ1LDM2MzQ4LDM2NjI4LDM2NjI2LDM2NjI5LDM2NjI3LDM2NzcxLDM2OTYwLDM2OTUyLDM2OTU2LDM2OTYzLDM2OTUzLDM2OTU4LDM2OTYyLDM2OTU3LDM2OTU1LDM3MTQ1LDM3MTQ0LDM3MTUwLDM3MjM3LDM3MjQwLDM3MjM5LDM3MjM2LDM3NDk2LDM3NTA0LDM3NTA5LDM3NTI4LDM3NTI2LDM3NDk5LDM3NTIzLDM3NTMyLDM3NTQ0LDM3NTAwLDM3NTIxLDM4MzA1LDM4MzEyLDM4MzEzLDM4MzA3LDM4MzA5LDM4MzA4LDM4NTUzLDM4NTU2LDM4NTU1LDM4NjA0LDM4NjEwLDM4NjU2LDM4NzgwLDM4Nzg5LDM4OTAyLDM4OTM1LDM4OTM2LDM5MDg3LDM5MDg5LDM5MTcxLDM5MTczLDM5MTgwLDM5MTc3LDM5MzYxLDM5NTk5LDM5NjAwLDM5NjU0LDM5NzQ1LDM5NzQ2LDQwMTgwLDQwMTgyLDQwMTc5LDQwNjM2LDQwNzYzLDQwNzc4LDIwNzQwLDIwNzM2LDIwNzMxLDIwNzI1LDIwNzI5LDIwNzM4LDIwNzQ0LDIwNzQ1LDIwNzQxLDIwOTU2LDIxMTI3LDIxMTI4LDIxMTI5LDIxMTMzLDIxMTMwLDIxMjMyLDIxNDI2LDIyMDYyLDIyMDc1LDIyMDczLDIyMDY2LDIyMDc5LDIyMDY4LDIyMDU3LDIyMDk5LDIyMDk0LDIyMTAzLDIyMTMyLDIyMDcwLDIyMDYzLDIyMDY0LDIyNjU2LDIyNjg3LDIyNjg2LDIyNzA3LDIyNjg0LDIyNzAyLDIyNjk3LDIyNjk0LDIyODkzLDIzMzA1LDIzMjkxLDIzMzA3LDIzMjg1LDIzMzA4LDIzMzA0LDIzNTM0LDIzNTMyLDIzNTI5LDIzNTMxLDIzNjUyLDIzNjUzLDIzOTY1LDIzOTU2LDI0MTYyLDI0MTU5LDI0MTYxLDI0MjkwLDI0MjgyLDI0Mjg3LDI0Mjg1LDI0MjkxLDI0Mjg4LDI0MzkyLDI0NDMzLDI0NTAzLDI0NTAxLDI0OTUwLDI0OTM1LDI0OTQyLDI0OTI1LDI0OTE3LDI0OTYyLDI0OTU2LDI0OTQ0LDI0OTM5LDI0OTU4LDI0OTk5LDI0OTc2LDI1MDAzLDI0OTc0LDI1MDA0LDI0OTg2LDI0OTk2LDI0OTgwLDI1MDA2LDI1MTM0LDI1NzA1LDI1NzExLDI1NzIxLDI1NzU4LDI1Nzc4LDI1NzM2LDI1NzQ0LDI1Nzc2LDI1NzY1LDI1NzQ3LDI1NzQ5LDI1NzY5LDI1NzQ2LDI1Nzc0LDI1NzczLDI1NzcxLDI1NzU0LDI1NzcyLDI1NzUzLDI1NzYyLDI1Nzc5LDI1OTczLDI1OTc1LDI1OTc2LDI2Mjg2LDI2MjgzLDI2MjkyLDI2Mjg5LDI3MTcxLDI3MTY3LDI3MTEyLDI3MTM3LDI3MTY2LDI3MTYxLDI3MTMzLDI3MTY5LDI3MTU1LDI3MTQ2LDI3MTIzLDI3MTM4LDI3MTQxLDI3MTE3LDI3MTUzLDI3NDcyLDI3NDcwLDI3NTU2LDI3NTg5LDI3NTkwLDI4NDc5LDI4NTQwLDI4NTQ4LDI4NDk3LDI4NTE4LDI4NTAwLDI4NTUwLDI4NTI1LDI4NTA3LDI4NTM2LDI4NTI2LDI4NTU4LDI4NTM4LDI4NTI4LDI4NTE2LDI4NTY3LDI4NTA0LDI4MzczLDI4NTI3LDI4NTEyLDI4NTExLDI5MDg3LDI5MTAwLDI5MTA1LDI5MDk2LDI5MjcwLDI5MzM5LDI5NTE4LDI5NTI3LDI5ODAxLDI5ODM1LDI5ODI3LDI5ODIyLDI5ODI0LDMwMDc5LDMwMjQwLDMwMjQ5LDMwMjM5LDMwMjQ0LDMwMjQ2LDMwMjQxLDMwMjQyLDMwMzYyLDMwMzk0LDMwNDM2LDMwNjA2LDMwNTk5LDMwNjA0LDMwNjA5LDMwNjAzLDMwOTIzLDMwOTE3LDMwOTA2LDMwOTIyLDMwOTEwLDMwOTMzLDMwOTA4LDMwOTI4LDMxMjk1LDMxMjkyLDMxMjk2LDMxMjkzLDMxMjg3LDMxMjkxLDMxNDA3LDMxNDA2LDMxNjYxLDMxNjY1LDMxNjg0LDMxNjY4LDMxNjg2LDMxNjg3LDMxNjgxLDMxNjQ4LDMxNjkyLDMxOTQ2LDMyMjI0LDMyMjQ0LDMyMjM5LDMyMjUxLDMyMjE2LDMyMjM2LDMyMjIxLDMyMjMyLDMyMjI3LDMyMjE4LDMyMjIyLDMyMjMzLDMyMTU4LDMyMjE3LDMyMjQyLDMyMjQ5LDMyNjI5LDMyNjMxLDMyNjg3LDMyNzQ1LDMyODA2LDMzMTc5LDMzMTgwLDMzMTgxLDMzMTg0LDMzMTc4LDMzMTc2LDM0MDcxLDM0MTA5LDM0MDc0LDM0MDMwLDM0MDkyLDM0MDkzLDM0MDY3LDM0MDY1LDM0MDgzLDM0MDgxLDM0MDY4LDM0MDI4LDM0MDg1LDM0MDQ3LDM0MDU0LDM0NjkwLDM0Njc2LDM0Njc4LDM0NjU2LDM0NjYyLDM0NjgwLDM0NjY0LDM0NjQ5LDM0NjQ3LDM0NjM2LDM0NjQzLDM0OTA3LDM0OTA5LDM1MDg4LDM1MDc5LDM1MDkwLDM1MDkxLDM1MDkzLDM1MDgyLDM1NTE2LDM1NTM4LDM1NTI3LDM1NTI0LDM1NDc3LDM1NTMxLDM1NTc2LDM1NTA2LDM1NTI5LDM1NTIyLDM1NTE5LDM1NTA0LDM1NTQyLDM1NTMzLDM1NTEwLDM1NTEzLDM1NTQ3LDM1OTE2LDM1OTE4LDM1OTQ4LDM2MDY0LDM2MDYyLDM2MDcwLDM2MDY4LDM2MDc2LDM2MDc3LDM2MDY2LDM2MDY3LDM2MDYwLDM2MDc0LDM2MDY1LDM2MjA1LDM2MjU1LDM2MjU5LDM2Mzk1LDM2MzY4LDM2MzgxLDM2Mzg2LDM2MzY3LDM2MzkzLDM2MzgzLDM2Mzg1LDM2MzgyLDM2NTM4LDM2NjM3LDM2NjM1LDM2NjM5LDM2NjQ5LDM2NjQ2LDM2NjUwLDM2NjM2LDM2NjM4LDM2NjQ1LDM2OTY5LDM2OTc0LDM2OTY4LDM2OTczLDM2OTgzLDM3MTY4LDM3MTY1LDM3MTU5LDM3MTY5LDM3MjU1LDM3MjU3LDM3MjU5LDM3MjUxLDM3NTczLDM3NTYzLDM3NTU5LDM3NjEwLDM3NTQ4LDM3NjA0LDM3NTY5LDM3NTU1LDM3NTY0LDM3NTg2LDM3NTc1LDM3NjE2LDM3NTU0LDM4MzE3LDM4MzIxLDM4NjYwLDM4NjYyLDM4NjYzLDM4NjY1LDM4NzUyLDM4Nzk3LDM4Nzk1LDM4Nzk5LDM4OTQ1LDM4OTU1LDM4OTQwLDM5MDkxLDM5MTc4LDM5MTg3LDM5MTg2LDM5MTkyLDM5Mzg5LDM5Mzc2LDM5MzkxLDM5Mzg3LDM5Mzc3LDM5MzgxLDM5Mzc4LDM5Mzg1LDM5NjA3LDM5NjYyLDM5NjYzLDM5NzE5LDM5NzQ5LDM5NzQ4LDM5Nzk5LDM5NzkxLDQwMTk4LDQwMjAxLDQwMTk1LDQwNjE3LDQwNjM4LDQwNjU0LDIyNjk2LDQwNzg2LDIwNzU0LDIwNzYwLDIwNzU2LDIwNzUyLDIwNzU3LDIwODY0LDIwOTA2LDIwOTU3LDIxMTM3LDIxMTM5LDIxMjM1LDIyMTA1LDIyMTIzLDIyMTM3LDIyMTIxLDIyMTE2LDIyMTM2LDIyMTIyLDIyMTIwLDIyMTE3LDIyMTI5LDIyMTI3LDIyMTI0LDIyMTE0LDIyMTM0LDIyNzIxLDIyNzE4LDIyNzI3LDIyNzI1LDIyODk0LDIzMzI1LDIzMzQ4LDIzNDE2LDIzNTM2LDIzNTY2LDI0Mzk0LDI1MDEwLDI0OTc3LDI1MDAxLDI0OTcwLDI1MDM3LDI1MDE0LDI1MDIyLDI1MDM0LDI1MDMyLDI1MTM2LDI1Nzk3LDI1NzkzLDI1ODAzLDI1Nzg3LDI1Nzg4LDI1ODE4LDI1Nzk2LDI1Nzk5LDI1Nzk0LDI1ODA1LDI1NzkxLDI1ODEwLDI1ODEyLDI1NzkwLDI1OTcyLDI2MzEwLDI2MzEzLDI2Mjk3LDI2MzA4LDI2MzExLDI2Mjk2LDI3MTk3LDI3MTkyLDI3MTk0LDI3MjI1LDI3MjQzLDI3MjI0LDI3MTkzLDI3MjA0LDI3MjM0LDI3MjMzLDI3MjExLDI3MjA3LDI3MTg5LDI3MjMxLDI3MjA4LDI3NDgxLDI3NTExLDI3NjUzLDI4NjEwLDI4NTkzLDI4NTc3LDI4NjExLDI4NTgwLDI4NjA5LDI4NTgzLDI4NTk1LDI4NjA4LDI4NjAxLDI4NTk4LDI4NTgyLDI4NTc2LDI4NTk2LDI5MTE4LDI5MTI5LDI5MTM2LDI5MTM4LDI5MTI4LDI5MTQxLDI5MTEzLDI5MTM0LDI5MTQ1LDI5MTQ4LDI5MTIzLDI5MTI0LDI5NTQ0LDI5ODUyLDI5ODU5LDI5ODQ4LDI5ODU1LDI5ODU0LDI5OTIyLDI5OTY0LDI5OTY1LDMwMjYwLDMwMjY0LDMwMjY2LDMwNDM5LDMwNDM3LDMwNjI0LDMwNjIyLDMwNjIzLDMwNjI5LDMwOTUyLDMwOTM4LDMwOTU2LDMwOTUxLDMxMTQyLDMxMzA5LDMxMzEwLDMxMzAyLDMxMzA4LDMxMzA3LDMxNDE4LDMxNzA1LDMxNzYxLDMxNjg5LDMxNzE2LDMxNzA3LDMxNzEzLDMxNzIxLDMxNzE4LDMxOTU3LDMxOTU4LDMyMjY2LDMyMjczLDMyMjY0LDMyMjgzLDMyMjkxLDMyMjg2LDMyMjg1LDMyMjY1LDMyMjcyLDMyNjMzLDMyNjkwLDMyNzUyLDMyNzUzLDMyNzUwLDMyODA4LDMzMjAzLDMzMTkzLDMzMTkyLDMzMjc1LDMzMjg4LDMzMzY4LDMzMzY5LDM0MTIyLDM0MTM3LDM0MTIwLDM0MTUyLDM0MTUzLDM0MTE1LDM0MTIxLDM0MTU3LDM0MTU0LDM0MTQyLDM0NjkxLDM0NzE5LDM0NzE4LDM0NzIyLDM0NzAxLDM0OTEzLDM1MTE0LDM1MTIyLDM1MTA5LDM1MTE1LDM1MTA1LDM1MjQyLDM1MjM4LDM1NTU4LDM1NTc4LDM1NTYzLDM1NTY5LDM1NTg0LDM1NTQ4LDM1NTU5LDM1NTY2LDM1NTgyLDM1NTg1LDM1NTg2LDM1NTc1LDM1NTY1LDM1NTcxLDM1NTc0LDM1NTgwLDM1OTQ3LDM1OTQ5LDM1OTg3LDM2MDg0LDM2NDIwLDM2NDAxLDM2NDA0LDM2NDE4LDM2NDA5LDM2NDA1LDM2NjY3LDM2NjU1LDM2NjY0LDM2NjU5LDM2Nzc2LDM2Nzc0LDM2OTgxLDM2OTgwLDM2OTg0LDM2OTc4LDM2OTg4LDM2OTg2LDM3MTcyLDM3MjY2LDM3NjY0LDM3Njg2LDM3NjI0LDM3NjgzLDM3Njc5LDM3NjY2LDM3NjI4LDM3Njc1LDM3NjM2LDM3NjU4LDM3NjQ4LDM3NjcwLDM3NjY1LDM3NjUzLDM3Njc4LDM3NjU3LDM4MzMxLDM4NTY3LDM4NTY4LDM4NTcwLDM4NjEzLDM4NjcwLDM4NjczLDM4Njc4LDM4NjY5LDM4Njc1LDM4NjcxLDM4NzQ3LDM4NzQ4LDM4NzU4LDM4ODA4LDM4OTYwLDM4OTY4LDM4OTcxLDM4OTY3LDM4OTU3LDM4OTY5LDM4OTQ4LDM5MTg0LDM5MjA4LDM5MTk4LDM5MTk1LDM5MjAxLDM5MTk0LDM5NDA1LDM5Mzk0LDM5NDA5LDM5NjA4LDM5NjEyLDM5Njc1LDM5NjYxLDM5NzIwLDM5ODI1LDQwMjEzLDQwMjI3LDQwMjMwLDQwMjMyLDQwMjEwLDQwMjE5LDQwNjY0LDQwNjYwLDQwODQ1LDQwODYwLDIwNzc4LDIwNzY3LDIwNzY5LDIwNzg2LDIxMjM3LDIyMTU4LDIyMTQ0LDIyMTYwLDIyMTQ5LDIyMTUxLDIyMTU5LDIyNzQxLDIyNzM5LDIyNzM3LDIyNzM0LDIzMzQ0LDIzMzM4LDIzMzMyLDIzNDE4LDIzNjA3LDIzNjU2LDIzOTk2LDIzOTk0LDIzOTk3LDIzOTkyLDI0MTcxLDI0Mzk2LDI0NTA5LDI1MDMzLDI1MDI2LDI1MDMxLDI1MDYyLDI1MDM1LDI1MTM4LDI1MTQwLDI1ODA2LDI1ODAyLDI1ODE2LDI1ODI0LDI1ODQwLDI1ODMwLDI1ODM2LDI1ODQxLDI1ODI2LDI1ODM3LDI1OTg2LDI1OTg3LDI2MzI5LDI2MzI2LDI3MjY0LDI3Mjg0LDI3MjY4LDI3Mjk4LDI3MjkyLDI3MzU1LDI3Mjk5LDI3MjYyLDI3Mjg3LDI3MjgwLDI3Mjk2LDI3NDg0LDI3NTY2LDI3NjEwLDI3NjU2LDI4NjMyLDI4NjU3LDI4NjM5LDI4NjQwLDI4NjM1LDI4NjQ0LDI4NjUxLDI4NjU1LDI4NTQ0LDI4NjUyLDI4NjQxLDI4NjQ5LDI4NjI5LDI4NjU0LDI4NjU2LDI5MTU5LDI5MTUxLDI5MTY2LDI5MTU4LDI5MTU3LDI5MTY1LDI5MTY0LDI5MTcyLDI5MTUyLDI5MjM3LDI5MjU0LDI5NTUyLDI5NTU0LDI5ODY1LDI5ODcyLDI5ODYyLDI5ODY0LDMwMjc4LDMwMjc0LDMwMjg0LDMwNDQyLDMwNjQzLDMwNjM0LDMwNjQwLDMwNjM2LDMwNjMxLDMwNjM3LDMwNzAzLDMwOTY3LDMwOTcwLDMwOTY0LDMwOTU5LDMwOTc3LDMxMTQzLDMxMTQ2LDMxMzE5LDMxNDIzLDMxNzUxLDMxNzU3LDMxNzQyLDMxNzM1LDMxNzU2LDMxNzEyLDMxOTY4LDMxOTY0LDMxOTY2LDMxOTcwLDMxOTY3LDMxOTYxLDMxOTY1LDMyMzAyLDMyMzE4LDMyMzI2LDMyMzExLDMyMzA2LDMyMzIzLDMyMjk5LDMyMzE3LDMyMzA1LDMyMzI1LDMyMzIxLDMyMzA4LDMyMzEzLDMyMzI4LDMyMzA5LDMyMzE5LDMyMzAzLDMyNTgwLDMyNzU1LDMyNzY0LDMyODgxLDMyODgyLDMyODgwLDMyODc5LDMyODgzLDMzMjIyLDMzMjE5LDMzMjEwLDMzMjE4LDMzMjE2LDMzMjE1LDMzMjEzLDMzMjI1LDMzMjE0LDMzMjU2LDMzMjg5LDMzMzkzLDM0MjE4LDM0MTgwLDM0MTc0LDM0MjA0LDM0MTkzLDM0MTk2LDM0MjIzLDM0MjAzLDM0MTgzLDM0MjE2LDM0MTg2LDM0NDA3LDM0NzUyLDM0NzY5LDM0NzM5LDM0NzcwLDM0NzU4LDM0NzMxLDM0NzQ3LDM0NzQ2LDM0NzYwLDM0NzYzLDM1MTMxLDM1MTI2LDM1MTQwLDM1MTI4LDM1MTMzLDM1MjQ0LDM1NTk4LDM1NjA3LDM1NjA5LDM1NjExLDM1NTk0LDM1NjE2LDM1NjEzLDM1NTg4LDM1NjAwLDM1OTA1LDM1OTAzLDM1OTU1LDM2MDkwLDM2MDkzLDM2MDkyLDM2MDg4LDM2MDkxLDM2MjY0LDM2NDI1LDM2NDI3LDM2NDI0LDM2NDI2LDM2Njc2LDM2NjcwLDM2Njc0LDM2Njc3LDM2NjcxLDM2OTkxLDM2OTg5LDM2OTk2LDM2OTkzLDM2OTk0LDM2OTkyLDM3MTc3LDM3MjgzLDM3Mjc4LDM3Mjc2LDM3NzA5LDM3NzYyLDM3NjcyLDM3NzQ5LDM3NzA2LDM3NzMzLDM3NzA3LDM3NjU2LDM3NzU4LDM3NzQwLDM3NzIzLDM3NzQ0LDM3NzIyLDM3NzE2LDM4MzQ2LDM4MzQ3LDM4MzQ4LDM4MzQ0LDM4MzQyLDM4NTc3LDM4NTg0LDM4NjE0LDM4Njg0LDM4Njg2LDM4ODE2LDM4ODY3LDM4OTgyLDM5MDk0LDM5MjIxLDM5NDI1LDM5NDIzLDM5ODU0LDM5ODUxLDM5ODUwLDM5ODUzLDQwMjUxLDQwMjU1LDQwNTg3LDQwNjU1LDQwNjcwLDQwNjY4LDQwNjY5LDQwNjY3LDQwNzY2LDQwNzc5LDIxNDc0LDIyMTY1LDIyMTkwLDIyNzQ1LDIyNzQ0LDIzMzUyLDI0NDEzLDI1MDU5LDI1MTM5LDI1ODQ0LDI1ODQyLDI1ODU0LDI1ODYyLDI1ODUwLDI1ODUxLDI1ODQ3LDI2MDM5LDI2MzMyLDI2NDA2LDI3MzE1LDI3MzA4LDI3MzMxLDI3MzIzLDI3MzIwLDI3MzMwLDI3MzEwLDI3MzExLDI3NDg3LDI3NTEyLDI3NTY3LDI4NjgxLDI4NjgzLDI4NjcwLDI4Njc4LDI4NjY2LDI4Njg5LDI4Njg3LDI5MTc5LDI5MTgwLDI5MTgyLDI5MTc2LDI5NTU5LDI5NTU3LDI5ODYzLDI5ODg3LDI5OTczLDMwMjk0LDMwMjk2LDMwMjkwLDMwNjUzLDMwNjU1LDMwNjUxLDMwNjUyLDMwOTkwLDMxMTUwLDMxMzI5LDMxMzMwLDMxMzI4LDMxNDI4LDMxNDI5LDMxNzg3LDMxNzgzLDMxNzg2LDMxNzc0LDMxNzc5LDMxNzc3LDMxOTc1LDMyMzQwLDMyMzQxLDMyMzUwLDMyMzQ2LDMyMzUzLDMyMzM4LDMyMzQ1LDMyNTg0LDMyNzYxLDMyNzYzLDMyODg3LDMyODg2LDMzMjI5LDMzMjMxLDMzMjkwLDM0MjU1LDM0MjE3LDM0MjUzLDM0MjU2LDM0MjQ5LDM0MjI0LDM0MjM0LDM0MjMzLDM0MjE0LDM0Nzk5LDM0Nzk2LDM0ODAyLDM0Nzg0LDM1MjA2LDM1MjUwLDM1MzE2LDM1NjI0LDM1NjQxLDM1NjI4LDM1NjI3LDM1OTIwLDM2MTAxLDM2NDQxLDM2NDUxLDM2NDU0LDM2NDUyLDM2NDQ3LDM2NDM3LDM2NTQ0LDM2NjgxLDM2Njg1LDM2OTk5LDM2OTk1LDM3MDAwLDM3MjkxLDM3MjkyLDM3MzI4LDM3NzgwLDM3NzcwLDM3NzgyLDM3Nzk0LDM3ODExLDM3ODA2LDM3ODA0LDM3ODA4LDM3Nzg0LDM3Nzg2LDM3NzgzLDM4MzU2LDM4MzU4LDM4MzUyLDM4MzU3LDM4NjI2LDM4NjIwLDM4NjE3LDM4NjE5LDM4NjIyLDM4NjkyLDM4ODE5LDM4ODIyLDM4ODI5LDM4OTA1LDM4OTg5LDM4OTkxLDM4OTg4LDM4OTkwLDM4OTk1LDM5MDk4LDM5MjMwLDM5MjMxLDM5MjI5LDM5MjE0LDM5MzMzLDM5NDM4LDM5NjE3LDM5NjgzLDM5Njg2LDM5NzU5LDM5NzU4LDM5NzU3LDM5ODgyLDM5ODgxLDM5OTMzLDM5ODgwLDM5ODcyLDQwMjczLDQwMjg1LDQwMjg4LDQwNjcyLDQwNzI1LDQwNzQ4LDIwNzg3LDIyMTgxLDIyNzUwLDIyNzUxLDIyNzU0LDIzNTQxLDQwODQ4LDI0MzAwLDI1MDc0LDI1MDc5LDI1MDc4LDI1MDc3LDI1ODU2LDI1ODcxLDI2MzM2LDI2MzMzLDI3MzY1LDI3MzU3LDI3MzU0LDI3MzQ3LDI4Njk5LDI4NzAzLDI4NzEyLDI4Njk4LDI4NzAxLDI4NjkzLDI4Njk2LDI5MTkwLDI5MTk3LDI5MjcyLDI5MzQ2LDI5NTYwLDI5NTYyLDI5ODg1LDI5ODk4LDI5OTIzLDMwMDg3LDMwMDg2LDMwMzAzLDMwMzA1LDMwNjYzLDMxMDAxLDMxMTUzLDMxMzM5LDMxMzM3LDMxODA2LDMxODA3LDMxODAwLDMxODA1LDMxNzk5LDMxODA4LDMyMzYzLDMyMzY1LDMyMzc3LDMyMzYxLDMyMzYyLDMyNjQ1LDMyMzcxLDMyNjk0LDMyNjk3LDMyNjk2LDMzMjQwLDM0MjgxLDM0MjY5LDM0MjgyLDM0MjYxLDM0Mjc2LDM0Mjc3LDM0Mjk1LDM0ODExLDM0ODIxLDM0ODI5LDM0ODA5LDM0ODE0LDM1MTY4LDM1MTY3LDM1MTU4LDM1MTY2LDM1NjQ5LDM1Njc2LDM1NjcyLDM1NjU3LDM1Njc0LDM1NjYyLDM1NjYzLDM1NjU0LDM1NjczLDM2MTA0LDM2MTA2LDM2NDc2LDM2NDY2LDM2NDg3LDM2NDcwLDM2NDYwLDM2NDc0LDM2NDY4LDM2NjkyLDM2Njg2LDM2NzgxLDM3MDAyLDM3MDAzLDM3Mjk3LDM3Mjk0LDM3ODU3LDM3ODQxLDM3ODU1LDM3ODI3LDM3ODMyLDM3ODUyLDM3ODUzLDM3ODQ2LDM3ODU4LDM3ODM3LDM3ODQ4LDM3ODYwLDM3ODQ3LDM3ODY0LDM4MzY0LDM4NTgwLDM4NjI3LDM4Njk4LDM4Njk1LDM4NzUzLDM4ODc2LDM4OTA3LDM5MDA2LDM5MDAwLDM5MDAzLDM5MTAwLDM5MjM3LDM5MjQxLDM5NDQ2LDM5NDQ5LDM5NjkzLDM5OTEyLDM5OTExLDM5ODk0LDM5ODk5LDQwMzI5LDQwMjg5LDQwMzA2LDQwMjk4LDQwMzAwLDQwNTk0LDQwNTk5LDQwNTk1LDQwNjI4LDIxMjQwLDIyMTg0LDIyMTk5LDIyMTk4LDIyMTk2LDIyMjA0LDIyNzU2LDIzMzYwLDIzMzYzLDIzNDIxLDIzNTQyLDI0MDA5LDI1MDgwLDI1MDgyLDI1ODgwLDI1ODc2LDI1ODgxLDI2MzQyLDI2NDA3LDI3MzcyLDI4NzM0LDI4NzIwLDI4NzIyLDI5MjAwLDI5NTYzLDI5OTAzLDMwMzA2LDMwMzA5LDMxMDE0LDMxMDE4LDMxMDIwLDMxMDE5LDMxNDMxLDMxNDc4LDMxODIwLDMxODExLDMxODIxLDMxOTgzLDMxOTg0LDM2NzgyLDMyMzgxLDMyMzgwLDMyMzg2LDMyNTg4LDMyNzY4LDMzMjQyLDMzMzgyLDM0Mjk5LDM0Mjk3LDM0MzIxLDM0Mjk4LDM0MzEwLDM0MzE1LDM0MzExLDM0MzE0LDM0ODM2LDM0ODM3LDM1MTcyLDM1MjU4LDM1MzIwLDM1Njk2LDM1NjkyLDM1Njg2LDM1Njk1LDM1Njc5LDM1NjkxLDM2MTExLDM2MTA5LDM2NDg5LDM2NDgxLDM2NDg1LDM2NDgyLDM3MzAwLDM3MzIzLDM3OTEyLDM3ODkxLDM3ODg1LDM4MzY5LDM4NzA0LDM5MTA4LDM5MjUwLDM5MjQ5LDM5MzM2LDM5NDY3LDM5NDcyLDM5NDc5LDM5NDc3LDM5OTU1LDM5OTQ5LDQwNTY5LDQwNjI5LDQwNjgwLDQwNzUxLDQwNzk5LDQwODAzLDQwODAxLDIwNzkxLDIwNzkyLDIyMjA5LDIyMjA4LDIyMjEwLDIyODA0LDIzNjYwLDI0MDEzLDI1MDg0LDI1MDg2LDI1ODg1LDI1ODg0LDI2MDA1LDI2MzQ1LDI3Mzg3LDI3Mzk2LDI3Mzg2LDI3NTcwLDI4NzQ4LDI5MjExLDI5MzUxLDI5OTEwLDI5OTA4LDMwMzEzLDMwNjc1LDMxODI0LDMyMzk5LDMyMzk2LDMyNzAwLDM0MzI3LDM0MzQ5LDM0MzMwLDM0ODUxLDM0ODUwLDM0ODQ5LDM0ODQ3LDM1MTc4LDM1MTgwLDM1MjYxLDM1NzAwLDM1NzAzLDM1NzA5LDM2MTE1LDM2NDkwLDM2NDkzLDM2NDkxLDM2NzAzLDM2NzgzLDM3MzA2LDM3OTM0LDM3OTM5LDM3OTQxLDM3OTQ2LDM3OTQ0LDM3OTM4LDM3OTMxLDM4MzcwLDM4NzEyLDM4NzEzLDM4NzA2LDM4OTExLDM5MDE1LDM5MDEzLDM5MjU1LDM5NDkzLDM5NDkxLDM5NDg4LDM5NDg2LDM5NjMxLDM5NzY0LDM5NzYxLDM5OTgxLDM5OTczLDQwMzY3LDQwMzcyLDQwMzg2LDQwMzc2LDQwNjA1LDQwNjg3LDQwNzI5LDQwNzk2LDQwODA2LDQwODA3LDIwNzk2LDIwNzk1LDIyMjE2LDIyMjE4LDIyMjE3LDIzNDIzLDI0MDIwLDI0MDE4LDI0Mzk4LDI1MDg3LDI1ODkyLDI3NDAyLDI3NDg5LDI4NzUzLDI4NzYwLDI5NTY4LDI5OTI0LDMwMDkwLDMwMzE4LDMwMzE2LDMxMTU1LDMxODQwLDMxODM5LDMyODk0LDMyODkzLDMzMjQ3LDM1MTg2LDM1MTgzLDM1MzI0LDM1NzEyLDM2MTE4LDM2MTE5LDM2NDk3LDM2NDk5LDM2NzA1LDM3MTkyLDM3OTU2LDM3OTY5LDM3OTcwLDM4NzE3LDM4NzE4LDM4ODUxLDM4ODQ5LDM5MDE5LDM5MjUzLDM5NTA5LDM5NTAxLDM5NjM0LDM5NzA2LDQwMDA5LDM5OTg1LDM5OTk4LDM5OTk1LDQwNDAzLDQwNDA3LDQwNzU2LDQwODEyLDQwODEwLDQwODUyLDIyMjIwLDI0MDIyLDI1MDg4LDI1ODkxLDI1ODk5LDI1ODk4LDI2MzQ4LDI3NDA4LDI5OTE0LDMxNDM0LDMxODQ0LDMxODQzLDMxODQ1LDMyNDAzLDMyNDA2LDMyNDA0LDMzMjUwLDM0MzYwLDM0MzY3LDM0ODY1LDM1NzIyLDM3MDA4LDM3MDA3LDM3OTg3LDM3OTg0LDM3OTg4LDM4NzYwLDM5MDIzLDM5MjYwLDM5NTE0LDM5NTE1LDM5NTExLDM5NjM1LDM5NjM2LDM5NjMzLDQwMDIwLDQwMDIzLDQwMDIyLDQwNDIxLDQwNjA3LDQwNjkyLDIyMjI1LDIyNzYxLDI1OTAwLDI4NzY2LDMwMzIxLDMwMzIyLDMwNjc5LDMyNTkyLDMyNjQ4LDM0ODcwLDM0ODczLDM0OTE0LDM1NzMxLDM1NzMwLDM1NzM0LDMzMzk5LDM2MTIzLDM3MzEyLDM3OTk0LDM4NzIyLDM4NzI4LDM4NzI0LDM4ODU0LDM5MDI0LDM5NTE5LDM5NzE0LDM5NzY4LDQwMDMxLDQwNDQxLDQwNDQyLDQwNTcyLDQwNTczLDQwNzExLDQwODIzLDQwODE4LDI0MzA3LDI3NDE0LDI4NzcxLDMxODUyLDMxODU0LDM0ODc1LDM1MjY0LDM2NTEzLDM3MzEzLDM4MDAyLDM4MDAwLDM5MDI1LDM5MjYyLDM5NjM4LDM5NzE1LDQwNjUyLDI4NzcyLDMwNjgyLDM1NzM4LDM4MDA3LDM4ODU3LDM5NTIyLDM5NTI1LDMyNDEyLDM1NzQwLDM2NTIyLDM3MzE3LDM4MDEzLDM4MDE0LDM4MDEyLDQwMDU1LDQwMDU2LDQwNjk1LDM1OTI0LDM4MDE1LDQwNDc0LDI5MjI0LDM5NTMwLDM5NzI5LDQwNDc1LDQwNDc4LDMxODU4LDkzMTIsOTMxMyw5MzE0LDkzMTUsOTMxNiw5MzE3LDkzMTgsOTMxOSw5MzIwLDkzMjEsOTMzMiw5MzMzLDkzMzQsOTMzNSw5MzM2LDkzMzcsOTMzOCw5MzM5LDkzNDAsOTM0MSw4NTYwLDg1NjEsODU2Miw4NTYzLDg1NjQsODU2NSw4NTY2LDg1NjcsODU2OCw4NTY5LDIwMDIyLDIwMDMxLDIwMTAxLDIwMTI4LDIwODY2LDIwODg2LDIwOTA3LDIxMjQxLDIxMzA0LDIxMzUzLDIxNDMwLDIyNzk0LDIzNDI0LDI0MDI3LDEyMDgzLDI0MTkxLDI0MzA4LDI0NDAwLDI0NDE3LDI1OTA4LDI2MDgwLDMwMDk4LDMwMzI2LDM2Nzg5LDM4NTgyLDE2OCw3MTAsMTI1NDEsMTI1NDIsMTI0NDUsMTI0NDYsMTIyOTEsMjAxODksMTIyOTMsMTIyOTQsMTIyOTUsMTI1NDAsNjUzMzksNjUzNDEsMTAwNDUsMTIzNTMsMTIzNTQsMTIzNTUsMTIzNTYsMTIzNTcsMTIzNTgsMTIzNTksMTIzNjAsMTIzNjEsMTIzNjIsMTIzNjMsMTIzNjQsMTIzNjUsMTIzNjYsMTIzNjcsMTIzNjgsMTIzNjksMTIzNzAsMTIzNzEsMTIzNzIsMTIzNzMsMTIzNzQsMTIzNzUsMTIzNzYsMTIzNzcsMTIzNzgsMTIzNzksMTIzODAsMTIzODEsMTIzODIsMTIzODMsMTIzODQsMTIzODUsMTIzODYsMTIzODcsMTIzODgsMTIzODksMTIzOTAsMTIzOTEsMTIzOTIsMTIzOTMsMTIzOTQsMTIzOTUsMTIzOTYsMTIzOTcsMTIzOTgsMTIzOTksMTI0MDAsMTI0MDEsMTI0MDIsMTI0MDMsMTI0MDQsMTI0MDUsMTI0MDYsMTI0MDcsMTI0MDgsMTI0MDksMTI0MTAsMTI0MTEsMTI0MTIsMTI0MTMsMTI0MTQsMTI0MTUsMTI0MTYsMTI0MTcsMTI0MTgsMTI0MTksMTI0MjAsMTI0MjEsMTI0MjIsMTI0MjMsMTI0MjQsMTI0MjUsMTI0MjYsMTI0MjcsMTI0MjgsMTI0MjksMTI0MzAsMTI0MzEsMTI0MzIsMTI0MzMsMTI0MzQsMTI0MzUsMTI0NDksMTI0NTAsMTI0NTEsMTI0NTIsMTI0NTMsMTI0NTQsMTI0NTUsMTI0NTYsMTI0NTcsMTI0NTgsMTI0NTksMTI0NjAsMTI0NjEsMTI0NjIsMTI0NjMsMTI0NjQsMTI0NjUsMTI0NjYsMTI0NjcsMTI0NjgsMTI0NjksMTI0NzAsMTI0NzEsMTI0NzIsMTI0NzMsMTI0NzQsMTI0NzUsMTI0NzYsMTI0NzcsMTI0NzgsMTI0NzksMTI0ODAsMTI0ODEsMTI0ODIsMTI0ODMsMTI0ODQsMTI0ODUsMTI0ODYsMTI0ODcsMTI0ODgsMTI0ODksMTI0OTAsMTI0OTEsMTI0OTIsMTI0OTMsMTI0OTQsMTI0OTUsMTI0OTYsMTI0OTcsMTI0OTgsMTI0OTksMTI1MDAsMTI1MDEsMTI1MDIsMTI1MDMsMTI1MDQsMTI1MDUsMTI1MDYsMTI1MDcsMTI1MDgsMTI1MDksMTI1MTAsMTI1MTEsMTI1MTIsMTI1MTMsMTI1MTQsMTI1MTUsMTI1MTYsMTI1MTcsMTI1MTgsMTI1MTksMTI1MjAsMTI1MjEsMTI1MjIsMTI1MjMsMTI1MjQsMTI1MjUsMTI1MjYsMTI1MjcsMTI1MjgsMTI1MjksMTI1MzAsMTI1MzEsMTI1MzIsMTI1MzMsMTI1MzQsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTAyNSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTEwNSwxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsODY3OSw4NjMyLDg2MzMsMTI3NTEsMTMxMjc2LDIwMDU4LDEzMTIxMCwyMDk5NCwxNzU1Myw0MDg4MCwyMDg3Miw0MDg4MSwxNjEyODcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTUwNiw2NTUwOCw2NTI4Nyw2NTI4MiwxMjg0OSw4NDcwLDg0ODEsMTI0NDMsMTI0NDQsMTE5MDQsMTE5MDgsMTE5MTAsMTE5MTEsMTE5MTIsMTE5MTQsMTE5MTYsMTE5MTcsMTE5MjUsMTE5MzIsMTE5MzMsMTE5NDEsMTE5NDMsMTE5NDYsMTE5NDgsMTE5NTAsMTE5NTgsMTE5NjQsMTE5NjYsMTE5NzQsMTE5NzgsMTE5ODAsMTE5ODEsMTE5ODMsMTE5OTAsMTE5OTEsMTE5OTgsMTIwMDMsbnVsbCxudWxsLG51bGwsNjQzLDU5Miw2MDMsNTk2LDYyOSwzMzksMjQ4LDMzMSw2NTAsNjE4LDIwMDM0LDIwMDYwLDIwOTgxLDIxMjc0LDIxMzc4LDE5OTc1LDE5OTgwLDIwMDM5LDIwMTA5LDIyMjMxLDY0MDEyLDIzNjYyLDI0NDM1LDE5OTgzLDIwODcxLDE5OTgyLDIwMDE0LDIwMTE1LDIwMTYyLDIwMTY5LDIwMTY4LDIwODg4LDIxMjQ0LDIxMzU2LDIxNDMzLDIyMzA0LDIyNzg3LDIyODI4LDIzNTY4LDI0MDYzLDI2MDgxLDI3NTcxLDI3NTk2LDI3NjY4LDI5MjQ3LDIwMDE3LDIwMDI4LDIwMjAwLDIwMTg4LDIwMjAxLDIwMTkzLDIwMTg5LDIwMTg2LDIxMDA0LDIxMjc2LDIxMzI0LDIyMzA2LDIyMzA3LDIyODA3LDIyODMxLDIzNDI1LDIzNDI4LDIzNTcwLDIzNjExLDIzNjY4LDIzNjY3LDI0MDY4LDI0MTkyLDI0MTk0LDI0NTIxLDI1MDk3LDI1MTY4LDI3NjY5LDI3NzAyLDI3NzE1LDI3NzExLDI3NzA3LDI5MzU4LDI5MzYwLDI5NTc4LDMxMTYwLDMyOTA2LDM4NDMwLDIwMjM4LDIwMjQ4LDIwMjY4LDIwMjEzLDIwMjQ0LDIwMjA5LDIwMjI0LDIwMjE1LDIwMjMyLDIwMjUzLDIwMjI2LDIwMjI5LDIwMjU4LDIwMjQzLDIwMjI4LDIwMjEyLDIwMjQyLDIwOTEzLDIxMDExLDIxMDAxLDIxMDA4LDIxMTU4LDIxMjgyLDIxMjc5LDIxMzI1LDIxMzg2LDIxNTExLDIyMjQxLDIyMjM5LDIyMzE4LDIyMzE0LDIyMzI0LDIyODQ0LDIyOTEyLDIyOTA4LDIyOTE3LDIyOTA3LDIyOTEwLDIyOTAzLDIyOTExLDIzMzgyLDIzNTczLDIzNTg5LDIzNjc2LDIzNjc0LDIzNjc1LDIzNjc4LDI0MDMxLDI0MTgxLDI0MTk2LDI0MzIyLDI0MzQ2LDI0NDM2LDI0NTMzLDI0NTMyLDI0NTI3LDI1MTgwLDI1MTgyLDI1MTg4LDI1MTg1LDI1MTkwLDI1MTg2LDI1MTc3LDI1MTg0LDI1MTc4LDI1MTg5LDI2MDk1LDI2MDk0LDI2NDMwLDI2NDI1LDI2NDI0LDI2NDI3LDI2NDI2LDI2NDMxLDI2NDI4LDI2NDE5LDI3NjcyLDI3NzE4LDI3NzMwLDI3NzQwLDI3NzI3LDI3NzIyLDI3NzMyLDI3NzIzLDI3NzI0LDI4Nzg1LDI5Mjc4LDI5MzY0LDI5MzY1LDI5NTgyLDI5OTk0LDMwMzM1LDMxMzQ5LDMyNTkzLDMzNDAwLDMzNDA0LDMzNDA4LDMzNDA1LDMzNDA3LDM0MzgxLDM1MTk4LDM3MDE3LDM3MDE1LDM3MDE2LDM3MDE5LDM3MDEyLDM4NDM0LDM4NDM2LDM4NDMyLDM4NDM1LDIwMzEwLDIwMjgzLDIwMzIyLDIwMjk3LDIwMzA3LDIwMzI0LDIwMjg2LDIwMzI3LDIwMzA2LDIwMzE5LDIwMjg5LDIwMzEyLDIwMjY5LDIwMjc1LDIwMjg3LDIwMzIxLDIwODc5LDIwOTIxLDIxMDIwLDIxMDIyLDIxMDI1LDIxMTY1LDIxMTY2LDIxMjU3LDIxMzQ3LDIxMzYyLDIxMzkwLDIxMzkxLDIxNTUyLDIxNTU5LDIxNTQ2LDIxNTg4LDIxNTczLDIxNTI5LDIxNTMyLDIxNTQxLDIxNTI4LDIxNTY1LDIxNTgzLDIxNTY5LDIxNTQ0LDIxNTQwLDIxNTc1LDIyMjU0LDIyMjQ3LDIyMjQ1LDIyMzM3LDIyMzQxLDIyMzQ4LDIyMzQ1LDIyMzQ3LDIyMzU0LDIyNzkwLDIyODQ4LDIyOTUwLDIyOTM2LDIyOTQ0LDIyOTM1LDIyOTI2LDIyOTQ2LDIyOTI4LDIyOTI3LDIyOTUxLDIyOTQ1LDIzNDM4LDIzNDQyLDIzNTkyLDIzNTk0LDIzNjkzLDIzNjk1LDIzNjg4LDIzNjkxLDIzNjg5LDIzNjk4LDIzNjkwLDIzNjg2LDIzNjk5LDIzNzAxLDI0MDMyLDI0MDc0LDI0MDc4LDI0MjAzLDI0MjAxLDI0MjA0LDI0MjAwLDI0MjA1LDI0MzI1LDI0MzQ5LDI0NDQwLDI0NDM4LDI0NTMwLDI0NTI5LDI0NTI4LDI0NTU3LDI0NTUyLDI0NTU4LDI0NTYzLDI0NTQ1LDI0NTQ4LDI0NTQ3LDI0NTcwLDI0NTU5LDI0NTY3LDI0NTcxLDI0NTc2LDI0NTY0LDI1MTQ2LDI1MjE5LDI1MjI4LDI1MjMwLDI1MjMxLDI1MjM2LDI1MjIzLDI1MjAxLDI1MjExLDI1MjEwLDI1MjAwLDI1MjE3LDI1MjI0LDI1MjA3LDI1MjEzLDI1MjAyLDI1MjA0LDI1OTExLDI2MDk2LDI2MTAwLDI2MDk5LDI2MDk4LDI2MTAxLDI2NDM3LDI2NDM5LDI2NDU3LDI2NDUzLDI2NDQ0LDI2NDQwLDI2NDYxLDI2NDQ1LDI2NDU4LDI2NDQzLDI3NjAwLDI3NjczLDI3Njc0LDI3NzY4LDI3NzUxLDI3NzU1LDI3NzgwLDI3Nzg3LDI3NzkxLDI3NzYxLDI3NzU5LDI3NzUzLDI3ODAyLDI3NzU3LDI3NzgzLDI3Nzk3LDI3ODA0LDI3NzUwLDI3NzYzLDI3NzQ5LDI3NzcxLDI3NzkwLDI4Nzg4LDI4Nzk0LDI5MjgzLDI5Mzc1LDI5MzczLDI5Mzc5LDI5MzgyLDI5Mzc3LDI5MzcwLDI5MzgxLDI5NTg5LDI5NTkxLDI5NTg3LDI5NTg4LDI5NTg2LDMwMDEwLDMwMDA5LDMwMTAwLDMwMTAxLDMwMzM3LDMxMDM3LDMyODIwLDMyOTE3LDMyOTIxLDMyOTEyLDMyOTE0LDMyOTI0LDMzNDI0LDMzNDIzLDMzNDEzLDMzNDIyLDMzNDI1LDMzNDI3LDMzNDE4LDMzNDExLDMzNDEyLDM1OTYwLDM2ODA5LDM2Nzk5LDM3MDIzLDM3MDI1LDM3MDI5LDM3MDIyLDM3MDMxLDM3MDI0LDM4NDQ4LDM4NDQwLDM4NDQ3LDM4NDQ1LDIwMDE5LDIwMzc2LDIwMzQ4LDIwMzU3LDIwMzQ5LDIwMzUyLDIwMzU5LDIwMzQyLDIwMzQwLDIwMzYxLDIwMzU2LDIwMzQzLDIwMzAwLDIwMzc1LDIwMzMwLDIwMzc4LDIwMzQ1LDIwMzUzLDIwMzQ0LDIwMzY4LDIwMzgwLDIwMzcyLDIwMzgyLDIwMzcwLDIwMzU0LDIwMzczLDIwMzMxLDIwMzM0LDIwODk0LDIwOTI0LDIwOTI2LDIxMDQ1LDIxMDQyLDIxMDQzLDIxMDYyLDIxMDQxLDIxMTgwLDIxMjU4LDIxMjU5LDIxMzA4LDIxMzk0LDIxMzk2LDIxNjM5LDIxNjMxLDIxNjMzLDIxNjQ5LDIxNjM0LDIxNjQwLDIxNjExLDIxNjI2LDIxNjMwLDIxNjA1LDIxNjEyLDIxNjIwLDIxNjA2LDIxNjQ1LDIxNjE1LDIxNjAxLDIxNjAwLDIxNjU2LDIxNjAzLDIxNjA3LDIxNjA0LDIyMjYzLDIyMjY1LDIyMzgzLDIyMzg2LDIyMzgxLDIyMzc5LDIyMzg1LDIyMzg0LDIyMzkwLDIyNDAwLDIyMzg5LDIyMzk1LDIyMzg3LDIyMzg4LDIyMzcwLDIyMzc2LDIyMzk3LDIyNzk2LDIyODUzLDIyOTY1LDIyOTcwLDIyOTkxLDIyOTkwLDIyOTYyLDIyOTg4LDIyOTc3LDIyOTY2LDIyOTcyLDIyOTc5LDIyOTk4LDIyOTYxLDIyOTczLDIyOTc2LDIyOTg0LDIyOTY0LDIyOTgzLDIzMzk0LDIzMzk3LDIzNDQzLDIzNDQ1LDIzNjIwLDIzNjIzLDIzNzI2LDIzNzE2LDIzNzEyLDIzNzMzLDIzNzI3LDIzNzIwLDIzNzI0LDIzNzExLDIzNzE1LDIzNzI1LDIzNzE0LDIzNzIyLDIzNzE5LDIzNzA5LDIzNzE3LDIzNzM0LDIzNzI4LDIzNzE4LDI0MDg3LDI0MDg0LDI0MDg5LDI0MzYwLDI0MzU0LDI0MzU1LDI0MzU2LDI0NDA0LDI0NDUwLDI0NDQ2LDI0NDQ1LDI0NTQyLDI0NTQ5LDI0NjIxLDI0NjE0LDI0NjAxLDI0NjI2LDI0NTg3LDI0NjI4LDI0NTg2LDI0NTk5LDI0NjI3LDI0NjAyLDI0NjA2LDI0NjIwLDI0NjEwLDI0NTg5LDI0NTkyLDI0NjIyLDI0NTk1LDI0NTkzLDI0NTg4LDI0NTg1LDI0NjA0LDI1MTA4LDI1MTQ5LDI1MjYxLDI1MjY4LDI1Mjk3LDI1Mjc4LDI1MjU4LDI1MjcwLDI1MjkwLDI1MjYyLDI1MjY3LDI1MjYzLDI1Mjc1LDI1MjU3LDI1MjY0LDI1MjcyLDI1OTE3LDI2MDI0LDI2MDQzLDI2MTIxLDI2MTA4LDI2MTE2LDI2MTMwLDI2MTIwLDI2MTA3LDI2MTE1LDI2MTIzLDI2MTI1LDI2MTE3LDI2MTA5LDI2MTI5LDI2MTI4LDI2MzU4LDI2Mzc4LDI2NTAxLDI2NDc2LDI2NTEwLDI2NTE0LDI2NDg2LDI2NDkxLDI2NTIwLDI2NTAyLDI2NTAwLDI2NDg0LDI2NTA5LDI2NTA4LDI2NDkwLDI2NTI3LDI2NTEzLDI2NTIxLDI2NDk5LDI2NDkzLDI2NDk3LDI2NDg4LDI2NDg5LDI2NTE2LDI3NDI5LDI3NTIwLDI3NTE4LDI3NjE0LDI3Njc3LDI3Nzk1LDI3ODg0LDI3ODgzLDI3ODg2LDI3ODY1LDI3ODMwLDI3ODYwLDI3ODIxLDI3ODc5LDI3ODMxLDI3ODU2LDI3ODQyLDI3ODM0LDI3ODQzLDI3ODQ2LDI3ODg1LDI3ODkwLDI3ODU4LDI3ODY5LDI3ODI4LDI3Nzg2LDI3ODA1LDI3Nzc2LDI3ODcwLDI3ODQwLDI3OTUyLDI3ODUzLDI3ODQ3LDI3ODI0LDI3ODk3LDI3ODU1LDI3ODgxLDI3ODU3LDI4ODIwLDI4ODI0LDI4ODA1LDI4ODE5LDI4ODA2LDI4ODA0LDI4ODE3LDI4ODIyLDI4ODAyLDI4ODI2LDI4ODAzLDI5MjkwLDI5Mzk4LDI5Mzg3LDI5NDAwLDI5Mzg1LDI5NDA0LDI5Mzk0LDI5Mzk2LDI5NDAyLDI5Mzg4LDI5MzkzLDI5NjA0LDI5NjAxLDI5NjEzLDI5NjA2LDI5NjAyLDI5NjAwLDI5NjEyLDI5NTk3LDI5OTE3LDI5OTI4LDMwMDE1LDMwMDE2LDMwMDE0LDMwMDkyLDMwMTA0LDMwMzgzLDMwNDUxLDMwNDQ5LDMwNDQ4LDMwNDUzLDMwNzEyLDMwNzE2LDMwNzEzLDMwNzE1LDMwNzE0LDMwNzExLDMxMDQyLDMxMDM5LDMxMTczLDMxMzUyLDMxMzU1LDMxNDgzLDMxODYxLDMxOTk3LDMyODIxLDMyOTExLDMyOTQyLDMyOTMxLDMyOTUyLDMyOTQ5LDMyOTQxLDMzMzEyLDMzNDQwLDMzNDcyLDMzNDUxLDMzNDM0LDMzNDMyLDMzNDM1LDMzNDYxLDMzNDQ3LDMzNDU0LDMzNDY4LDMzNDM4LDMzNDY2LDMzNDYwLDMzNDQ4LDMzNDQxLDMzNDQ5LDMzNDc0LDMzNDQ0LDMzNDc1LDMzNDYyLDMzNDQyLDM0NDE2LDM0NDE1LDM0NDEzLDM0NDE0LDM1OTI2LDM2ODE4LDM2ODExLDM2ODE5LDM2ODEzLDM2ODIyLDM2ODIxLDM2ODIzLDM3MDQyLDM3MDQ0LDM3MDM5LDM3MDQzLDM3MDQwLDM4NDU3LDM4NDYxLDM4NDYwLDM4NDU4LDM4NDY3LDIwNDI5LDIwNDIxLDIwNDM1LDIwNDAyLDIwNDI1LDIwNDI3LDIwNDE3LDIwNDM2LDIwNDQ0LDIwNDQxLDIwNDExLDIwNDAzLDIwNDQzLDIwNDIzLDIwNDM4LDIwNDEwLDIwNDE2LDIwNDA5LDIwNDYwLDIxMDYwLDIxMDY1LDIxMTg0LDIxMTg2LDIxMzA5LDIxMzcyLDIxMzk5LDIxMzk4LDIxNDAxLDIxNDAwLDIxNjkwLDIxNjY1LDIxNjc3LDIxNjY5LDIxNzExLDIxNjk5LDMzNTQ5LDIxNjg3LDIxNjc4LDIxNzE4LDIxNjg2LDIxNzAxLDIxNzAyLDIxNjY0LDIxNjE2LDIxNjkyLDIxNjY2LDIxNjk0LDIxNjE4LDIxNzI2LDIxNjgwLDIyNDUzLDIyNDMwLDIyNDMxLDIyNDM2LDIyNDEyLDIyNDIzLDIyNDI5LDIyNDI3LDIyNDIwLDIyNDI0LDIyNDE1LDIyNDI1LDIyNDM3LDIyNDI2LDIyNDIxLDIyNzcyLDIyNzk3LDIyODY3LDIzMDA5LDIzMDA2LDIzMDIyLDIzMDQwLDIzMDI1LDIzMDA1LDIzMDM0LDIzMDM3LDIzMDM2LDIzMDMwLDIzMDEyLDIzMDI2LDIzMDMxLDIzMDAzLDIzMDE3LDIzMDI3LDIzMDI5LDIzMDA4LDIzMDM4LDIzMDI4LDIzMDIxLDIzNDY0LDIzNjI4LDIzNzYwLDIzNzY4LDIzNzU2LDIzNzY3LDIzNzU1LDIzNzcxLDIzNzc0LDIzNzcwLDIzNzUzLDIzNzUxLDIzNzU0LDIzNzY2LDIzNzYzLDIzNzY0LDIzNzU5LDIzNzUyLDIzNzUwLDIzNzU4LDIzNzc1LDIzODAwLDI0MDU3LDI0MDk3LDI0MDk4LDI0MDk5LDI0MDk2LDI0MTAwLDI0MjQwLDI0MjI4LDI0MjI2LDI0MjE5LDI0MjI3LDI0MjI5LDI0MzI3LDI0MzY2LDI0NDA2LDI0NDU0LDI0NjMxLDI0NjMzLDI0NjYwLDI0NjkwLDI0NjcwLDI0NjQ1LDI0NjU5LDI0NjQ3LDI0NjQ5LDI0NjY3LDI0NjUyLDI0NjQwLDI0NjQyLDI0NjcxLDI0NjEyLDI0NjQ0LDI0NjY0LDI0Njc4LDI0Njg2LDI1MTU0LDI1MTU1LDI1Mjk1LDI1MzU3LDI1MzU1LDI1MzMzLDI1MzU4LDI1MzQ3LDI1MzIzLDI1MzM3LDI1MzU5LDI1MzU2LDI1MzM2LDI1MzM0LDI1MzQ0LDI1MzYzLDI1MzY0LDI1MzM4LDI1MzY1LDI1MzM5LDI1MzI4LDI1OTIxLDI1OTIzLDI2MDI2LDI2MDQ3LDI2MTY2LDI2MTQ1LDI2MTYyLDI2MTY1LDI2MTQwLDI2MTUwLDI2MTQ2LDI2MTYzLDI2MTU1LDI2MTcwLDI2MTQxLDI2MTY0LDI2MTY5LDI2MTU4LDI2MzgzLDI2Mzg0LDI2NTYxLDI2NjEwLDI2NTY4LDI2NTU0LDI2NTg4LDI2NTU1LDI2NjE2LDI2NTg0LDI2NTYwLDI2NTUxLDI2NTY1LDI2NjAzLDI2NTk2LDI2NTkxLDI2NTQ5LDI2NTczLDI2NTQ3LDI2NjE1LDI2NjE0LDI2NjA2LDI2NTk1LDI2NTYyLDI2NTUzLDI2NTc0LDI2NTk5LDI2NjA4LDI2NTQ2LDI2NjIwLDI2NTY2LDI2NjA1LDI2NTcyLDI2NTQyLDI2NTk4LDI2NTg3LDI2NjE4LDI2NTY5LDI2NTcwLDI2NTYzLDI2NjAyLDI2NTcxLDI3NDMyLDI3NTIyLDI3NTI0LDI3NTc0LDI3NjA2LDI3NjA4LDI3NjE2LDI3NjgwLDI3NjgxLDI3OTQ0LDI3OTU2LDI3OTQ5LDI3OTM1LDI3OTY0LDI3OTY3LDI3OTIyLDI3OTE0LDI3ODY2LDI3OTU1LDI3OTA4LDI3OTI5LDI3OTYyLDI3OTMwLDI3OTIxLDI3OTA0LDI3OTMzLDI3OTcwLDI3OTA1LDI3OTI4LDI3OTU5LDI3OTA3LDI3OTE5LDI3OTY4LDI3OTExLDI3OTM2LDI3OTQ4LDI3OTEyLDI3OTM4LDI3OTEzLDI3OTIwLDI4ODU1LDI4ODMxLDI4ODYyLDI4ODQ5LDI4ODQ4LDI4ODMzLDI4ODUyLDI4ODUzLDI4ODQxLDI5MjQ5LDI5MjU3LDI5MjU4LDI5MjkyLDI5Mjk2LDI5Mjk5LDI5Mjk0LDI5Mzg2LDI5NDEyLDI5NDE2LDI5NDE5LDI5NDA3LDI5NDE4LDI5NDE0LDI5NDExLDI5NTczLDI5NjQ0LDI5NjM0LDI5NjQwLDI5NjM3LDI5NjI1LDI5NjIyLDI5NjIxLDI5NjIwLDI5Njc1LDI5NjMxLDI5NjM5LDI5NjMwLDI5NjM1LDI5NjM4LDI5NjI0LDI5NjQzLDI5OTMyLDI5OTM0LDI5OTk4LDMwMDIzLDMwMDI0LDMwMTE5LDMwMTIyLDMwMzI5LDMwNDA0LDMwNDcyLDMwNDY3LDMwNDY4LDMwNDY5LDMwNDc0LDMwNDU1LDMwNDU5LDMwNDU4LDMwNjk1LDMwNjk2LDMwNzI2LDMwNzM3LDMwNzM4LDMwNzI1LDMwNzM2LDMwNzM1LDMwNzM0LDMwNzI5LDMwNzIzLDMwNzM5LDMxMDUwLDMxMDUyLDMxMDUxLDMxMDQ1LDMxMDQ0LDMxMTg5LDMxMTgxLDMxMTgzLDMxMTkwLDMxMTgyLDMxMzYwLDMxMzU4LDMxNDQxLDMxNDg4LDMxNDg5LDMxODY2LDMxODY0LDMxODY1LDMxODcxLDMxODcyLDMxODczLDMyMDAzLDMyMDA4LDMyMDAxLDMyNjAwLDMyNjU3LDMyNjUzLDMyNzAyLDMyNzc1LDMyNzgyLDMyNzgzLDMyNzg4LDMyODIzLDMyOTg0LDMyOTY3LDMyOTkyLDMyOTc3LDMyOTY4LDMyOTYyLDMyOTc2LDMyOTY1LDMyOTk1LDMyOTg1LDMyOTg4LDMyOTcwLDMyOTgxLDMyOTY5LDMyOTc1LDMyOTgzLDMyOTk4LDMyOTczLDMzMjc5LDMzMzEzLDMzNDI4LDMzNDk3LDMzNTM0LDMzNTI5LDMzNTQzLDMzNTEyLDMzNTM2LDMzNDkzLDMzNTk0LDMzNTE1LDMzNDk0LDMzNTI0LDMzNTE2LDMzNTA1LDMzNTIyLDMzNTI1LDMzNTQ4LDMzNTMxLDMzNTI2LDMzNTIwLDMzNTE0LDMzNTA4LDMzNTA0LDMzNTMwLDMzNTIzLDMzNTE3LDM0NDIzLDM0NDIwLDM0NDI4LDM0NDE5LDM0ODgxLDM0ODk0LDM0OTE5LDM0OTIyLDM0OTIxLDM1MjgzLDM1MzMyLDM1MzM1LDM2MjEwLDM2ODM1LDM2ODMzLDM2ODQ2LDM2ODMyLDM3MTA1LDM3MDUzLDM3MDU1LDM3MDc3LDM3MDYxLDM3MDU0LDM3MDYzLDM3MDY3LDM3MDY0LDM3MzMyLDM3MzMxLDM4NDg0LDM4NDc5LDM4NDgxLDM4NDgzLDM4NDc0LDM4NDc4LDIwNTEwLDIwNDg1LDIwNDg3LDIwNDk5LDIwNTE0LDIwNTI4LDIwNTA3LDIwNDY5LDIwNDY4LDIwNTMxLDIwNTM1LDIwNTI0LDIwNDcwLDIwNDcxLDIwNTAzLDIwNTA4LDIwNTEyLDIwNTE5LDIwNTMzLDIwNTI3LDIwNTI5LDIwNDk0LDIwODI2LDIwODg0LDIwODgzLDIwOTM4LDIwOTMyLDIwOTMzLDIwOTM2LDIwOTQyLDIxMDg5LDIxMDgyLDIxMDc0LDIxMDg2LDIxMDg3LDIxMDc3LDIxMDkwLDIxMTk3LDIxMjYyLDIxNDA2LDIxNzk4LDIxNzMwLDIxNzgzLDIxNzc4LDIxNzM1LDIxNzQ3LDIxNzMyLDIxNzg2LDIxNzU5LDIxNzY0LDIxNzY4LDIxNzM5LDIxNzc3LDIxNzY1LDIxNzQ1LDIxNzcwLDIxNzU1LDIxNzUxLDIxNzUyLDIxNzI4LDIxNzc0LDIxNzYzLDIxNzcxLDIyMjczLDIyMjc0LDIyNDc2LDIyNTc4LDIyNDg1LDIyNDgyLDIyNDU4LDIyNDcwLDIyNDYxLDIyNDYwLDIyNDU2LDIyNDU0LDIyNDYzLDIyNDcxLDIyNDgwLDIyNDU3LDIyNDY1LDIyNzk4LDIyODU4LDIzMDY1LDIzMDYyLDIzMDg1LDIzMDg2LDIzMDYxLDIzMDU1LDIzMDYzLDIzMDUwLDIzMDcwLDIzMDkxLDIzNDA0LDIzNDYzLDIzNDY5LDIzNDY4LDIzNTU1LDIzNjM4LDIzNjM2LDIzNzg4LDIzODA3LDIzNzkwLDIzNzkzLDIzNzk5LDIzODA4LDIzODAxLDI0MTA1LDI0MTA0LDI0MjMyLDI0MjM4LDI0MjM0LDI0MjM2LDI0MzcxLDI0MzY4LDI0NDIzLDI0NjY5LDI0NjY2LDI0Njc5LDI0NjQxLDI0NzM4LDI0NzEyLDI0NzA0LDI0NzIyLDI0NzA1LDI0NzMzLDI0NzA3LDI0NzI1LDI0NzMxLDI0NzI3LDI0NzExLDI0NzMyLDI0NzE4LDI1MTEzLDI1MTU4LDI1MzMwLDI1MzYwLDI1NDMwLDI1Mzg4LDI1NDEyLDI1NDEzLDI1Mzk4LDI1NDExLDI1NTcyLDI1NDAxLDI1NDE5LDI1NDE4LDI1NDA0LDI1Mzg1LDI1NDA5LDI1Mzk2LDI1NDMyLDI1NDI4LDI1NDMzLDI1Mzg5LDI1NDE1LDI1Mzk1LDI1NDM0LDI1NDI1LDI1NDAwLDI1NDMxLDI1NDA4LDI1NDE2LDI1OTMwLDI1OTI2LDI2MDU0LDI2MDUxLDI2MDUyLDI2MDUwLDI2MTg2LDI2MjA3LDI2MTgzLDI2MTkzLDI2Mzg2LDI2Mzg3LDI2NjU1LDI2NjUwLDI2Njk3LDI2Njc0LDI2Njc1LDI2NjgzLDI2Njk5LDI2NzAzLDI2NjQ2LDI2NjczLDI2NjUyLDI2Njc3LDI2NjY3LDI2NjY5LDI2NjcxLDI2NzAyLDI2NjkyLDI2Njc2LDI2NjUzLDI2NjQyLDI2NjQ0LDI2NjYyLDI2NjY0LDI2NjcwLDI2NzAxLDI2NjgyLDI2NjYxLDI2NjU2LDI3NDM2LDI3NDM5LDI3NDM3LDI3NDQxLDI3NDQ0LDI3NTAxLDMyODk4LDI3NTI4LDI3NjIyLDI3NjIwLDI3NjI0LDI3NjE5LDI3NjE4LDI3NjIzLDI3Njg1LDI4MDI2LDI4MDAzLDI4MDA0LDI4MDIyLDI3OTE3LDI4MDAxLDI4MDUwLDI3OTkyLDI4MDAyLDI4MDEzLDI4MDE1LDI4MDQ5LDI4MDQ1LDI4MTQzLDI4MDMxLDI4MDM4LDI3OTk4LDI4MDA3LDI4MDAwLDI4MDU1LDI4MDE2LDI4MDI4LDI3OTk5LDI4MDM0LDI4MDU2LDI3OTUxLDI4MDA4LDI4MDQzLDI4MDMwLDI4MDMyLDI4MDM2LDI3OTI2LDI4MDM1LDI4MDI3LDI4MDI5LDI4MDIxLDI4MDQ4LDI4ODkyLDI4ODgzLDI4ODgxLDI4ODkzLDI4ODc1LDMyNTY5LDI4ODk4LDI4ODg3LDI4ODgyLDI4ODk0LDI4ODk2LDI4ODg0LDI4ODc3LDI4ODY5LDI4ODcwLDI4ODcxLDI4ODkwLDI4ODc4LDI4ODk3LDI5MjUwLDI5MzA0LDI5MzAzLDI5MzAyLDI5NDQwLDI5NDM0LDI5NDI4LDI5NDM4LDI5NDMwLDI5NDI3LDI5NDM1LDI5NDQxLDI5NjUxLDI5NjU3LDI5NjY5LDI5NjU0LDI5NjI4LDI5NjcxLDI5NjY3LDI5NjczLDI5NjYwLDI5NjUwLDI5NjU5LDI5NjUyLDI5NjYxLDI5NjU4LDI5NjU1LDI5NjU2LDI5NjcyLDI5OTE4LDI5OTE5LDI5OTQwLDI5OTQxLDI5OTg1LDMwMDQzLDMwMDQ3LDMwMTI4LDMwMTQ1LDMwMTM5LDMwMTQ4LDMwMTQ0LDMwMTQzLDMwMTM0LDMwMTM4LDMwMzQ2LDMwNDA5LDMwNDkzLDMwNDkxLDMwNDgwLDMwNDgzLDMwNDgyLDMwNDk5LDMwNDgxLDMwNDg1LDMwNDg5LDMwNDkwLDMwNDk4LDMwNTAzLDMwNzU1LDMwNzY0LDMwNzU0LDMwNzczLDMwNzY3LDMwNzYwLDMwNzY2LDMwNzYzLDMwNzUzLDMwNzYxLDMwNzcxLDMwNzYyLDMwNzY5LDMxMDYwLDMxMDY3LDMxMDU1LDMxMDY4LDMxMDU5LDMxMDU4LDMxMDU3LDMxMjExLDMxMjEyLDMxMjAwLDMxMjE0LDMxMjEzLDMxMjEwLDMxMTk2LDMxMTk4LDMxMTk3LDMxMzY2LDMxMzY5LDMxMzY1LDMxMzcxLDMxMzcyLDMxMzcwLDMxMzY3LDMxNDQ4LDMxNTA0LDMxNDkyLDMxNTA3LDMxNDkzLDMxNTAzLDMxNDk2LDMxNDk4LDMxNTAyLDMxNDk3LDMxNTA2LDMxODc2LDMxODg5LDMxODgyLDMxODg0LDMxODgwLDMxODg1LDMxODc3LDMyMDMwLDMyMDI5LDMyMDE3LDMyMDE0LDMyMDI0LDMyMDIyLDMyMDE5LDMyMDMxLDMyMDE4LDMyMDE1LDMyMDEyLDMyNjA0LDMyNjA5LDMyNjA2LDMyNjA4LDMyNjA1LDMyNjAzLDMyNjYyLDMyNjU4LDMyNzA3LDMyNzA2LDMyNzA0LDMyNzkwLDMyODMwLDMyODI1LDMzMDE4LDMzMDEwLDMzMDE3LDMzMDEzLDMzMDI1LDMzMDE5LDMzMDI0LDMzMjgxLDMzMzI3LDMzMzE3LDMzNTg3LDMzNTgxLDMzNjA0LDMzNTYxLDMzNjE3LDMzNTczLDMzNjIyLDMzNTk5LDMzNjAxLDMzNTc0LDMzNTY0LDMzNTcwLDMzNjAyLDMzNjE0LDMzNTYzLDMzNTc4LDMzNTQ0LDMzNTk2LDMzNjEzLDMzNTU4LDMzNTcyLDMzNTY4LDMzNTkxLDMzNTgzLDMzNTc3LDMzNjA3LDMzNjA1LDMzNjEyLDMzNjE5LDMzNTY2LDMzNTgwLDMzNjExLDMzNTc1LDMzNjA4LDM0Mzg3LDM0Mzg2LDM0NDY2LDM0NDcyLDM0NDU0LDM0NDQ1LDM0NDQ5LDM0NDYyLDM0NDM5LDM0NDU1LDM0NDM4LDM0NDQzLDM0NDU4LDM0NDM3LDM0NDY5LDM0NDU3LDM0NDY1LDM0NDcxLDM0NDUzLDM0NDU2LDM0NDQ2LDM0NDYxLDM0NDQ4LDM0NDUyLDM0ODgzLDM0ODg0LDM0OTI1LDM0OTMzLDM0OTM0LDM0OTMwLDM0OTQ0LDM0OTI5LDM0OTQzLDM0OTI3LDM0OTQ3LDM0OTQyLDM0OTMyLDM0OTQwLDM1MzQ2LDM1OTExLDM1OTI3LDM1OTYzLDM2MDA0LDM2MDAzLDM2MjE0LDM2MjE2LDM2Mjc3LDM2Mjc5LDM2Mjc4LDM2NTYxLDM2NTYzLDM2ODYyLDM2ODUzLDM2ODY2LDM2ODYzLDM2ODU5LDM2ODY4LDM2ODYwLDM2ODU0LDM3MDc4LDM3MDg4LDM3MDgxLDM3MDgyLDM3MDkxLDM3MDg3LDM3MDkzLDM3MDgwLDM3MDgzLDM3MDc5LDM3MDg0LDM3MDkyLDM3MjAwLDM3MTk4LDM3MTk5LDM3MzMzLDM3MzQ2LDM3MzM4LDM4NDkyLDM4NDk1LDM4NTg4LDM5MTM5LDM5NjQ3LDM5NzI3LDIwMDk1LDIwNTkyLDIwNTg2LDIwNTc3LDIwNTc0LDIwNTc2LDIwNTYzLDIwNTU1LDIwNTczLDIwNTk0LDIwNTUyLDIwNTU3LDIwNTQ1LDIwNTcxLDIwNTU0LDIwNTc4LDIwNTAxLDIwNTQ5LDIwNTc1LDIwNTg1LDIwNTg3LDIwNTc5LDIwNTgwLDIwNTUwLDIwNTQ0LDIwNTkwLDIwNTk1LDIwNTY3LDIwNTYxLDIwOTQ0LDIxMDk5LDIxMTAxLDIxMTAwLDIxMTAyLDIxMjA2LDIxMjAzLDIxMjkzLDIxNDA0LDIxODc3LDIxODc4LDIxODIwLDIxODM3LDIxODQwLDIxODEyLDIxODAyLDIxODQxLDIxODU4LDIxODE0LDIxODEzLDIxODA4LDIxODQyLDIxODI5LDIxNzcyLDIxODEwLDIxODYxLDIxODM4LDIxODE3LDIxODMyLDIxODA1LDIxODE5LDIxODI0LDIxODM1LDIyMjgyLDIyMjc5LDIyNTIzLDIyNTQ4LDIyNDk4LDIyNTE4LDIyNDkyLDIyNTE2LDIyNTI4LDIyNTA5LDIyNTI1LDIyNTM2LDIyNTIwLDIyNTM5LDIyNTE1LDIyNDc5LDIyNTM1LDIyNTEwLDIyNDk5LDIyNTE0LDIyNTAxLDIyNTA4LDIyNDk3LDIyNTQyLDIyNTI0LDIyNTQ0LDIyNTAzLDIyNTI5LDIyNTQwLDIyNTEzLDIyNTA1LDIyNTEyLDIyNTQxLDIyNTMyLDIyODc2LDIzMTM2LDIzMTI4LDIzMTI1LDIzMTQzLDIzMTM0LDIzMDk2LDIzMDkzLDIzMTQ5LDIzMTIwLDIzMTM1LDIzMTQxLDIzMTQ4LDIzMTIzLDIzMTQwLDIzMTI3LDIzMTA3LDIzMTMzLDIzMTIyLDIzMTA4LDIzMTMxLDIzMTEyLDIzMTgyLDIzMTAyLDIzMTE3LDIzMDk3LDIzMTE2LDIzMTUyLDIzMTQ1LDIzMTExLDIzMTIxLDIzMTI2LDIzMTA2LDIzMTMyLDIzNDEwLDIzNDA2LDIzNDg5LDIzNDg4LDIzNjQxLDIzODM4LDIzODE5LDIzODM3LDIzODM0LDIzODQwLDIzODIwLDIzODQ4LDIzODIxLDIzODQ2LDIzODQ1LDIzODIzLDIzODU2LDIzODI2LDIzODQzLDIzODM5LDIzODU0LDI0MTI2LDI0MTE2LDI0MjQxLDI0MjQ0LDI0MjQ5LDI0MjQyLDI0MjQzLDI0Mzc0LDI0Mzc2LDI0NDc1LDI0NDcwLDI0NDc5LDI0NzE0LDI0NzIwLDI0NzEwLDI0NzY2LDI0NzUyLDI0NzYyLDI0Nzg3LDI0Nzg4LDI0NzgzLDI0ODA0LDI0NzkzLDI0Nzk3LDI0Nzc2LDI0NzUzLDI0Nzk1LDI0NzU5LDI0Nzc4LDI0NzY3LDI0NzcxLDI0NzgxLDI0NzY4LDI1Mzk0LDI1NDQ1LDI1NDgyLDI1NDc0LDI1NDY5LDI1NTMzLDI1NTAyLDI1NTE3LDI1NTAxLDI1NDk1LDI1NTE1LDI1NDg2LDI1NDU1LDI1NDc5LDI1NDg4LDI1NDU0LDI1NTE5LDI1NDYxLDI1NTAwLDI1NDUzLDI1NTE4LDI1NDY4LDI1NTA4LDI1NDAzLDI1NTAzLDI1NDY0LDI1NDc3LDI1NDczLDI1NDg5LDI1NDg1LDI1NDU2LDI1OTM5LDI2MDYxLDI2MjEzLDI2MjA5LDI2MjAzLDI2MjAxLDI2MjA0LDI2MjEwLDI2MzkyLDI2NzQ1LDI2NzU5LDI2NzY4LDI2NzgwLDI2NzMzLDI2NzM0LDI2Nzk4LDI2Nzk1LDI2OTY2LDI2NzM1LDI2Nzg3LDI2Nzk2LDI2NzkzLDI2NzQxLDI2NzQwLDI2ODAyLDI2NzY3LDI2NzQzLDI2NzcwLDI2NzQ4LDI2NzMxLDI2NzM4LDI2Nzk0LDI2NzUyLDI2NzM3LDI2NzUwLDI2Nzc5LDI2Nzc0LDI2NzYzLDI2Nzg0LDI2NzYxLDI2Nzg4LDI2NzQ0LDI2NzQ3LDI2NzY5LDI2NzY0LDI2NzYyLDI2NzQ5LDI3NDQ2LDI3NDQzLDI3NDQ3LDI3NDQ4LDI3NTM3LDI3NTM1LDI3NTMzLDI3NTM0LDI3NTMyLDI3NjkwLDI4MDk2LDI4MDc1LDI4MDg0LDI4MDgzLDI4Mjc2LDI4MDc2LDI4MTM3LDI4MTMwLDI4MDg3LDI4MTUwLDI4MTE2LDI4MTYwLDI4MTA0LDI4MTI4LDI4MTI3LDI4MTE4LDI4MDk0LDI4MTMzLDI4MTI0LDI4MTI1LDI4MTIzLDI4MTQ4LDI4MTA2LDI4MDkzLDI4MTQxLDI4MTQ0LDI4MDkwLDI4MTE3LDI4MDk4LDI4MTExLDI4MTA1LDI4MTEyLDI4MTQ2LDI4MTE1LDI4MTU3LDI4MTE5LDI4MTA5LDI4MTMxLDI4MDkxLDI4OTIyLDI4OTQxLDI4OTE5LDI4OTUxLDI4OTE2LDI4OTQwLDI4OTEyLDI4OTMyLDI4OTE1LDI4OTQ0LDI4OTI0LDI4OTI3LDI4OTM0LDI4OTQ3LDI4OTI4LDI4OTIwLDI4OTE4LDI4OTM5LDI4OTMwLDI4OTQyLDI5MzEwLDI5MzA3LDI5MzA4LDI5MzExLDI5NDY5LDI5NDYzLDI5NDQ3LDI5NDU3LDI5NDY0LDI5NDUwLDI5NDQ4LDI5NDM5LDI5NDU1LDI5NDcwLDI5NTc2LDI5Njg2LDI5Njg4LDI5Njg1LDI5NzAwLDI5Njk3LDI5NjkzLDI5NzAzLDI5Njk2LDI5NjkwLDI5NjkyLDI5Njk1LDI5NzA4LDI5NzA3LDI5Njg0LDI5NzA0LDMwMDUyLDMwMDUxLDMwMTU4LDMwMTYyLDMwMTU5LDMwMTU1LDMwMTU2LDMwMTYxLDMwMTYwLDMwMzUxLDMwMzQ1LDMwNDE5LDMwNTIxLDMwNTExLDMwNTA5LDMwNTEzLDMwNTE0LDMwNTE2LDMwNTE1LDMwNTI1LDMwNTAxLDMwNTIzLDMwNTE3LDMwNzkyLDMwODAyLDMwNzkzLDMwNzk3LDMwNzk0LDMwNzk2LDMwNzU4LDMwNzg5LDMwODAwLDMxMDc2LDMxMDc5LDMxMDgxLDMxMDgyLDMxMDc1LDMxMDgzLDMxMDczLDMxMTYzLDMxMjI2LDMxMjI0LDMxMjIyLDMxMjIzLDMxMzc1LDMxMzgwLDMxMzc2LDMxNTQxLDMxNTU5LDMxNTQwLDMxNTI1LDMxNTM2LDMxNTIyLDMxNTI0LDMxNTM5LDMxNTEyLDMxNTMwLDMxNTE3LDMxNTM3LDMxNTMxLDMxNTMzLDMxNTM1LDMxNTM4LDMxNTQ0LDMxNTE0LDMxNTIzLDMxODkyLDMxODk2LDMxODk0LDMxOTA3LDMyMDUzLDMyMDYxLDMyMDU2LDMyMDU0LDMyMDU4LDMyMDY5LDMyMDQ0LDMyMDQxLDMyMDY1LDMyMDcxLDMyMDYyLDMyMDYzLDMyMDc0LDMyMDU5LDMyMDQwLDMyNjExLDMyNjYxLDMyNjY4LDMyNjY5LDMyNjY3LDMyNzE0LDMyNzE1LDMyNzE3LDMyNzIwLDMyNzIxLDMyNzExLDMyNzE5LDMyNzEzLDMyNzk5LDMyNzk4LDMyNzk1LDMyODM5LDMyODM1LDMyODQwLDMzMDQ4LDMzMDYxLDMzMDQ5LDMzMDUxLDMzMDY5LDMzMDU1LDMzMDY4LDMzMDU0LDMzMDU3LDMzMDQ1LDMzMDYzLDMzMDUzLDMzMDU4LDMzMjk3LDMzMzM2LDMzMzMxLDMzMzM4LDMzMzMyLDMzMzMwLDMzMzk2LDMzNjgwLDMzNjk5LDMzNzA0LDMzNjc3LDMzNjU4LDMzNjUxLDMzNzAwLDMzNjUyLDMzNjc5LDMzNjY1LDMzNjg1LDMzNjg5LDMzNjUzLDMzNjg0LDMzNzA1LDMzNjYxLDMzNjY3LDMzNjc2LDMzNjkzLDMzNjkxLDMzNzA2LDMzNjc1LDMzNjYyLDMzNzAxLDMzNzExLDMzNjcyLDMzNjg3LDMzNzEyLDMzNjYzLDMzNzAyLDMzNjcxLDMzNzEwLDMzNjU0LDMzNjkwLDM0MzkzLDM0MzkwLDM0NDk1LDM0NDg3LDM0NDk4LDM0NDk3LDM0NTAxLDM0NDkwLDM0NDgwLDM0NTA0LDM0NDg5LDM0NDgzLDM0NDg4LDM0NTA4LDM0NDg0LDM0NDkxLDM0NDkyLDM0NDk5LDM0NDkzLDM0NDk0LDM0ODk4LDM0OTUzLDM0OTY1LDM0OTg0LDM0OTc4LDM0OTg2LDM0OTcwLDM0OTYxLDM0OTc3LDM0OTc1LDM0OTY4LDM0OTgzLDM0OTY5LDM0OTcxLDM0OTY3LDM0OTgwLDM0OTg4LDM0OTU2LDM0OTYzLDM0OTU4LDM1MjAyLDM1Mjg2LDM1Mjg5LDM1Mjg1LDM1Mzc2LDM1MzY3LDM1MzcyLDM1MzU4LDM1ODk3LDM1ODk5LDM1OTMyLDM1OTMzLDM1OTY1LDM2MDA1LDM2MjIxLDM2MjE5LDM2MjE3LDM2Mjg0LDM2MjkwLDM2MjgxLDM2Mjg3LDM2Mjg5LDM2NTY4LDM2NTc0LDM2NTczLDM2NTcyLDM2NTY3LDM2NTc2LDM2NTc3LDM2OTAwLDM2ODc1LDM2ODgxLDM2ODkyLDM2ODc2LDM2ODk3LDM3MTAzLDM3MDk4LDM3MTA0LDM3MTA4LDM3MTA2LDM3MTA3LDM3MDc2LDM3MDk5LDM3MTAwLDM3MDk3LDM3MjA2LDM3MjA4LDM3MjEwLDM3MjAzLDM3MjA1LDM3MzU2LDM3MzY0LDM3MzYxLDM3MzYzLDM3MzY4LDM3MzQ4LDM3MzY5LDM3MzU0LDM3MzU1LDM3MzY3LDM3MzUyLDM3MzU4LDM4MjY2LDM4Mjc4LDM4MjgwLDM4NTI0LDM4NTA5LDM4NTA3LDM4NTEzLDM4NTExLDM4NTkxLDM4NzYyLDM4OTE2LDM5MTQxLDM5MzE5LDIwNjM1LDIwNjI5LDIwNjI4LDIwNjM4LDIwNjE5LDIwNjQzLDIwNjExLDIwNjIwLDIwNjIyLDIwNjM3LDIwNTg0LDIwNjM2LDIwNjI2LDIwNjEwLDIwNjE1LDIwODMxLDIwOTQ4LDIxMjY2LDIxMjY1LDIxNDEyLDIxNDE1LDIxOTA1LDIxOTI4LDIxOTI1LDIxOTMzLDIxODc5LDIyMDg1LDIxOTIyLDIxOTA3LDIxODk2LDIxOTAzLDIxOTQxLDIxODg5LDIxOTIzLDIxOTA2LDIxOTI0LDIxODg1LDIxOTAwLDIxOTI2LDIxODg3LDIxOTA5LDIxOTIxLDIxOTAyLDIyMjg0LDIyNTY5LDIyNTgzLDIyNTUzLDIyNTU4LDIyNTY3LDIyNTYzLDIyNTY4LDIyNTE3LDIyNjAwLDIyNTY1LDIyNTU2LDIyNTU1LDIyNTc5LDIyNTkxLDIyNTgyLDIyNTc0LDIyNTg1LDIyNTg0LDIyNTczLDIyNTcyLDIyNTg3LDIyODgxLDIzMjE1LDIzMTg4LDIzMTk5LDIzMTYyLDIzMjAyLDIzMTk4LDIzMTYwLDIzMjA2LDIzMTY0LDIzMjA1LDIzMjEyLDIzMTg5LDIzMjE0LDIzMDk1LDIzMTcyLDIzMTc4LDIzMTkxLDIzMTcxLDIzMTc5LDIzMjA5LDIzMTYzLDIzMTY1LDIzMTgwLDIzMTk2LDIzMTgzLDIzMTg3LDIzMTk3LDIzNTMwLDIzNTAxLDIzNDk5LDIzNTA4LDIzNTA1LDIzNDk4LDIzNTAyLDIzNTY0LDIzNjAwLDIzODYzLDIzODc1LDIzOTE1LDIzODczLDIzODgzLDIzODcxLDIzODYxLDIzODg5LDIzODg2LDIzODkzLDIzODU5LDIzODY2LDIzODkwLDIzODY5LDIzODU3LDIzODk3LDIzODc0LDIzODY1LDIzODgxLDIzODY0LDIzODY4LDIzODU4LDIzODYyLDIzODcyLDIzODc3LDI0MTMyLDI0MTI5LDI0NDA4LDI0NDg2LDI0NDg1LDI0NDkxLDI0Nzc3LDI0NzYxLDI0NzgwLDI0ODAyLDI0NzgyLDI0NzcyLDI0ODUyLDI0ODE4LDI0ODQyLDI0ODU0LDI0ODM3LDI0ODIxLDI0ODUxLDI0ODI0LDI0ODI4LDI0ODMwLDI0NzY5LDI0ODM1LDI0ODU2LDI0ODYxLDI0ODQ4LDI0ODMxLDI0ODM2LDI0ODQzLDI1MTYyLDI1NDkyLDI1NTIxLDI1NTIwLDI1NTUwLDI1NTczLDI1NTc2LDI1NTgzLDI1NTM5LDI1NzU3LDI1NTg3LDI1NTQ2LDI1NTY4LDI1NTkwLDI1NTU3LDI1NTg2LDI1NTg5LDI1Njk3LDI1NTY3LDI1NTM0LDI1NTY1LDI1NTY0LDI1NTQwLDI1NTYwLDI1NTU1LDI1NTM4LDI1NTQzLDI1NTQ4LDI1NTQ3LDI1NTQ0LDI1NTg0LDI1NTU5LDI1NTYxLDI1OTA2LDI1OTU5LDI1OTYyLDI1OTU2LDI1OTQ4LDI1OTYwLDI1OTU3LDI1OTk2LDI2MDEzLDI2MDE0LDI2MDMwLDI2MDY0LDI2MDY2LDI2MjM2LDI2MjIwLDI2MjM1LDI2MjQwLDI2MjI1LDI2MjMzLDI2MjE4LDI2MjI2LDI2MzY5LDI2ODkyLDI2ODM1LDI2ODg0LDI2ODQ0LDI2OTIyLDI2ODYwLDI2ODU4LDI2ODY1LDI2ODk1LDI2ODM4LDI2ODcxLDI2ODU5LDI2ODUyLDI2ODcwLDI2ODk5LDI2ODk2LDI2ODY3LDI2ODQ5LDI2ODg3LDI2ODI4LDI2ODg4LDI2OTkyLDI2ODA0LDI2ODk3LDI2ODYzLDI2ODIyLDI2OTAwLDI2ODcyLDI2ODMyLDI2ODc3LDI2ODc2LDI2ODU2LDI2ODkxLDI2ODkwLDI2OTAzLDI2ODMwLDI2ODI0LDI2ODQ1LDI2ODQ2LDI2ODU0LDI2ODY4LDI2ODMzLDI2ODg2LDI2ODM2LDI2ODU3LDI2OTAxLDI2OTE3LDI2ODIzLDI3NDQ5LDI3NDUxLDI3NDU1LDI3NDUyLDI3NTQwLDI3NTQzLDI3NTQ1LDI3NTQxLDI3NTgxLDI3NjMyLDI3NjM0LDI3NjM1LDI3Njk2LDI4MTU2LDI4MjMwLDI4MjMxLDI4MTkxLDI4MjMzLDI4Mjk2LDI4MjIwLDI4MjIxLDI4MjI5LDI4MjU4LDI4MjAzLDI4MjIzLDI4MjI1LDI4MjUzLDI4Mjc1LDI4MTg4LDI4MjExLDI4MjM1LDI4MjI0LDI4MjQxLDI4MjE5LDI4MTYzLDI4MjA2LDI4MjU0LDI4MjY0LDI4MjUyLDI4MjU3LDI4MjA5LDI4MjAwLDI4MjU2LDI4MjczLDI4MjY3LDI4MjE3LDI4MTk0LDI4MjA4LDI4MjQzLDI4MjYxLDI4MTk5LDI4MjgwLDI4MjYwLDI4Mjc5LDI4MjQ1LDI4MjgxLDI4MjQyLDI4MjYyLDI4MjEzLDI4MjE0LDI4MjUwLDI4OTYwLDI4OTU4LDI4OTc1LDI4OTIzLDI4OTc0LDI4OTc3LDI4OTYzLDI4OTY1LDI4OTYyLDI4OTc4LDI4OTU5LDI4OTY4LDI4OTg2LDI4OTU1LDI5MjU5LDI5Mjc0LDI5MzIwLDI5MzIxLDI5MzE4LDI5MzE3LDI5MzIzLDI5NDU4LDI5NDUxLDI5NDg4LDI5NDc0LDI5NDg5LDI5NDkxLDI5NDc5LDI5NDkwLDI5NDg1LDI5NDc4LDI5NDc1LDI5NDkzLDI5NDUyLDI5NzQyLDI5NzQwLDI5NzQ0LDI5NzM5LDI5NzE4LDI5NzIyLDI5NzI5LDI5NzQxLDI5NzQ1LDI5NzMyLDI5NzMxLDI5NzI1LDI5NzM3LDI5NzI4LDI5NzQ2LDI5OTQ3LDI5OTk5LDMwMDYzLDMwMDYwLDMwMTgzLDMwMTcwLDMwMTc3LDMwMTgyLDMwMTczLDMwMTc1LDMwMTgwLDMwMTY3LDMwMzU3LDMwMzU0LDMwNDI2LDMwNTM0LDMwNTM1LDMwNTMyLDMwNTQxLDMwNTMzLDMwNTM4LDMwNTQyLDMwNTM5LDMwNTQwLDMwNjg2LDMwNzAwLDMwODE2LDMwODIwLDMwODIxLDMwODEyLDMwODI5LDMwODMzLDMwODI2LDMwODMwLDMwODMyLDMwODI1LDMwODI0LDMwODE0LDMwODE4LDMxMDkyLDMxMDkxLDMxMDkwLDMxMDg4LDMxMjM0LDMxMjQyLDMxMjM1LDMxMjQ0LDMxMjM2LDMxMzg1LDMxNDYyLDMxNDYwLDMxNTYyLDMxNTQ3LDMxNTU2LDMxNTYwLDMxNTY0LDMxNTY2LDMxNTUyLDMxNTc2LDMxNTU3LDMxOTA2LDMxOTAyLDMxOTEyLDMxOTA1LDMyMDg4LDMyMTExLDMyMDk5LDMyMDgzLDMyMDg2LDMyMTAzLDMyMTA2LDMyMDc5LDMyMTA5LDMyMDkyLDMyMTA3LDMyMDgyLDMyMDg0LDMyMTA1LDMyMDgxLDMyMDk1LDMyMDc4LDMyNTc0LDMyNTc1LDMyNjEzLDMyNjE0LDMyNjc0LDMyNjcyLDMyNjczLDMyNzI3LDMyODQ5LDMyODQ3LDMyODQ4LDMzMDIyLDMyOTgwLDMzMDkxLDMzMDk4LDMzMTA2LDMzMTAzLDMzMDk1LDMzMDg1LDMzMTAxLDMzMDgyLDMzMjU0LDMzMjYyLDMzMjcxLDMzMjcyLDMzMjczLDMzMjg0LDMzMzQwLDMzMzQxLDMzMzQzLDMzMzk3LDMzNTk1LDMzNzQzLDMzNzg1LDMzODI3LDMzNzI4LDMzNzY4LDMzODEwLDMzNzY3LDMzNzY0LDMzNzg4LDMzNzgyLDMzODA4LDMzNzM0LDMzNzM2LDMzNzcxLDMzNzYzLDMzNzI3LDMzNzkzLDMzNzU3LDMzNzY1LDMzNzUyLDMzNzkxLDMzNzYxLDMzNzM5LDMzNzQyLDMzNzUwLDMzNzgxLDMzNzM3LDMzODAxLDMzODA3LDMzNzU4LDMzODA5LDMzNzk4LDMzNzMwLDMzNzc5LDMzNzQ5LDMzNzg2LDMzNzM1LDMzNzQ1LDMzNzcwLDMzODExLDMzNzMxLDMzNzcyLDMzNzc0LDMzNzMyLDMzNzg3LDMzNzUxLDMzNzYyLDMzODE5LDMzNzU1LDMzNzkwLDM0NTIwLDM0NTMwLDM0NTM0LDM0NTE1LDM0NTMxLDM0NTIyLDM0NTM4LDM0NTI1LDM0NTM5LDM0NTI0LDM0NTQwLDM0NTM3LDM0NTE5LDM0NTM2LDM0NTEzLDM0ODg4LDM0OTAyLDM0OTAxLDM1MDAyLDM1MDMxLDM1MDAxLDM1MDAwLDM1MDA4LDM1MDA2LDM0OTk4LDM1MDA0LDM0OTk5LDM1MDA1LDM0OTk0LDM1MDczLDM1MDE3LDM1MjIxLDM1MjI0LDM1MjIzLDM1MjkzLDM1MjkwLDM1MjkxLDM1NDA2LDM1NDA1LDM1Mzg1LDM1NDE3LDM1MzkyLDM1NDE1LDM1NDE2LDM1Mzk2LDM1Mzk3LDM1NDEwLDM1NDAwLDM1NDA5LDM1NDAyLDM1NDA0LDM1NDA3LDM1OTM1LDM1OTY5LDM1OTY4LDM2MDI2LDM2MDMwLDM2MDE2LDM2MDI1LDM2MDIxLDM2MjI4LDM2MjI0LDM2MjMzLDM2MzEyLDM2MzA3LDM2MzAxLDM2Mjk1LDM2MzEwLDM2MzE2LDM2MzAzLDM2MzA5LDM2MzEzLDM2Mjk2LDM2MzExLDM2MjkzLDM2NTkxLDM2NTk5LDM2NjAyLDM2NjAxLDM2NTgyLDM2NTkwLDM2NTgxLDM2NTk3LDM2NTgzLDM2NTg0LDM2NTk4LDM2NTg3LDM2NTkzLDM2NTg4LDM2NTk2LDM2NTg1LDM2OTA5LDM2OTE2LDM2OTExLDM3MTI2LDM3MTY0LDM3MTI0LDM3MTE5LDM3MTE2LDM3MTI4LDM3MTEzLDM3MTE1LDM3MTIxLDM3MTIwLDM3MTI3LDM3MTI1LDM3MTIzLDM3MjE3LDM3MjIwLDM3MjE1LDM3MjE4LDM3MjE2LDM3Mzc3LDM3Mzg2LDM3NDEzLDM3Mzc5LDM3NDAyLDM3NDE0LDM3MzkxLDM3Mzg4LDM3Mzc2LDM3Mzk0LDM3Mzc1LDM3MzczLDM3MzgyLDM3MzgwLDM3NDE1LDM3Mzc4LDM3NDA0LDM3NDEyLDM3NDAxLDM3Mzk5LDM3MzgxLDM3Mzk4LDM4MjY3LDM4Mjg1LDM4Mjg0LDM4Mjg4LDM4NTM1LDM4NTI2LDM4NTM2LDM4NTM3LDM4NTMxLDM4NTI4LDM4NTk0LDM4NjAwLDM4NTk1LDM4NjQxLDM4NjQwLDM4NzY0LDM4NzY4LDM4NzY2LDM4OTE5LDM5MDgxLDM5MTQ3LDQwMTY2LDQwNjk3LDIwMDk5LDIwMTAwLDIwMTUwLDIwNjY5LDIwNjcxLDIwNjc4LDIwNjU0LDIwNjc2LDIwNjgyLDIwNjYwLDIwNjgwLDIwNjc0LDIwNjU2LDIwNjczLDIwNjY2LDIwNjU3LDIwNjgzLDIwNjgxLDIwNjYyLDIwNjY0LDIwOTUxLDIxMTE0LDIxMTEyLDIxMTE1LDIxMTE2LDIxOTU1LDIxOTc5LDIxOTY0LDIxOTY4LDIxOTYzLDIxOTYyLDIxOTgxLDIxOTUyLDIxOTcyLDIxOTU2LDIxOTkzLDIxOTUxLDIxOTcwLDIxOTAxLDIxOTY3LDIxOTczLDIxOTg2LDIxOTc0LDIxOTYwLDIyMDAyLDIxOTY1LDIxOTc3LDIxOTU0LDIyMjkyLDIyNjExLDIyNjMyLDIyNjI4LDIyNjA3LDIyNjA1LDIyNjAxLDIyNjM5LDIyNjEzLDIyNjA2LDIyNjIxLDIyNjE3LDIyNjI5LDIyNjE5LDIyNTg5LDIyNjI3LDIyNjQxLDIyNzgwLDIzMjM5LDIzMjM2LDIzMjQzLDIzMjI2LDIzMjI0LDIzMjE3LDIzMjIxLDIzMjE2LDIzMjMxLDIzMjQwLDIzMjI3LDIzMjM4LDIzMjIzLDIzMjMyLDIzMjQyLDIzMjIwLDIzMjIyLDIzMjQ1LDIzMjI1LDIzMTg0LDIzNTEwLDIzNTEyLDIzNTEzLDIzNTgzLDIzNjAzLDIzOTIxLDIzOTA3LDIzODgyLDIzOTA5LDIzOTIyLDIzOTE2LDIzOTAyLDIzOTEyLDIzOTExLDIzOTA2LDI0MDQ4LDI0MTQzLDI0MTQyLDI0MTM4LDI0MTQxLDI0MTM5LDI0MjYxLDI0MjY4LDI0MjYyLDI0MjY3LDI0MjYzLDI0Mzg0LDI0NDk1LDI0NDkzLDI0ODIzLDI0OTA1LDI0OTA2LDI0ODc1LDI0OTAxLDI0ODg2LDI0ODgyLDI0ODc4LDI0OTAyLDI0ODc5LDI0OTExLDI0ODczLDI0ODk2LDI1MTIwLDM3MjI0LDI1MTIzLDI1MTI1LDI1MTI0LDI1NTQxLDI1NTg1LDI1NTc5LDI1NjE2LDI1NjE4LDI1NjA5LDI1NjMyLDI1NjM2LDI1NjUxLDI1NjY3LDI1NjMxLDI1NjIxLDI1NjI0LDI1NjU3LDI1NjU1LDI1NjM0LDI1NjM1LDI1NjEyLDI1NjM4LDI1NjQ4LDI1NjQwLDI1NjY1LDI1NjUzLDI1NjQ3LDI1NjEwLDI1NjI2LDI1NjY0LDI1NjM3LDI1NjM5LDI1NjExLDI1NTc1LDI1NjI3LDI1NjQ2LDI1NjMzLDI1NjE0LDI1OTY3LDI2MDAyLDI2MDY3LDI2MjQ2LDI2MjUyLDI2MjYxLDI2MjU2LDI2MjUxLDI2MjUwLDI2MjY1LDI2MjYwLDI2MjMyLDI2NDAwLDI2OTgyLDI2OTc1LDI2OTM2LDI2OTU4LDI2OTc4LDI2OTkzLDI2OTQzLDI2OTQ5LDI2OTg2LDI2OTM3LDI2OTQ2LDI2OTY3LDI2OTY5LDI3MDAyLDI2OTUyLDI2OTUzLDI2OTMzLDI2OTg4LDI2OTMxLDI2OTQxLDI2OTgxLDI2ODY0LDI3MDAwLDI2OTMyLDI2OTg1LDI2OTQ0LDI2OTkxLDI2OTQ4LDI2OTk4LDI2OTY4LDI2OTQ1LDI2OTk2LDI2OTU2LDI2OTM5LDI2OTU1LDI2OTM1LDI2OTcyLDI2OTU5LDI2OTYxLDI2OTMwLDI2OTYyLDI2OTI3LDI3MDAzLDI2OTQwLDI3NDYyLDI3NDYxLDI3NDU5LDI3NDU4LDI3NDY0LDI3NDU3LDI3NTQ3LDY0MDEzLDI3NjQzLDI3NjQ0LDI3NjQxLDI3NjM5LDI3NjQwLDI4MzE1LDI4Mzc0LDI4MzYwLDI4MzAzLDI4MzUyLDI4MzE5LDI4MzA3LDI4MzA4LDI4MzIwLDI4MzM3LDI4MzQ1LDI4MzU4LDI4MzcwLDI4MzQ5LDI4MzUzLDI4MzE4LDI4MzYxLDI4MzQzLDI4MzM2LDI4MzY1LDI4MzI2LDI4MzY3LDI4MzM4LDI4MzUwLDI4MzU1LDI4MzgwLDI4Mzc2LDI4MzEzLDI4MzA2LDI4MzAyLDI4MzAxLDI4MzI0LDI4MzIxLDI4MzUxLDI4MzM5LDI4MzY4LDI4MzYyLDI4MzExLDI4MzM0LDI4MzIzLDI4OTk5LDI5MDEyLDI5MDEwLDI5MDI3LDI5MDI0LDI4OTkzLDI5MDIxLDI5MDI2LDI5MDQyLDI5MDQ4LDI5MDM0LDI5MDI1LDI4OTk0LDI5MDE2LDI4OTk1LDI5MDAzLDI5MDQwLDI5MDIzLDI5MDA4LDI5MDExLDI4OTk2LDI5MDA1LDI5MDE4LDI5MjYzLDI5MzI1LDI5MzI0LDI5MzI5LDI5MzI4LDI5MzI2LDI5NTAwLDI5NTA2LDI5NDk5LDI5NDk4LDI5NTA0LDI5NTE0LDI5NTEzLDI5NzY0LDI5NzcwLDI5NzcxLDI5Nzc4LDI5Nzc3LDI5NzgzLDI5NzYwLDI5Nzc1LDI5Nzc2LDI5Nzc0LDI5NzYyLDI5NzY2LDI5NzczLDI5NzgwLDI5OTIxLDI5OTUxLDI5OTUwLDI5OTQ5LDI5OTgxLDMwMDczLDMwMDcxLDI3MDExLDMwMTkxLDMwMjIzLDMwMjExLDMwMTk5LDMwMjA2LDMwMjA0LDMwMjAxLDMwMjAwLDMwMjI0LDMwMjAzLDMwMTk4LDMwMTg5LDMwMTk3LDMwMjA1LDMwMzYxLDMwMzg5LDMwNDI5LDMwNTQ5LDMwNTU5LDMwNTYwLDMwNTQ2LDMwNTUwLDMwNTU0LDMwNTY5LDMwNTY3LDMwNTQ4LDMwNTUzLDMwNTczLDMwNjg4LDMwODU1LDMwODc0LDMwODY4LDMwODYzLDMwODUyLDMwODY5LDMwODUzLDMwODU0LDMwODgxLDMwODUxLDMwODQxLDMwODczLDMwODQ4LDMwODcwLDMwODQzLDMxMTAwLDMxMTA2LDMxMTAxLDMxMDk3LDMxMjQ5LDMxMjU2LDMxMjU3LDMxMjUwLDMxMjU1LDMxMjUzLDMxMjY2LDMxMjUxLDMxMjU5LDMxMjQ4LDMxMzk1LDMxMzk0LDMxMzkwLDMxNDY3LDMxNTkwLDMxNTg4LDMxNTk3LDMxNjA0LDMxNTkzLDMxNjAyLDMxNTg5LDMxNjAzLDMxNjAxLDMxNjAwLDMxNTg1LDMxNjA4LDMxNjA2LDMxNTg3LDMxOTIyLDMxOTI0LDMxOTE5LDMyMTM2LDMyMTM0LDMyMTI4LDMyMTQxLDMyMTI3LDMyMTMzLDMyMTIyLDMyMTQyLDMyMTIzLDMyMTMxLDMyMTI0LDMyMTQwLDMyMTQ4LDMyMTMyLDMyMTI1LDMyMTQ2LDMyNjIxLDMyNjE5LDMyNjE1LDMyNjE2LDMyNjIwLDMyNjc4LDMyNjc3LDMyNjc5LDMyNzMxLDMyNzMyLDMyODAxLDMzMTI0LDMzMTIwLDMzMTQzLDMzMTE2LDMzMTI5LDMzMTE1LDMzMTIyLDMzMTM4LDI2NDAxLDMzMTE4LDMzMTQyLDMzMTI3LDMzMTM1LDMzMDkyLDMzMTIxLDMzMzA5LDMzMzUzLDMzMzQ4LDMzMzQ0LDMzMzQ2LDMzMzQ5LDM0MDMzLDMzODU1LDMzODc4LDMzOTEwLDMzOTEzLDMzOTM1LDMzOTMzLDMzODkzLDMzODczLDMzODU2LDMzOTI2LDMzODk1LDMzODQwLDMzODY5LDMzOTE3LDMzODgyLDMzODgxLDMzOTA4LDMzOTA3LDMzODg1LDM0MDU1LDMzODg2LDMzODQ3LDMzODUwLDMzODQ0LDMzOTE0LDMzODU5LDMzOTEyLDMzODQyLDMzODYxLDMzODMzLDMzNzUzLDMzODY3LDMzODM5LDMzODU4LDMzODM3LDMzODg3LDMzOTA0LDMzODQ5LDMzODcwLDMzODY4LDMzODc0LDMzOTAzLDMzOTg5LDMzOTM0LDMzODUxLDMzODYzLDMzODQ2LDMzODQzLDMzODk2LDMzOTE4LDMzODYwLDMzODM1LDMzODg4LDMzODc2LDMzOTAyLDMzODcyLDM0NTcxLDM0NTY0LDM0NTUxLDM0NTcyLDM0NTU0LDM0NTE4LDM0NTQ5LDM0NjM3LDM0NTUyLDM0NTc0LDM0NTY5LDM0NTYxLDM0NTUwLDM0NTczLDM0NTY1LDM1MDMwLDM1MDE5LDM1MDIxLDM1MDIyLDM1MDM4LDM1MDM1LDM1MDM0LDM1MDIwLDM1MDI0LDM1MjA1LDM1MjI3LDM1Mjk1LDM1MzAxLDM1MzAwLDM1Mjk3LDM1Mjk2LDM1Mjk4LDM1MjkyLDM1MzAyLDM1NDQ2LDM1NDYyLDM1NDU1LDM1NDI1LDM1MzkxLDM1NDQ3LDM1NDU4LDM1NDYwLDM1NDQ1LDM1NDU5LDM1NDU3LDM1NDQ0LDM1NDUwLDM1OTAwLDM1OTE1LDM1OTE0LDM1OTQxLDM1OTQwLDM1OTQyLDM1OTc0LDM1OTcyLDM1OTczLDM2MDQ0LDM2MjAwLDM2MjAxLDM2MjQxLDM2MjM2LDM2MjM4LDM2MjM5LDM2MjM3LDM2MjQzLDM2MjQ0LDM2MjQwLDM2MjQyLDM2MzM2LDM2MzIwLDM2MzMyLDM2MzM3LDM2MzM0LDM2MzA0LDM2MzI5LDM2MzIzLDM2MzIyLDM2MzI3LDM2MzM4LDM2MzMxLDM2MzQwLDM2NjE0LDM2NjA3LDM2NjA5LDM2NjA4LDM2NjEzLDM2NjE1LDM2NjE2LDM2NjEwLDM2NjE5LDM2OTQ2LDM2OTI3LDM2OTMyLDM2OTM3LDM2OTI1LDM3MTM2LDM3MTMzLDM3MTM1LDM3MTM3LDM3MTQyLDM3MTQwLDM3MTMxLDM3MTM0LDM3MjMwLDM3MjMxLDM3NDQ4LDM3NDU4LDM3NDI0LDM3NDM0LDM3NDc4LDM3NDI3LDM3NDc3LDM3NDcwLDM3NTA3LDM3NDIyLDM3NDUwLDM3NDQ2LDM3NDg1LDM3NDg0LDM3NDU1LDM3NDcyLDM3NDc5LDM3NDg3LDM3NDMwLDM3NDczLDM3NDg4LDM3NDI1LDM3NDYwLDM3NDc1LDM3NDU2LDM3NDkwLDM3NDU0LDM3NDU5LDM3NDUyLDM3NDYyLDM3NDI2LDM4MzAzLDM4MzAwLDM4MzAyLDM4Mjk5LDM4NTQ2LDM4NTQ3LDM4NTQ1LDM4NTUxLDM4NjA2LDM4NjUwLDM4NjUzLDM4NjQ4LDM4NjQ1LDM4NzcxLDM4Nzc1LDM4Nzc2LDM4NzcwLDM4OTI3LDM4OTI1LDM4OTI2LDM5MDg0LDM5MTU4LDM5MTYxLDM5MzQzLDM5MzQ2LDM5MzQ0LDM5MzQ5LDM5NTk3LDM5NTk1LDM5NzcxLDQwMTcwLDQwMTczLDQwMTY3LDQwNTc2LDQwNzAxLDIwNzEwLDIwNjkyLDIwNjk1LDIwNzEyLDIwNzIzLDIwNjk5LDIwNzE0LDIwNzAxLDIwNzA4LDIwNjkxLDIwNzE2LDIwNzIwLDIwNzE5LDIwNzA3LDIwNzA0LDIwOTUyLDIxMTIwLDIxMTIxLDIxMjI1LDIxMjI3LDIxMjk2LDIxNDIwLDIyMDU1LDIyMDM3LDIyMDI4LDIyMDM0LDIyMDEyLDIyMDMxLDIyMDQ0LDIyMDE3LDIyMDM1LDIyMDE4LDIyMDEwLDIyMDQ1LDIyMDIwLDIyMDE1LDIyMDA5LDIyNjY1LDIyNjUyLDIyNjcyLDIyNjgwLDIyNjYyLDIyNjU3LDIyNjU1LDIyNjQ0LDIyNjY3LDIyNjUwLDIyNjYzLDIyNjczLDIyNjcwLDIyNjQ2LDIyNjU4LDIyNjY0LDIyNjUxLDIyNjc2LDIyNjcxLDIyNzgyLDIyODkxLDIzMjYwLDIzMjc4LDIzMjY5LDIzMjUzLDIzMjc0LDIzMjU4LDIzMjc3LDIzMjc1LDIzMjgzLDIzMjY2LDIzMjY0LDIzMjU5LDIzMjc2LDIzMjYyLDIzMjYxLDIzMjU3LDIzMjcyLDIzMjYzLDIzNDE1LDIzNTIwLDIzNTIzLDIzNjUxLDIzOTM4LDIzOTM2LDIzOTMzLDIzOTQyLDIzOTMwLDIzOTM3LDIzOTI3LDIzOTQ2LDIzOTQ1LDIzOTQ0LDIzOTM0LDIzOTMyLDIzOTQ5LDIzOTI5LDIzOTM1LDI0MTUyLDI0MTUzLDI0MTQ3LDI0MjgwLDI0MjczLDI0Mjc5LDI0MjcwLDI0Mjg0LDI0Mjc3LDI0MjgxLDI0Mjc0LDI0Mjc2LDI0Mzg4LDI0Mzg3LDI0NDMxLDI0NTAyLDI0ODc2LDI0ODcyLDI0ODk3LDI0OTI2LDI0OTQ1LDI0OTQ3LDI0OTE0LDI0OTE1LDI0OTQ2LDI0OTQwLDI0OTYwLDI0OTQ4LDI0OTE2LDI0OTU0LDI0OTIzLDI0OTMzLDI0ODkxLDI0OTM4LDI0OTI5LDI0OTE4LDI1MTI5LDI1MTI3LDI1MTMxLDI1NjQzLDI1Njc3LDI1NjkxLDI1NjkzLDI1NzE2LDI1NzE4LDI1NzE0LDI1NzE1LDI1NzI1LDI1NzE3LDI1NzAyLDI1NzY2LDI1Njc4LDI1NzMwLDI1Njk0LDI1NjkyLDI1Njc1LDI1NjgzLDI1Njk2LDI1NjgwLDI1NzI3LDI1NjYzLDI1NzA4LDI1NzA3LDI1Njg5LDI1NzAxLDI1NzE5LDI1OTcxLDI2MDE2LDI2MjczLDI2MjcyLDI2MjcxLDI2MzczLDI2MzcyLDI2NDAyLDI3MDU3LDI3MDYyLDI3MDgxLDI3MDQwLDI3MDg2LDI3MDMwLDI3MDU2LDI3MDUyLDI3MDY4LDI3MDI1LDI3MDMzLDI3MDIyLDI3MDQ3LDI3MDIxLDI3MDQ5LDI3MDcwLDI3MDU1LDI3MDcxLDI3MDc2LDI3MDY5LDI3MDQ0LDI3MDkyLDI3MDY1LDI3MDgyLDI3MDM0LDI3MDg3LDI3MDU5LDI3MDI3LDI3MDUwLDI3MDQxLDI3MDM4LDI3MDk3LDI3MDMxLDI3MDI0LDI3MDc0LDI3MDYxLDI3MDQ1LDI3MDc4LDI3NDY2LDI3NDY5LDI3NDY3LDI3NTUwLDI3NTUxLDI3NTUyLDI3NTg3LDI3NTg4LDI3NjQ2LDI4MzY2LDI4NDA1LDI4NDAxLDI4NDE5LDI4NDUzLDI4NDA4LDI4NDcxLDI4NDExLDI4NDYyLDI4NDI1LDI4NDk0LDI4NDQxLDI4NDQyLDI4NDU1LDI4NDQwLDI4NDc1LDI4NDM0LDI4Mzk3LDI4NDI2LDI4NDcwLDI4NTMxLDI4NDA5LDI4Mzk4LDI4NDYxLDI4NDgwLDI4NDY0LDI4NDc2LDI4NDY5LDI4Mzk1LDI4NDIzLDI4NDMwLDI4NDgzLDI4NDIxLDI4NDEzLDI4NDA2LDI4NDczLDI4NDQ0LDI4NDEyLDI4NDc0LDI4NDQ3LDI4NDI5LDI4NDQ2LDI4NDI0LDI4NDQ5LDI5MDYzLDI5MDcyLDI5MDY1LDI5MDU2LDI5MDYxLDI5MDU4LDI5MDcxLDI5MDUxLDI5MDYyLDI5MDU3LDI5MDc5LDI5MjUyLDI5MjY3LDI5MzM1LDI5MzMzLDI5MzMxLDI5NTA3LDI5NTE3LDI5NTIxLDI5NTE2LDI5Nzk0LDI5ODExLDI5ODA5LDI5ODEzLDI5ODEwLDI5Nzk5LDI5ODA2LDI5OTUyLDI5OTU0LDI5OTU1LDMwMDc3LDMwMDk2LDMwMjMwLDMwMjE2LDMwMjIwLDMwMjI5LDMwMjI1LDMwMjE4LDMwMjI4LDMwMzkyLDMwNTkzLDMwNTg4LDMwNTk3LDMwNTk0LDMwNTc0LDMwNTkyLDMwNTc1LDMwNTkwLDMwNTk1LDMwODk4LDMwODkwLDMwOTAwLDMwODkzLDMwODg4LDMwODQ2LDMwODkxLDMwODc4LDMwODg1LDMwODgwLDMwODkyLDMwODgyLDMwODg0LDMxMTI4LDMxMTE0LDMxMTE1LDMxMTI2LDMxMTI1LDMxMTI0LDMxMTIzLDMxMTI3LDMxMTEyLDMxMTIyLDMxMTIwLDMxMjc1LDMxMzA2LDMxMjgwLDMxMjc5LDMxMjcyLDMxMjcwLDMxNDAwLDMxNDAzLDMxNDA0LDMxNDcwLDMxNjI0LDMxNjQ0LDMxNjI2LDMxNjMzLDMxNjMyLDMxNjM4LDMxNjI5LDMxNjI4LDMxNjQzLDMxNjMwLDMxNjIxLDMxNjQwLDIxMTI0LDMxNjQxLDMxNjUyLDMxNjE4LDMxOTMxLDMxOTM1LDMxOTMyLDMxOTMwLDMyMTY3LDMyMTgzLDMyMTk0LDMyMTYzLDMyMTcwLDMyMTkzLDMyMTkyLDMyMTk3LDMyMTU3LDMyMjA2LDMyMTk2LDMyMTk4LDMyMjAzLDMyMjA0LDMyMTc1LDMyMTg1LDMyMTUwLDMyMTg4LDMyMTU5LDMyMTY2LDMyMTc0LDMyMTY5LDMyMTYxLDMyMjAxLDMyNjI3LDMyNzM4LDMyNzM5LDMyNzQxLDMyNzM0LDMyODA0LDMyODYxLDMyODYwLDMzMTYxLDMzMTU4LDMzMTU1LDMzMTU5LDMzMTY1LDMzMTY0LDMzMTYzLDMzMzAxLDMzOTQzLDMzOTU2LDMzOTUzLDMzOTUxLDMzOTc4LDMzOTk4LDMzOTg2LDMzOTY0LDMzOTY2LDMzOTYzLDMzOTc3LDMzOTcyLDMzOTg1LDMzOTk3LDMzOTYyLDMzOTQ2LDMzOTY5LDM0MDAwLDMzOTQ5LDMzOTU5LDMzOTc5LDMzOTU0LDMzOTQwLDMzOTkxLDMzOTk2LDMzOTQ3LDMzOTYxLDMzOTY3LDMzOTYwLDM0MDA2LDMzOTQ0LDMzOTc0LDMzOTk5LDMzOTUyLDM0MDA3LDM0MDA0LDM0MDAyLDM0MDExLDMzOTY4LDMzOTM3LDM0NDAxLDM0NjExLDM0NTk1LDM0NjAwLDM0NjY3LDM0NjI0LDM0NjA2LDM0NTkwLDM0NTkzLDM0NTg1LDM0NTg3LDM0NjI3LDM0NjA0LDM0NjI1LDM0NjIyLDM0NjMwLDM0NTkyLDM0NjEwLDM0NjAyLDM0NjA1LDM0NjIwLDM0NTc4LDM0NjE4LDM0NjA5LDM0NjEzLDM0NjI2LDM0NTk4LDM0NTk5LDM0NjE2LDM0NTk2LDM0NTg2LDM0NjA4LDM0NTc3LDM1MDYzLDM1MDQ3LDM1MDU3LDM1MDU4LDM1MDY2LDM1MDcwLDM1MDU0LDM1MDY4LDM1MDYyLDM1MDY3LDM1MDU2LDM1MDUyLDM1MDUxLDM1MjI5LDM1MjMzLDM1MjMxLDM1MjMwLDM1MzA1LDM1MzA3LDM1MzA0LDM1NDk5LDM1NDgxLDM1NDY3LDM1NDc0LDM1NDcxLDM1NDc4LDM1OTAxLDM1OTQ0LDM1OTQ1LDM2MDUzLDM2MDQ3LDM2MDU1LDM2MjQ2LDM2MzYxLDM2MzU0LDM2MzUxLDM2MzY1LDM2MzQ5LDM2MzYyLDM2MzU1LDM2MzU5LDM2MzU4LDM2MzU3LDM2MzUwLDM2MzUyLDM2MzU2LDM2NjI0LDM2NjI1LDM2NjIyLDM2NjIxLDM3MTU1LDM3MTQ4LDM3MTUyLDM3MTU0LDM3MTUxLDM3MTQ5LDM3MTQ2LDM3MTU2LDM3MTUzLDM3MTQ3LDM3MjQyLDM3MjM0LDM3MjQxLDM3MjM1LDM3NTQxLDM3NTQwLDM3NDk0LDM3NTMxLDM3NDk4LDM3NTM2LDM3NTI0LDM3NTQ2LDM3NTE3LDM3NTQyLDM3NTMwLDM3NTQ3LDM3NDk3LDM3NTI3LDM3NTAzLDM3NTM5LDM3NjE0LDM3NTE4LDM3NTA2LDM3NTI1LDM3NTM4LDM3NTAxLDM3NTEyLDM3NTM3LDM3NTE0LDM3NTEwLDM3NTE2LDM3NTI5LDM3NTQzLDM3NTAyLDM3NTExLDM3NTQ1LDM3NTMzLDM3NTE1LDM3NDIxLDM4NTU4LDM4NTYxLDM4NjU1LDM4NzQ0LDM4NzgxLDM4Nzc4LDM4NzgyLDM4Nzg3LDM4Nzg0LDM4Nzg2LDM4Nzc5LDM4Nzg4LDM4Nzg1LDM4NzgzLDM4ODYyLDM4ODYxLDM4OTM0LDM5MDg1LDM5MDg2LDM5MTcwLDM5MTY4LDM5MTc1LDM5MzI1LDM5MzI0LDM5MzYzLDM5MzUzLDM5MzU1LDM5MzU0LDM5MzYyLDM5MzU3LDM5MzY3LDM5NjAxLDM5NjUxLDM5NjU1LDM5NzQyLDM5NzQzLDM5Nzc2LDM5Nzc3LDM5Nzc1LDQwMTc3LDQwMTc4LDQwMTgxLDQwNjE1LDIwNzM1LDIwNzM5LDIwNzg0LDIwNzI4LDIwNzQyLDIwNzQzLDIwNzI2LDIwNzM0LDIwNzQ3LDIwNzQ4LDIwNzMzLDIwNzQ2LDIxMTMxLDIxMTMyLDIxMjMzLDIxMjMxLDIyMDg4LDIyMDgyLDIyMDkyLDIyMDY5LDIyMDgxLDIyMDkwLDIyMDg5LDIyMDg2LDIyMTA0LDIyMTA2LDIyMDgwLDIyMDY3LDIyMDc3LDIyMDYwLDIyMDc4LDIyMDcyLDIyMDU4LDIyMDc0LDIyMjk4LDIyNjk5LDIyNjg1LDIyNzA1LDIyNjg4LDIyNjkxLDIyNzAzLDIyNzAwLDIyNjkzLDIyNjg5LDIyNzgzLDIzMjk1LDIzMjg0LDIzMjkzLDIzMjg3LDIzMjg2LDIzMjk5LDIzMjg4LDIzMjk4LDIzMjg5LDIzMjk3LDIzMzAzLDIzMzAxLDIzMzExLDIzNjU1LDIzOTYxLDIzOTU5LDIzOTY3LDIzOTU0LDIzOTcwLDIzOTU1LDIzOTU3LDIzOTY4LDIzOTY0LDIzOTY5LDIzOTYyLDIzOTY2LDI0MTY5LDI0MTU3LDI0MTYwLDI0MTU2LDMyMjQzLDI0MjgzLDI0Mjg2LDI0Mjg5LDI0MzkzLDI0NDk4LDI0OTcxLDI0OTYzLDI0OTUzLDI1MDA5LDI1MDA4LDI0OTk0LDI0OTY5LDI0OTg3LDI0OTc5LDI1MDA3LDI1MDA1LDI0OTkxLDI0OTc4LDI1MDAyLDI0OTkzLDI0OTczLDI0OTM0LDI1MDExLDI1MTMzLDI1NzEwLDI1NzEyLDI1NzUwLDI1NzYwLDI1NzMzLDI1NzUxLDI1NzU2LDI1NzQzLDI1NzM5LDI1NzM4LDI1NzQwLDI1NzYzLDI1NzU5LDI1NzA0LDI1Nzc3LDI1NzUyLDI1OTc0LDI1OTc4LDI1OTc3LDI1OTc5LDI2MDM0LDI2MDM1LDI2MjkzLDI2Mjg4LDI2MjgxLDI2MjkwLDI2Mjk1LDI2MjgyLDI2Mjg3LDI3MTM2LDI3MTQyLDI3MTU5LDI3MTA5LDI3MTI4LDI3MTU3LDI3MTIxLDI3MTA4LDI3MTY4LDI3MTM1LDI3MTE2LDI3MTA2LDI3MTYzLDI3MTY1LDI3MTM0LDI3MTc1LDI3MTIyLDI3MTE4LDI3MTU2LDI3MTI3LDI3MTExLDI3MjAwLDI3MTQ0LDI3MTEwLDI3MTMxLDI3MTQ5LDI3MTMyLDI3MTE1LDI3MTQ1LDI3MTQwLDI3MTYwLDI3MTczLDI3MTUxLDI3MTI2LDI3MTc0LDI3MTQzLDI3MTI0LDI3MTU4LDI3NDczLDI3NTU3LDI3NTU1LDI3NTU0LDI3NTU4LDI3NjQ5LDI3NjQ4LDI3NjQ3LDI3NjUwLDI4NDgxLDI4NDU0LDI4NTQyLDI4NTUxLDI4NjE0LDI4NTYyLDI4NTU3LDI4NTUzLDI4NTU2LDI4NTE0LDI4NDk1LDI4NTQ5LDI4NTA2LDI4NTY2LDI4NTM0LDI4NTI0LDI4NTQ2LDI4NTAxLDI4NTMwLDI4NDk4LDI4NDk2LDI4NTAzLDI4NTY0LDI4NTYzLDI4NTA5LDI4NDE2LDI4NTEzLDI4NTIzLDI4NTQxLDI4NTE5LDI4NTYwLDI4NDk5LDI4NTU1LDI4NTIxLDI4NTQzLDI4NTY1LDI4NTE1LDI4NTM1LDI4NTIyLDI4NTM5LDI5MTA2LDI5MTAzLDI5MDgzLDI5MTA0LDI5MDg4LDI5MDgyLDI5MDk3LDI5MTA5LDI5MDg1LDI5MDkzLDI5MDg2LDI5MDkyLDI5MDg5LDI5MDk4LDI5MDg0LDI5MDk1LDI5MTA3LDI5MzM2LDI5MzM4LDI5NTI4LDI5NTIyLDI5NTM0LDI5NTM1LDI5NTM2LDI5NTMzLDI5NTMxLDI5NTM3LDI5NTMwLDI5NTI5LDI5NTM4LDI5ODMxLDI5ODMzLDI5ODM0LDI5ODMwLDI5ODI1LDI5ODIxLDI5ODI5LDI5ODMyLDI5ODIwLDI5ODE3LDI5OTYwLDI5OTU5LDMwMDc4LDMwMjQ1LDMwMjM4LDMwMjMzLDMwMjM3LDMwMjM2LDMwMjQzLDMwMjM0LDMwMjQ4LDMwMjM1LDMwMzY0LDMwMzY1LDMwMzY2LDMwMzYzLDMwNjA1LDMwNjA3LDMwNjAxLDMwNjAwLDMwOTI1LDMwOTA3LDMwOTI3LDMwOTI0LDMwOTI5LDMwOTI2LDMwOTMyLDMwOTIwLDMwOTE1LDMwOTE2LDMwOTIxLDMxMTMwLDMxMTM3LDMxMTM2LDMxMTMyLDMxMTM4LDMxMTMxLDI3NTEwLDMxMjg5LDMxNDEwLDMxNDEyLDMxNDExLDMxNjcxLDMxNjkxLDMxNjc4LDMxNjYwLDMxNjk0LDMxNjYzLDMxNjczLDMxNjkwLDMxNjY5LDMxOTQxLDMxOTQ0LDMxOTQ4LDMxOTQ3LDMyMjQ3LDMyMjE5LDMyMjM0LDMyMjMxLDMyMjE1LDMyMjI1LDMyMjU5LDMyMjUwLDMyMjMwLDMyMjQ2LDMyMjQxLDMyMjQwLDMyMjM4LDMyMjIzLDMyNjMwLDMyNjg0LDMyNjg4LDMyNjg1LDMyNzQ5LDMyNzQ3LDMyNzQ2LDMyNzQ4LDMyNzQyLDMyNzQ0LDMyODY4LDMyODcxLDMzMTg3LDMzMTgzLDMzMTgyLDMzMTczLDMzMTg2LDMzMTc3LDMzMTc1LDMzMzAyLDMzMzU5LDMzMzYzLDMzMzYyLDMzMzYwLDMzMzU4LDMzMzYxLDM0MDg0LDM0MTA3LDM0MDYzLDM0MDQ4LDM0MDg5LDM0MDYyLDM0MDU3LDM0MDYxLDM0MDc5LDM0MDU4LDM0MDg3LDM0MDc2LDM0MDQzLDM0MDkxLDM0MDQyLDM0MDU2LDM0MDYwLDM0MDM2LDM0MDkwLDM0MDM0LDM0MDY5LDM0MDM5LDM0MDI3LDM0MDM1LDM0MDQ0LDM0MDY2LDM0MDI2LDM0MDI1LDM0MDcwLDM0MDQ2LDM0MDg4LDM0MDc3LDM0MDk0LDM0MDUwLDM0MDQ1LDM0MDc4LDM0MDM4LDM0MDk3LDM0MDg2LDM0MDIzLDM0MDI0LDM0MDMyLDM0MDMxLDM0MDQxLDM0MDcyLDM0MDgwLDM0MDk2LDM0MDU5LDM0MDczLDM0MDk1LDM0NDAyLDM0NjQ2LDM0NjU5LDM0NjYwLDM0Njc5LDM0Nzg1LDM0Njc1LDM0NjQ4LDM0NjQ0LDM0NjUxLDM0NjQyLDM0NjU3LDM0NjUwLDM0NjQxLDM0NjU0LDM0NjY5LDM0NjY2LDM0NjQwLDM0NjM4LDM0NjU1LDM0NjUzLDM0NjcxLDM0NjY4LDM0NjgyLDM0NjcwLDM0NjUyLDM0NjYxLDM0NjM5LDM0NjgzLDM0Njc3LDM0NjU4LDM0NjYzLDM0NjY1LDM0OTA2LDM1MDc3LDM1MDg0LDM1MDkyLDM1MDgzLDM1MDk1LDM1MDk2LDM1MDk3LDM1MDc4LDM1MDk0LDM1MDg5LDM1MDg2LDM1MDgxLDM1MjM0LDM1MjM2LDM1MjM1LDM1MzA5LDM1MzEyLDM1MzA4LDM1NTM1LDM1NTI2LDM1NTEyLDM1NTM5LDM1NTM3LDM1NTQwLDM1NTQxLDM1NTE1LDM1NTQzLDM1NTE4LDM1NTIwLDM1NTI1LDM1NTQ0LDM1NTIzLDM1NTE0LDM1NTE3LDM1NTQ1LDM1OTAyLDM1OTE3LDM1OTgzLDM2MDY5LDM2MDYzLDM2MDU3LDM2MDcyLDM2MDU4LDM2MDYxLDM2MDcxLDM2MjU2LDM2MjUyLDM2MjU3LDM2MjUxLDM2Mzg0LDM2Mzg3LDM2Mzg5LDM2Mzg4LDM2Mzk4LDM2MzczLDM2Mzc5LDM2Mzc0LDM2MzY5LDM2Mzc3LDM2MzkwLDM2MzkxLDM2MzcyLDM2MzcwLDM2Mzc2LDM2MzcxLDM2MzgwLDM2Mzc1LDM2Mzc4LDM2NjUyLDM2NjQ0LDM2NjMyLDM2NjM0LDM2NjQwLDM2NjQzLDM2NjMwLDM2NjMxLDM2OTc5LDM2OTc2LDM2OTc1LDM2OTY3LDM2OTcxLDM3MTY3LDM3MTYzLDM3MTYxLDM3MTYyLDM3MTcwLDM3MTU4LDM3MTY2LDM3MjUzLDM3MjU0LDM3MjU4LDM3MjQ5LDM3MjUwLDM3MjUyLDM3MjQ4LDM3NTg0LDM3NTcxLDM3NTcyLDM3NTY4LDM3NTkzLDM3NTU4LDM3NTgzLDM3NjE3LDM3NTk5LDM3NTkyLDM3NjA5LDM3NTkxLDM3NTk3LDM3NTgwLDM3NjE1LDM3NTcwLDM3NjA4LDM3NTc4LDM3NTc2LDM3NTgyLDM3NjA2LDM3NTgxLDM3NTg5LDM3NTc3LDM3NjAwLDM3NTk4LDM3NjA3LDM3NTg1LDM3NTg3LDM3NTU3LDM3NjAxLDM3NTc0LDM3NTU2LDM4MjY4LDM4MzE2LDM4MzE1LDM4MzE4LDM4MzIwLDM4NTY0LDM4NTYyLDM4NjExLDM4NjYxLDM4NjY0LDM4NjU4LDM4NzQ2LDM4Nzk0LDM4Nzk4LDM4NzkyLDM4ODY0LDM4ODYzLDM4OTQyLDM4OTQxLDM4OTUwLDM4OTUzLDM4OTUyLDM4OTQ0LDM4OTM5LDM4OTUxLDM5MDkwLDM5MTc2LDM5MTYyLDM5MTg1LDM5MTg4LDM5MTkwLDM5MTkxLDM5MTg5LDM5Mzg4LDM5MzczLDM5Mzc1LDM5Mzc5LDM5MzgwLDM5Mzc0LDM5MzY5LDM5MzgyLDM5Mzg0LDM5MzcxLDM5MzgzLDM5MzcyLDM5NjAzLDM5NjYwLDM5NjU5LDM5NjY3LDM5NjY2LDM5NjY1LDM5NzUwLDM5NzQ3LDM5NzgzLDM5Nzk2LDM5NzkzLDM5NzgyLDM5Nzk4LDM5Nzk3LDM5NzkyLDM5Nzg0LDM5NzgwLDM5Nzg4LDQwMTg4LDQwMTg2LDQwMTg5LDQwMTkxLDQwMTgzLDQwMTk5LDQwMTkyLDQwMTg1LDQwMTg3LDQwMjAwLDQwMTk3LDQwMTk2LDQwNTc5LDQwNjU5LDQwNzE5LDQwNzIwLDIwNzY0LDIwNzU1LDIwNzU5LDIwNzYyLDIwNzUzLDIwOTU4LDIxMzAwLDIxNDczLDIyMTI4LDIyMTEyLDIyMTI2LDIyMTMxLDIyMTE4LDIyMTE1LDIyMTI1LDIyMTMwLDIyMTEwLDIyMTM1LDIyMzAwLDIyMjk5LDIyNzI4LDIyNzE3LDIyNzI5LDIyNzE5LDIyNzE0LDIyNzIyLDIyNzE2LDIyNzI2LDIzMzE5LDIzMzIxLDIzMzIzLDIzMzI5LDIzMzE2LDIzMzE1LDIzMzEyLDIzMzE4LDIzMzM2LDIzMzIyLDIzMzI4LDIzMzI2LDIzNTM1LDIzOTgwLDIzOTg1LDIzOTc3LDIzOTc1LDIzOTg5LDIzOTg0LDIzOTgyLDIzOTc4LDIzOTc2LDIzOTg2LDIzOTgxLDIzOTgzLDIzOTg4LDI0MTY3LDI0MTY4LDI0MTY2LDI0MTc1LDI0Mjk3LDI0Mjk1LDI0Mjk0LDI0Mjk2LDI0MjkzLDI0Mzk1LDI0NTA4LDI0OTg5LDI1MDAwLDI0OTgyLDI1MDI5LDI1MDEyLDI1MDMwLDI1MDI1LDI1MDM2LDI1MDE4LDI1MDIzLDI1MDE2LDI0OTcyLDI1ODE1LDI1ODE0LDI1ODA4LDI1ODA3LDI1ODAxLDI1Nzg5LDI1NzM3LDI1Nzk1LDI1ODE5LDI1ODQzLDI1ODE3LDI1OTA3LDI1OTgzLDI1OTgwLDI2MDE4LDI2MzEyLDI2MzAyLDI2MzA0LDI2MzE0LDI2MzE1LDI2MzE5LDI2MzAxLDI2Mjk5LDI2Mjk4LDI2MzE2LDI2NDAzLDI3MTg4LDI3MjM4LDI3MjA5LDI3MjM5LDI3MTg2LDI3MjQwLDI3MTk4LDI3MjI5LDI3MjQ1LDI3MjU0LDI3MjI3LDI3MjE3LDI3MTc2LDI3MjI2LDI3MTk1LDI3MTk5LDI3MjAxLDI3MjQyLDI3MjM2LDI3MjE2LDI3MjE1LDI3MjIwLDI3MjQ3LDI3MjQxLDI3MjMyLDI3MTk2LDI3MjMwLDI3MjIyLDI3MjIxLDI3MjEzLDI3MjE0LDI3MjA2LDI3NDc3LDI3NDc2LDI3NDc4LDI3NTU5LDI3NTYyLDI3NTYzLDI3NTkyLDI3NTkxLDI3NjUyLDI3NjUxLDI3NjU0LDI4NTg5LDI4NjE5LDI4NTc5LDI4NjE1LDI4NjA0LDI4NjIyLDI4NjE2LDI4NTEwLDI4NjEyLDI4NjA1LDI4NTc0LDI4NjE4LDI4NTg0LDI4Njc2LDI4NTgxLDI4NTkwLDI4NjAyLDI4NTg4LDI4NTg2LDI4NjIzLDI4NjA3LDI4NjAwLDI4NTc4LDI4NjE3LDI4NTg3LDI4NjIxLDI4NTkxLDI4NTk0LDI4NTkyLDI5MTI1LDI5MTIyLDI5MTE5LDI5MTEyLDI5MTQyLDI5MTIwLDI5MTIxLDI5MTMxLDI5MTQwLDI5MTMwLDI5MTI3LDI5MTM1LDI5MTE3LDI5MTQ0LDI5MTE2LDI5MTI2LDI5MTQ2LDI5MTQ3LDI5MzQxLDI5MzQyLDI5NTQ1LDI5NTQyLDI5NTQzLDI5NTQ4LDI5NTQxLDI5NTQ3LDI5NTQ2LDI5ODIzLDI5ODUwLDI5ODU2LDI5ODQ0LDI5ODQyLDI5ODQ1LDI5ODU3LDI5OTYzLDMwMDgwLDMwMjU1LDMwMjUzLDMwMjU3LDMwMjY5LDMwMjU5LDMwMjY4LDMwMjYxLDMwMjU4LDMwMjU2LDMwMzk1LDMwNDM4LDMwNjE4LDMwNjIxLDMwNjI1LDMwNjIwLDMwNjE5LDMwNjI2LDMwNjI3LDMwNjEzLDMwNjE3LDMwNjE1LDMwOTQxLDMwOTUzLDMwOTQ5LDMwOTU0LDMwOTQyLDMwOTQ3LDMwOTM5LDMwOTQ1LDMwOTQ2LDMwOTU3LDMwOTQzLDMwOTQ0LDMxMTQwLDMxMzAwLDMxMzA0LDMxMzAzLDMxNDE0LDMxNDE2LDMxNDEzLDMxNDA5LDMxNDE1LDMxNzEwLDMxNzE1LDMxNzE5LDMxNzA5LDMxNzAxLDMxNzE3LDMxNzA2LDMxNzIwLDMxNzM3LDMxNzAwLDMxNzIyLDMxNzE0LDMxNzA4LDMxNzIzLDMxNzA0LDMxNzExLDMxOTU0LDMxOTU2LDMxOTU5LDMxOTUyLDMxOTUzLDMyMjc0LDMyMjg5LDMyMjc5LDMyMjY4LDMyMjg3LDMyMjg4LDMyMjc1LDMyMjcwLDMyMjg0LDMyMjc3LDMyMjgyLDMyMjkwLDMyMjY3LDMyMjcxLDMyMjc4LDMyMjY5LDMyMjc2LDMyMjkzLDMyMjkyLDMyNTc5LDMyNjM1LDMyNjM2LDMyNjM0LDMyNjg5LDMyNzUxLDMyODEwLDMyODA5LDMyODc2LDMzMjAxLDMzMTkwLDMzMTk4LDMzMjA5LDMzMjA1LDMzMTk1LDMzMjAwLDMzMTk2LDMzMjA0LDMzMjAyLDMzMjA3LDMzMTkxLDMzMjY2LDMzMzY1LDMzMzY2LDMzMzY3LDM0MTM0LDM0MTE3LDM0MTU1LDM0MTI1LDM0MTMxLDM0MTQ1LDM0MTM2LDM0MTEyLDM0MTE4LDM0MTQ4LDM0MTEzLDM0MTQ2LDM0MTE2LDM0MTI5LDM0MTE5LDM0MTQ3LDM0MTEwLDM0MTM5LDM0MTYxLDM0MTI2LDM0MTU4LDM0MTY1LDM0MTMzLDM0MTUxLDM0MTQ0LDM0MTg4LDM0MTUwLDM0MTQxLDM0MTMyLDM0MTQ5LDM0MTU2LDM0NDAzLDM0NDA1LDM0NDA0LDM0NzE1LDM0NzAzLDM0NzExLDM0NzA3LDM0NzA2LDM0Njk2LDM0Njg5LDM0NzEwLDM0NzEyLDM0NjgxLDM0Njk1LDM0NzIzLDM0NjkzLDM0NzA0LDM0NzA1LDM0NzE3LDM0NjkyLDM0NzA4LDM0NzE2LDM0NzE0LDM0Njk3LDM1MTAyLDM1MTEwLDM1MTIwLDM1MTE3LDM1MTE4LDM1MTExLDM1MTIxLDM1MTA2LDM1MTEzLDM1MTA3LDM1MTE5LDM1MTE2LDM1MTAzLDM1MzEzLDM1NTUyLDM1NTU0LDM1NTcwLDM1NTcyLDM1NTczLDM1NTQ5LDM1NjA0LDM1NTU2LDM1NTUxLDM1NTY4LDM1NTI4LDM1NTUwLDM1NTUzLDM1NTYwLDM1NTgzLDM1NTY3LDM1NTc5LDM1OTg1LDM1OTg2LDM1OTg0LDM2MDg1LDM2MDc4LDM2MDgxLDM2MDgwLDM2MDgzLDM2MjA0LDM2MjA2LDM2MjYxLDM2MjYzLDM2NDAzLDM2NDE0LDM2NDA4LDM2NDE2LDM2NDIxLDM2NDA2LDM2NDEyLDM2NDEzLDM2NDE3LDM2NDAwLDM2NDE1LDM2NTQxLDM2NjYyLDM2NjU0LDM2NjYxLDM2NjU4LDM2NjY1LDM2NjYzLDM2NjYwLDM2OTgyLDM2OTg1LDM2OTg3LDM2OTk4LDM3MTE0LDM3MTcxLDM3MTczLDM3MTc0LDM3MjY3LDM3MjY0LDM3MjY1LDM3MjYxLDM3MjYzLDM3NjcxLDM3NjYyLDM3NjQwLDM3NjYzLDM3NjM4LDM3NjQ3LDM3NzU0LDM3Njg4LDM3NjkyLDM3NjU5LDM3NjY3LDM3NjUwLDM3NjMzLDM3NzAyLDM3Njc3LDM3NjQ2LDM3NjQ1LDM3NTc5LDM3NjYxLDM3NjI2LDM3NjY5LDM3NjUxLDM3NjI1LDM3NjIzLDM3Njg0LDM3NjM0LDM3NjY4LDM3NjMxLDM3NjczLDM3Njg5LDM3Njg1LDM3Njc0LDM3NjUyLDM3NjQ0LDM3NjQzLDM3NjMwLDM3NjQxLDM3NjMyLDM3NjI3LDM3NjU0LDM4MzMyLDM4MzQ5LDM4MzM0LDM4MzI5LDM4MzMwLDM4MzI2LDM4MzM1LDM4MzI1LDM4MzMzLDM4NTY5LDM4NjEyLDM4NjY3LDM4Njc0LDM4NjcyLDM4ODA5LDM4ODA3LDM4ODA0LDM4ODk2LDM4OTA0LDM4OTY1LDM4OTU5LDM4OTYyLDM5MjA0LDM5MTk5LDM5MjA3LDM5MjA5LDM5MzI2LDM5NDA2LDM5NDA0LDM5Mzk3LDM5Mzk2LDM5NDA4LDM5Mzk1LDM5NDAyLDM5NDAxLDM5Mzk5LDM5NjA5LDM5NjE1LDM5NjA0LDM5NjExLDM5NjcwLDM5Njc0LDM5NjczLDM5NjcxLDM5NzMxLDM5ODA4LDM5ODEzLDM5ODE1LDM5ODA0LDM5ODA2LDM5ODAzLDM5ODEwLDM5ODI3LDM5ODI2LDM5ODI0LDM5ODAyLDM5ODI5LDM5ODA1LDM5ODE2LDQwMjI5LDQwMjE1LDQwMjI0LDQwMjIyLDQwMjEyLDQwMjMzLDQwMjIxLDQwMjE2LDQwMjI2LDQwMjA4LDQwMjE3LDQwMjIzLDQwNTg0LDQwNTgyLDQwNTgzLDQwNjIyLDQwNjIxLDQwNjYxLDQwNjYyLDQwNjk4LDQwNzIyLDQwNzY1LDIwNzc0LDIwNzczLDIwNzcwLDIwNzcyLDIwNzY4LDIwNzc3LDIxMjM2LDIyMTYzLDIyMTU2LDIyMTU3LDIyMTUwLDIyMTQ4LDIyMTQ3LDIyMTQyLDIyMTQ2LDIyMTQzLDIyMTQ1LDIyNzQyLDIyNzQwLDIyNzM1LDIyNzM4LDIzMzQxLDIzMzMzLDIzMzQ2LDIzMzMxLDIzMzQwLDIzMzM1LDIzMzM0LDIzMzQzLDIzMzQyLDIzNDE5LDIzNTM3LDIzNTM4LDIzOTkxLDI0MTcyLDI0MTcwLDI0NTEwLDI0NTA3LDI1MDI3LDI1MDEzLDI1MDIwLDI1MDYzLDI1MDU2LDI1MDYxLDI1MDYwLDI1MDY0LDI1MDU0LDI1ODM5LDI1ODMzLDI1ODI3LDI1ODM1LDI1ODI4LDI1ODMyLDI1OTg1LDI1OTg0LDI2MDM4LDI2MDc0LDI2MzIyLDI3Mjc3LDI3Mjg2LDI3MjY1LDI3MzAxLDI3MjczLDI3Mjk1LDI3MjkxLDI3Mjk3LDI3Mjk0LDI3MjcxLDI3MjgzLDI3Mjc4LDI3Mjg1LDI3MjY3LDI3MzA0LDI3MzAwLDI3MjgxLDI3MjYzLDI3MzAyLDI3MjkwLDI3MjY5LDI3Mjc2LDI3MjgyLDI3NDgzLDI3NTY1LDI3NjU3LDI4NjIwLDI4NTg1LDI4NjYwLDI4NjI4LDI4NjQzLDI4NjM2LDI4NjUzLDI4NjQ3LDI4NjQ2LDI4NjM4LDI4NjU4LDI4NjM3LDI4NjQyLDI4NjQ4LDI5MTUzLDI5MTY5LDI5MTYwLDI5MTcwLDI5MTU2LDI5MTY4LDI5MTU0LDI5NTU1LDI5NTUwLDI5NTUxLDI5ODQ3LDI5ODc0LDI5ODY3LDI5ODQwLDI5ODY2LDI5ODY5LDI5ODczLDI5ODYxLDI5ODcxLDI5OTY4LDI5OTY5LDI5OTcwLDI5OTY3LDMwMDg0LDMwMjc1LDMwMjgwLDMwMjgxLDMwMjc5LDMwMzcyLDMwNDQxLDMwNjQ1LDMwNjM1LDMwNjQyLDMwNjQ3LDMwNjQ2LDMwNjQ0LDMwNjQxLDMwNjMyLDMwNzA0LDMwOTYzLDMwOTczLDMwOTc4LDMwOTcxLDMwOTcyLDMwOTYyLDMwOTgxLDMwOTY5LDMwOTc0LDMwOTgwLDMxMTQ3LDMxMTQ0LDMxMzI0LDMxMzIzLDMxMzE4LDMxMzIwLDMxMzE2LDMxMzIyLDMxNDIyLDMxNDI0LDMxNDI1LDMxNzQ5LDMxNzU5LDMxNzMwLDMxNzQ0LDMxNzQzLDMxNzM5LDMxNzU4LDMxNzMyLDMxNzU1LDMxNzMxLDMxNzQ2LDMxNzUzLDMxNzQ3LDMxNzQ1LDMxNzM2LDMxNzQxLDMxNzUwLDMxNzI4LDMxNzI5LDMxNzYwLDMxNzU0LDMxOTc2LDMyMzAxLDMyMzE2LDMyMzIyLDMyMzA3LDM4OTg0LDMyMzEyLDMyMjk4LDMyMzI5LDMyMzIwLDMyMzI3LDMyMjk3LDMyMzMyLDMyMzA0LDMyMzE1LDMyMzEwLDMyMzI0LDMyMzE0LDMyNTgxLDMyNjM5LDMyNjM4LDMyNjM3LDMyNzU2LDMyNzU0LDMyODEyLDMzMjExLDMzMjIwLDMzMjI4LDMzMjI2LDMzMjIxLDMzMjIzLDMzMjEyLDMzMjU3LDMzMzcxLDMzMzcwLDMzMzcyLDM0MTc5LDM0MTc2LDM0MTkxLDM0MjE1LDM0MTk3LDM0MjA4LDM0MTg3LDM0MjExLDM0MTcxLDM0MjEyLDM0MjAyLDM0MjA2LDM0MTY3LDM0MTcyLDM0MTg1LDM0MjA5LDM0MTcwLDM0MTY4LDM0MTM1LDM0MTkwLDM0MTk4LDM0MTgyLDM0MTg5LDM0MjAxLDM0MjA1LDM0MTc3LDM0MjEwLDM0MTc4LDM0MTg0LDM0MTgxLDM0MTY5LDM0MTY2LDM0MjAwLDM0MTkyLDM0MjA3LDM0NDA4LDM0NzUwLDM0NzMwLDM0NzMzLDM0NzU3LDM0NzM2LDM0NzMyLDM0NzQ1LDM0NzQxLDM0NzQ4LDM0NzM0LDM0NzYxLDM0NzU1LDM0NzU0LDM0NzY0LDM0NzQzLDM0NzM1LDM0NzU2LDM0NzYyLDM0NzQwLDM0NzQyLDM0NzUxLDM0NzQ0LDM0NzQ5LDM0NzgyLDM0NzM4LDM1MTI1LDM1MTIzLDM1MTMyLDM1MTM0LDM1MTM3LDM1MTU0LDM1MTI3LDM1MTM4LDM1MjQ1LDM1MjQ3LDM1MjQ2LDM1MzE0LDM1MzE1LDM1NjE0LDM1NjA4LDM1NjA2LDM1NjAxLDM1NTg5LDM1NTk1LDM1NjE4LDM1NTk5LDM1NjAyLDM1NjA1LDM1NTkxLDM1NTk3LDM1NTkyLDM1NTkwLDM1NjEyLDM1NjAzLDM1NjEwLDM1OTE5LDM1OTUyLDM1OTU0LDM1OTUzLDM1OTUxLDM1OTg5LDM1OTg4LDM2MDg5LDM2MjA3LDM2NDMwLDM2NDI5LDM2NDM1LDM2NDMyLDM2NDI4LDM2NDIzLDM2Njc1LDM2NjcyLDM2OTk3LDM2OTkwLDM3MTc2LDM3Mjc0LDM3MjgyLDM3Mjc1LDM3MjczLDM3Mjc5LDM3MjgxLDM3Mjc3LDM3MjgwLDM3NzkzLDM3NzYzLDM3ODA3LDM3NzMyLDM3NzE4LDM3NzAzLDM3NzU2LDM3NzIwLDM3NzI0LDM3NzUwLDM3NzA1LDM3NzEyLDM3NzEzLDM3NzI4LDM3NzQxLDM3Nzc1LDM3NzA4LDM3NzM4LDM3NzUzLDM3NzE5LDM3NzE3LDM3NzE0LDM3NzExLDM3NzQ1LDM3NzUxLDM3NzU1LDM3NzI5LDM3NzI2LDM3NzMxLDM3NzM1LDM3NzYwLDM3NzEwLDM3NzIxLDM4MzQzLDM4MzM2LDM4MzQ1LDM4MzM5LDM4MzQxLDM4MzI3LDM4NTc0LDM4NTc2LDM4NTcyLDM4Njg4LDM4Njg3LDM4NjgwLDM4Njg1LDM4NjgxLDM4ODEwLDM4ODE3LDM4ODEyLDM4ODE0LDM4ODEzLDM4ODY5LDM4ODY4LDM4ODk3LDM4OTc3LDM4OTgwLDM4OTg2LDM4OTg1LDM4OTgxLDM4OTc5LDM5MjA1LDM5MjExLDM5MjEyLDM5MjEwLDM5MjE5LDM5MjE4LDM5MjE1LDM5MjEzLDM5MjE3LDM5MjE2LDM5MzIwLDM5MzMxLDM5MzI5LDM5NDI2LDM5NDE4LDM5NDEyLDM5NDE1LDM5NDE3LDM5NDE2LDM5NDE0LDM5NDE5LDM5NDIxLDM5NDIyLDM5NDIwLDM5NDI3LDM5NjE0LDM5Njc4LDM5Njc3LDM5NjgxLDM5Njc2LDM5NzUyLDM5ODM0LDM5ODQ4LDM5ODM4LDM5ODM1LDM5ODQ2LDM5ODQxLDM5ODQ1LDM5ODQ0LDM5ODE0LDM5ODQyLDM5ODQwLDM5ODU1LDQwMjQzLDQwMjU3LDQwMjk1LDQwMjQ2LDQwMjM4LDQwMjM5LDQwMjQxLDQwMjQ4LDQwMjQwLDQwMjYxLDQwMjU4LDQwMjU5LDQwMjU0LDQwMjQ3LDQwMjU2LDQwMjUzLDMyNzU3LDQwMjM3LDQwNTg2LDQwNTg1LDQwNTg5LDQwNjI0LDQwNjQ4LDQwNjY2LDQwNjk5LDQwNzAzLDQwNzQwLDQwNzM5LDQwNzM4LDQwNzg4LDQwODY0LDIwNzg1LDIwNzgxLDIwNzgyLDIyMTY4LDIyMTcyLDIyMTY3LDIyMTcwLDIyMTczLDIyMTY5LDIyODk2LDIzMzU2LDIzNjU3LDIzNjU4LDI0MDAwLDI0MTczLDI0MTc0LDI1MDQ4LDI1MDU1LDI1MDY5LDI1MDcwLDI1MDczLDI1MDY2LDI1MDcyLDI1MDY3LDI1MDQ2LDI1MDY1LDI1ODU1LDI1ODYwLDI1ODUzLDI1ODQ4LDI1ODU3LDI1ODU5LDI1ODUyLDI2MDA0LDI2MDc1LDI2MzMwLDI2MzMxLDI2MzI4LDI3MzMzLDI3MzIxLDI3MzI1LDI3MzYxLDI3MzM0LDI3MzIyLDI3MzE4LDI3MzE5LDI3MzM1LDI3MzE2LDI3MzA5LDI3NDg2LDI3NTkzLDI3NjU5LDI4Njc5LDI4Njg0LDI4Njg1LDI4NjczLDI4Njc3LDI4NjkyLDI4Njg2LDI4NjcxLDI4NjcyLDI4NjY3LDI4NzEwLDI4NjY4LDI4NjYzLDI4NjgyLDI5MTg1LDI5MTgzLDI5MTc3LDI5MTg3LDI5MTgxLDI5NTU4LDI5ODgwLDI5ODg4LDI5ODc3LDI5ODg5LDI5ODg2LDI5ODc4LDI5ODgzLDI5ODkwLDI5OTcyLDI5OTcxLDMwMzAwLDMwMzA4LDMwMjk3LDMwMjg4LDMwMjkxLDMwMjk1LDMwMjk4LDMwMzc0LDMwMzk3LDMwNDQ0LDMwNjU4LDMwNjUwLDMwOTc1LDMwOTg4LDMwOTk1LDMwOTk2LDMwOTg1LDMwOTkyLDMwOTk0LDMwOTkzLDMxMTQ5LDMxMTQ4LDMxMzI3LDMxNzcyLDMxNzg1LDMxNzY5LDMxNzc2LDMxNzc1LDMxNzg5LDMxNzczLDMxNzgyLDMxNzg0LDMxNzc4LDMxNzgxLDMxNzkyLDMyMzQ4LDMyMzM2LDMyMzQyLDMyMzU1LDMyMzQ0LDMyMzU0LDMyMzUxLDMyMzM3LDMyMzUyLDMyMzQzLDMyMzM5LDMyNjkzLDMyNjkxLDMyNzU5LDMyNzYwLDMyODg1LDMzMjMzLDMzMjM0LDMzMjMyLDMzMzc1LDMzMzc0LDM0MjI4LDM0MjQ2LDM0MjQwLDM0MjQzLDM0MjQyLDM0MjI3LDM0MjI5LDM0MjM3LDM0MjQ3LDM0MjQ0LDM0MjM5LDM0MjUxLDM0MjU0LDM0MjQ4LDM0MjQ1LDM0MjI1LDM0MjMwLDM0MjU4LDM0MzQwLDM0MjMyLDM0MjMxLDM0MjM4LDM0NDA5LDM0NzkxLDM0NzkwLDM0Nzg2LDM0Nzc5LDM0Nzk1LDM0Nzk0LDM0Nzg5LDM0NzgzLDM0ODAzLDM0Nzg4LDM0NzcyLDM0NzgwLDM0NzcxLDM0Nzk3LDM0Nzc2LDM0Nzg3LDM0NzI0LDM0Nzc1LDM0Nzc3LDM0ODE3LDM0ODA0LDM0NzkyLDM0NzgxLDM1MTU1LDM1MTQ3LDM1MTUxLDM1MTQ4LDM1MTQyLDM1MTUyLDM1MTUzLDM1MTQ1LDM1NjI2LDM1NjIzLDM1NjE5LDM1NjM1LDM1NjMyLDM1NjM3LDM1NjU1LDM1NjMxLDM1NjQ0LDM1NjQ2LDM1NjMzLDM1NjIxLDM1NjM5LDM1NjIyLDM1NjM4LDM1NjMwLDM1NjIwLDM1NjQzLDM1NjQ1LDM1NjQyLDM1OTA2LDM1OTU3LDM1OTkzLDM1OTkyLDM1OTkxLDM2MDk0LDM2MTAwLDM2MDk4LDM2MDk2LDM2NDQ0LDM2NDUwLDM2NDQ4LDM2NDM5LDM2NDM4LDM2NDQ2LDM2NDUzLDM2NDU1LDM2NDQzLDM2NDQyLDM2NDQ5LDM2NDQ1LDM2NDU3LDM2NDM2LDM2Njc4LDM2Njc5LDM2NjgwLDM2NjgzLDM3MTYwLDM3MTc4LDM3MTc5LDM3MTgyLDM3Mjg4LDM3Mjg1LDM3Mjg3LDM3Mjk1LDM3MjkwLDM3ODEzLDM3NzcyLDM3Nzc4LDM3ODE1LDM3Nzg3LDM3Nzg5LDM3NzY5LDM3Nzk5LDM3Nzc0LDM3ODAyLDM3NzkwLDM3Nzk4LDM3NzgxLDM3NzY4LDM3Nzg1LDM3NzkxLDM3NzczLDM3ODA5LDM3Nzc3LDM3ODEwLDM3Nzk2LDM3ODAwLDM3ODEyLDM3Nzk1LDM3Nzk3LDM4MzU0LDM4MzU1LDM4MzUzLDM4NTc5LDM4NjE1LDM4NjE4LDI0MDAyLDM4NjIzLDM4NjE2LDM4NjIxLDM4NjkxLDM4NjkwLDM4NjkzLDM4ODI4LDM4ODMwLDM4ODI0LDM4ODI3LDM4ODIwLDM4ODI2LDM4ODE4LDM4ODIxLDM4ODcxLDM4ODczLDM4ODcwLDM4ODcyLDM4OTA2LDM4OTkyLDM4OTkzLDM4OTk0LDM5MDk2LDM5MjMzLDM5MjI4LDM5MjI2LDM5NDM5LDM5NDM1LDM5NDMzLDM5NDM3LDM5NDI4LDM5NDQxLDM5NDM0LDM5NDI5LDM5NDMxLDM5NDMwLDM5NjE2LDM5NjQ0LDM5Njg4LDM5Njg0LDM5Njg1LDM5NzIxLDM5NzMzLDM5NzU0LDM5NzU2LDM5NzU1LDM5ODc5LDM5ODc4LDM5ODc1LDM5ODcxLDM5ODczLDM5ODYxLDM5ODY0LDM5ODkxLDM5ODYyLDM5ODc2LDM5ODY1LDM5ODY5LDQwMjg0LDQwMjc1LDQwMjcxLDQwMjY2LDQwMjgzLDQwMjY3LDQwMjgxLDQwMjc4LDQwMjY4LDQwMjc5LDQwMjc0LDQwMjc2LDQwMjg3LDQwMjgwLDQwMjgyLDQwNTkwLDQwNTg4LDQwNjcxLDQwNzA1LDQwNzA0LDQwNzI2LDQwNzQxLDQwNzQ3LDQwNzQ2LDQwNzQ1LDQwNzQ0LDQwNzgwLDQwNzg5LDIwNzg4LDIwNzg5LDIxMTQyLDIxMjM5LDIxNDI4LDIyMTg3LDIyMTg5LDIyMTgyLDIyMTgzLDIyMTg2LDIyMTg4LDIyNzQ2LDIyNzQ5LDIyNzQ3LDIyODAyLDIzMzU3LDIzMzU4LDIzMzU5LDI0MDAzLDI0MTc2LDI0NTExLDI1MDgzLDI1ODYzLDI1ODcyLDI1ODY5LDI1ODY1LDI1ODY4LDI1ODcwLDI1OTg4LDI2MDc4LDI2MDc3LDI2MzM0LDI3MzY3LDI3MzYwLDI3MzQwLDI3MzQ1LDI3MzUzLDI3MzM5LDI3MzU5LDI3MzU2LDI3MzQ0LDI3MzcxLDI3MzQzLDI3MzQxLDI3MzU4LDI3NDg4LDI3NTY4LDI3NjYwLDI4Njk3LDI4NzExLDI4NzA0LDI4Njk0LDI4NzE1LDI4NzA1LDI4NzA2LDI4NzA3LDI4NzEzLDI4Njk1LDI4NzA4LDI4NzAwLDI4NzE0LDI5MTk2LDI5MTk0LDI5MTkxLDI5MTg2LDI5MTg5LDI5MzQ5LDI5MzUwLDI5MzQ4LDI5MzQ3LDI5MzQ1LDI5ODk5LDI5ODkzLDI5ODc5LDI5ODkxLDI5OTc0LDMwMzA0LDMwNjY1LDMwNjY2LDMwNjYwLDMwNzA1LDMxMDA1LDMxMDAzLDMxMDA5LDMxMDA0LDMwOTk5LDMxMDA2LDMxMTUyLDMxMzM1LDMxMzM2LDMxNzk1LDMxODA0LDMxODAxLDMxNzg4LDMxODAzLDMxOTgwLDMxOTc4LDMyMzc0LDMyMzczLDMyMzc2LDMyMzY4LDMyMzc1LDMyMzY3LDMyMzc4LDMyMzcwLDMyMzcyLDMyMzYwLDMyNTg3LDMyNTg2LDMyNjQzLDMyNjQ2LDMyNjk1LDMyNzY1LDMyNzY2LDMyODg4LDMzMjM5LDMzMjM3LDMzMzgwLDMzMzc3LDMzMzc5LDM0MjgzLDM0Mjg5LDM0Mjg1LDM0MjY1LDM0MjczLDM0MjgwLDM0MjY2LDM0MjYzLDM0Mjg0LDM0MjkwLDM0Mjk2LDM0MjY0LDM0MjcxLDM0Mjc1LDM0MjY4LDM0MjU3LDM0Mjg4LDM0Mjc4LDM0Mjg3LDM0MjcwLDM0Mjc0LDM0ODE2LDM0ODEwLDM0ODE5LDM0ODA2LDM0ODA3LDM0ODI1LDM0ODI4LDM0ODI3LDM0ODIyLDM0ODEyLDM0ODI0LDM0ODE1LDM0ODI2LDM0ODE4LDM1MTcwLDM1MTYyLDM1MTYzLDM1MTU5LDM1MTY5LDM1MTY0LDM1MTYwLDM1MTY1LDM1MTYxLDM1MjA4LDM1MjU1LDM1MjU0LDM1MzE4LDM1NjY0LDM1NjU2LDM1NjU4LDM1NjQ4LDM1NjY3LDM1NjcwLDM1NjY4LDM1NjU5LDM1NjY5LDM1NjY1LDM1NjUwLDM1NjY2LDM1NjcxLDM1OTA3LDM1OTU5LDM1OTU4LDM1OTk0LDM2MTAyLDM2MTAzLDM2MTA1LDM2MjY4LDM2MjY2LDM2MjY5LDM2MjY3LDM2NDYxLDM2NDcyLDM2NDY3LDM2NDU4LDM2NDYzLDM2NDc1LDM2NTQ2LDM2NjkwLDM2Njg5LDM2Njg3LDM2Njg4LDM2NjkxLDM2Nzg4LDM3MTg0LDM3MTgzLDM3Mjk2LDM3MjkzLDM3ODU0LDM3ODMxLDM3ODM5LDM3ODI2LDM3ODUwLDM3ODQwLDM3ODgxLDM3ODY4LDM3ODM2LDM3ODQ5LDM3ODAxLDM3ODYyLDM3ODM0LDM3ODQ0LDM3ODcwLDM3ODU5LDM3ODQ1LDM3ODI4LDM3ODM4LDM3ODI0LDM3ODQyLDM3ODYzLDM4MjY5LDM4MzYyLDM4MzYzLDM4NjI1LDM4Njk3LDM4Njk5LDM4NzAwLDM4Njk2LDM4Njk0LDM4ODM1LDM4ODM5LDM4ODM4LDM4ODc3LDM4ODc4LDM4ODc5LDM5MDA0LDM5MDAxLDM5MDA1LDM4OTk5LDM5MTAzLDM5MTAxLDM5MDk5LDM5MTAyLDM5MjQwLDM5MjM5LDM5MjM1LDM5MzM0LDM5MzM1LDM5NDUwLDM5NDQ1LDM5NDYxLDM5NDUzLDM5NDYwLDM5NDUxLDM5NDU4LDM5NDU2LDM5NDYzLDM5NDU5LDM5NDU0LDM5NDUyLDM5NDQ0LDM5NjE4LDM5NjkxLDM5NjkwLDM5Njk0LDM5NjkyLDM5NzM1LDM5OTE0LDM5OTE1LDM5OTA0LDM5OTAyLDM5OTA4LDM5OTEwLDM5OTA2LDM5OTIwLDM5ODkyLDM5ODk1LDM5OTE2LDM5OTAwLDM5ODk3LDM5OTA5LDM5ODkzLDM5OTA1LDM5ODk4LDQwMzExLDQwMzIxLDQwMzMwLDQwMzI0LDQwMzI4LDQwMzA1LDQwMzIwLDQwMzEyLDQwMzI2LDQwMzMxLDQwMzMyLDQwMzE3LDQwMjk5LDQwMzA4LDQwMzA5LDQwMzA0LDQwMjk3LDQwMzI1LDQwMzA3LDQwMzE1LDQwMzIyLDQwMzAzLDQwMzEzLDQwMzE5LDQwMzI3LDQwMjk2LDQwNTk2LDQwNTkzLDQwNjQwLDQwNzAwLDQwNzQ5LDQwNzY4LDQwNzY5LDQwNzgxLDQwNzkwLDQwNzkxLDQwNzkyLDIxMzAzLDIyMTk0LDIyMTk3LDIyMTk1LDIyNzU1LDIzMzY1LDI0MDA2LDI0MDA3LDI0MzAyLDI0MzAzLDI0NTEyLDI0NTEzLDI1MDgxLDI1ODc5LDI1ODc4LDI1ODc3LDI1ODc1LDI2MDc5LDI2MzQ0LDI2MzM5LDI2MzQwLDI3Mzc5LDI3Mzc2LDI3MzcwLDI3MzY4LDI3Mzg1LDI3Mzc3LDI3Mzc0LDI3Mzc1LDI4NzMyLDI4NzI1LDI4NzE5LDI4NzI3LDI4NzI0LDI4NzIxLDI4NzM4LDI4NzI4LDI4NzM1LDI4NzMwLDI4NzI5LDI4NzM2LDI4NzMxLDI4NzIzLDI4NzM3LDI5MjAzLDI5MjA0LDI5MzUyLDI5NTY1LDI5NTY0LDI5ODgyLDMwMzc5LDMwMzc4LDMwMzk4LDMwNDQ1LDMwNjY4LDMwNjcwLDMwNjcxLDMwNjY5LDMwNzA2LDMxMDEzLDMxMDExLDMxMDE1LDMxMDE2LDMxMDEyLDMxMDE3LDMxMTU0LDMxMzQyLDMxMzQwLDMxMzQxLDMxNDc5LDMxODE3LDMxODE2LDMxODE4LDMxODE1LDMxODEzLDMxOTgyLDMyMzc5LDMyMzgyLDMyMzg1LDMyMzg0LDMyNjk4LDMyNzY3LDMyODg5LDMzMjQzLDMzMjQxLDMzMjkxLDMzMzg0LDMzMzg1LDM0MzM4LDM0MzAzLDM0MzA1LDM0MzAyLDM0MzMxLDM0MzA0LDM0Mjk0LDM0MzA4LDM0MzEzLDM0MzA5LDM0MzE2LDM0MzAxLDM0ODQxLDM0ODMyLDM0ODMzLDM0ODM5LDM0ODM1LDM0ODM4LDM1MTcxLDM1MTc0LDM1MjU3LDM1MzE5LDM1NjgwLDM1NjkwLDM1Njc3LDM1Njg4LDM1NjgzLDM1Njg1LDM1Njg3LDM1NjkzLDM2MjcwLDM2NDg2LDM2NDg4LDM2NDg0LDM2Njk3LDM2Njk0LDM2Njk1LDM2NjkzLDM2Njk2LDM2Njk4LDM3MDA1LDM3MTg3LDM3MTg1LDM3MzAzLDM3MzAxLDM3Mjk4LDM3Mjk5LDM3ODk5LDM3OTA3LDM3ODgzLDM3OTIwLDM3OTAzLDM3OTA4LDM3ODg2LDM3OTA5LDM3OTA0LDM3OTI4LDM3OTEzLDM3OTAxLDM3ODc3LDM3ODg4LDM3ODc5LDM3ODk1LDM3OTAyLDM3OTEwLDM3OTA2LDM3ODgyLDM3ODk3LDM3ODgwLDM3ODk4LDM3ODg3LDM3ODg0LDM3OTAwLDM3ODc4LDM3OTA1LDM3ODk0LDM4MzY2LDM4MzY4LDM4MzY3LDM4NzAyLDM4NzAzLDM4ODQxLDM4ODQzLDM4OTA5LDM4OTEwLDM5MDA4LDM5MDEwLDM5MDExLDM5MDA3LDM5MTA1LDM5MTA2LDM5MjQ4LDM5MjQ2LDM5MjU3LDM5MjQ0LDM5MjQzLDM5MjUxLDM5NDc0LDM5NDc2LDM5NDczLDM5NDY4LDM5NDY2LDM5NDc4LDM5NDY1LDM5NDcwLDM5NDgwLDM5NDY5LDM5NjIzLDM5NjI2LDM5NjIyLDM5Njk2LDM5Njk4LDM5Njk3LDM5OTQ3LDM5OTQ0LDM5OTI3LDM5OTQxLDM5OTU0LDM5OTI4LDQwMDAwLDM5OTQzLDM5OTUwLDM5OTQyLDM5OTU5LDM5OTU2LDM5OTQ1LDQwMzUxLDQwMzQ1LDQwMzU2LDQwMzQ5LDQwMzM4LDQwMzQ0LDQwMzM2LDQwMzQ3LDQwMzUyLDQwMzQwLDQwMzQ4LDQwMzYyLDQwMzQzLDQwMzUzLDQwMzQ2LDQwMzU0LDQwMzYwLDQwMzUwLDQwMzU1LDQwMzgzLDQwMzYxLDQwMzQyLDQwMzU4LDQwMzU5LDQwNjAxLDQwNjAzLDQwNjAyLDQwNjc3LDQwNjc2LDQwNjc5LDQwNjc4LDQwNzUyLDQwNzUwLDQwNzk1LDQwODAwLDQwNzk4LDQwNzk3LDQwNzkzLDQwODQ5LDIwNzk0LDIwNzkzLDIxMTQ0LDIxMTQzLDIyMjExLDIyMjA1LDIyMjA2LDIzMzY4LDIzMzY3LDI0MDExLDI0MDE1LDI0MzA1LDI1MDg1LDI1ODgzLDI3Mzk0LDI3Mzg4LDI3Mzk1LDI3Mzg0LDI3MzkyLDI4NzM5LDI4NzQwLDI4NzQ2LDI4NzQ0LDI4NzQ1LDI4NzQxLDI4NzQyLDI5MjEzLDI5MjEwLDI5MjA5LDI5NTY2LDI5OTc1LDMwMzE0LDMwNjcyLDMxMDIxLDMxMDI1LDMxMDIzLDMxODI4LDMxODI3LDMxOTg2LDMyMzk0LDMyMzkxLDMyMzkyLDMyMzk1LDMyMzkwLDMyMzk3LDMyNTg5LDMyNjk5LDMyODE2LDMzMjQ1LDM0MzI4LDM0MzQ2LDM0MzQyLDM0MzM1LDM0MzM5LDM0MzMyLDM0MzI5LDM0MzQzLDM0MzUwLDM0MzM3LDM0MzM2LDM0MzQ1LDM0MzM0LDM0MzQxLDM0ODU3LDM0ODQ1LDM0ODQzLDM0ODQ4LDM0ODUyLDM0ODQ0LDM0ODU5LDM0ODkwLDM1MTgxLDM1MTc3LDM1MTgyLDM1MTc5LDM1MzIyLDM1NzA1LDM1NzA0LDM1NjUzLDM1NzA2LDM1NzA3LDM2MTEyLDM2MTE2LDM2MjcxLDM2NDk0LDM2NDkyLDM2NzAyLDM2Njk5LDM2NzAxLDM3MTkwLDM3MTg4LDM3MTg5LDM3MzA1LDM3OTUxLDM3OTQ3LDM3OTQyLDM3OTI5LDM3OTQ5LDM3OTQ4LDM3OTM2LDM3OTQ1LDM3OTMwLDM3OTQzLDM3OTMyLDM3OTUyLDM3OTM3LDM4MzczLDM4MzcyLDM4MzcxLDM4NzA5LDM4NzE0LDM4ODQ3LDM4ODgxLDM5MDEyLDM5MTEzLDM5MTEwLDM5MTA0LDM5MjU2LDM5MjU0LDM5NDgxLDM5NDg1LDM5NDk0LDM5NDkyLDM5NDkwLDM5NDg5LDM5NDgyLDM5NDg3LDM5NjI5LDM5NzAxLDM5NzAzLDM5NzA0LDM5NzAyLDM5NzM4LDM5NzYyLDM5OTc5LDM5OTY1LDM5OTY0LDM5OTgwLDM5OTcxLDM5OTc2LDM5OTc3LDM5OTcyLDM5OTY5LDQwMzc1LDQwMzc0LDQwMzgwLDQwMzg1LDQwMzkxLDQwMzk0LDQwMzk5LDQwMzgyLDQwMzg5LDQwMzg3LDQwMzc5LDQwMzczLDQwMzk4LDQwMzc3LDQwMzc4LDQwMzY0LDQwMzkyLDQwMzY5LDQwMzY1LDQwMzk2LDQwMzcxLDQwMzk3LDQwMzcwLDQwNTcwLDQwNjA0LDQwNjgzLDQwNjg2LDQwNjg1LDQwNzMxLDQwNzI4LDQwNzMwLDQwNzUzLDQwNzgyLDQwODA1LDQwODA0LDQwODUwLDIwMTUzLDIyMjE0LDIyMjEzLDIyMjE5LDIyODk3LDIzMzcxLDIzMzcyLDI0MDIxLDI0MDE3LDI0MzA2LDI1ODg5LDI1ODg4LDI1ODk0LDI1ODkwLDI3NDAzLDI3NDAwLDI3NDAxLDI3NjYxLDI4NzU3LDI4NzU4LDI4NzU5LDI4NzU0LDI5MjE0LDI5MjE1LDI5MzUzLDI5NTY3LDI5OTEyLDI5OTA5LDI5OTEzLDI5OTExLDMwMzE3LDMwMzgxLDMxMDI5LDMxMTU2LDMxMzQ0LDMxMzQ1LDMxODMxLDMxODM2LDMxODMzLDMxODM1LDMxODM0LDMxOTg4LDMxOTg1LDMyNDAxLDMyNTkxLDMyNjQ3LDMzMjQ2LDMzMzg3LDM0MzU2LDM0MzU3LDM0MzU1LDM0MzQ4LDM0MzU0LDM0MzU4LDM0ODYwLDM0ODU2LDM0ODU0LDM0ODU4LDM0ODUzLDM1MTg1LDM1MjYzLDM1MjYyLDM1MzIzLDM1NzEwLDM1NzE2LDM1NzE0LDM1NzE4LDM1NzE3LDM1NzExLDM2MTE3LDM2NTAxLDM2NTAwLDM2NTA2LDM2NDk4LDM2NDk2LDM2NTAyLDM2NTAzLDM2NzA0LDM2NzA2LDM3MTkxLDM3OTY0LDM3OTY4LDM3OTYyLDM3OTYzLDM3OTY3LDM3OTU5LDM3OTU3LDM3OTYwLDM3OTYxLDM3OTU4LDM4NzE5LDM4ODgzLDM5MDE4LDM5MDE3LDM5MTE1LDM5MjUyLDM5MjU5LDM5NTAyLDM5NTA3LDM5NTA4LDM5NTAwLDM5NTAzLDM5NDk2LDM5NDk4LDM5NDk3LDM5NTA2LDM5NTA0LDM5NjMyLDM5NzA1LDM5NzIzLDM5NzM5LDM5NzY2LDM5NzY1LDQwMDA2LDQwMDA4LDM5OTk5LDQwMDA0LDM5OTkzLDM5OTg3LDQwMDAxLDM5OTk2LDM5OTkxLDM5OTg4LDM5OTg2LDM5OTk3LDM5OTkwLDQwNDExLDQwNDAyLDQwNDE0LDQwNDEwLDQwMzk1LDQwNDAwLDQwNDEyLDQwNDAxLDQwNDE1LDQwNDI1LDQwNDA5LDQwNDA4LDQwNDA2LDQwNDM3LDQwNDA1LDQwNDEzLDQwNjMwLDQwNjg4LDQwNzU3LDQwNzU1LDQwNzU0LDQwNzcwLDQwODExLDQwODUzLDQwODY2LDIwNzk3LDIxMTQ1LDIyNzYwLDIyNzU5LDIyODk4LDIzMzczLDI0MDI0LDM0ODYzLDI0Mzk5LDI1MDg5LDI1MDkxLDI1MDkyLDI1ODk3LDI1ODkzLDI2MDA2LDI2MzQ3LDI3NDA5LDI3NDEwLDI3NDA3LDI3NTk0LDI4NzYzLDI4NzYyLDI5MjE4LDI5NTcwLDI5NTY5LDI5NTcxLDMwMzIwLDMwNjc2LDMxODQ3LDMxODQ2LDMyNDA1LDMzMzg4LDM0MzYyLDM0MzY4LDM0MzYxLDM0MzY0LDM0MzUzLDM0MzYzLDM0MzY2LDM0ODY0LDM0ODY2LDM0ODYyLDM0ODY3LDM1MTkwLDM1MTg4LDM1MTg3LDM1MzI2LDM1NzI0LDM1NzI2LDM1NzIzLDM1NzIwLDM1OTA5LDM2MTIxLDM2NTA0LDM2NzA4LDM2NzA3LDM3MzA4LDM3OTg2LDM3OTczLDM3OTgxLDM3OTc1LDM3OTgyLDM4ODUyLDM4ODUzLDM4OTEyLDM5NTEwLDM5NTEzLDM5NzEwLDM5NzExLDM5NzEyLDQwMDE4LDQwMDI0LDQwMDE2LDQwMDEwLDQwMDEzLDQwMDExLDQwMDIxLDQwMDI1LDQwMDEyLDQwMDE0LDQwNDQzLDQwNDM5LDQwNDMxLDQwNDE5LDQwNDI3LDQwNDQwLDQwNDIwLDQwNDM4LDQwNDE3LDQwNDMwLDQwNDIyLDQwNDM0LDQwNDMyLDQwNDE4LDQwNDI4LDQwNDM2LDQwNDM1LDQwNDI0LDQwNDI5LDQwNjQyLDQwNjU2LDQwNjkwLDQwNjkxLDQwNzEwLDQwNzMyLDQwNzYwLDQwNzU5LDQwNzU4LDQwNzcxLDQwNzgzLDQwODE3LDQwODE2LDQwODE0LDQwODE1LDIyMjI3LDIyMjIxLDIzMzc0LDIzNjYxLDI1OTAxLDI2MzQ5LDI2MzUwLDI3NDExLDI4NzY3LDI4NzY5LDI4NzY1LDI4NzY4LDI5MjE5LDI5OTE1LDI5OTI1LDMwNjc3LDMxMDMyLDMxMTU5LDMxMTU4LDMxODUwLDMyNDA3LDMyNjQ5LDMzMzg5LDM0MzcxLDM0ODcyLDM0ODcxLDM0ODY5LDM0ODkxLDM1NzMyLDM1NzMzLDM2NTEwLDM2NTExLDM2NTEyLDM2NTA5LDM3MzEwLDM3MzA5LDM3MzE0LDM3OTk1LDM3OTkyLDM3OTkzLDM4NjI5LDM4NzI2LDM4NzIzLDM4NzI3LDM4ODU1LDM4ODg1LDM5NTE4LDM5NjM3LDM5NzY5LDQwMDM1LDQwMDM5LDQwMDM4LDQwMDM0LDQwMDMwLDQwMDMyLDQwNDUwLDQwNDQ2LDQwNDU1LDQwNDUxLDQwNDU0LDQwNDUzLDQwNDQ4LDQwNDQ5LDQwNDU3LDQwNDQ3LDQwNDQ1LDQwNDUyLDQwNjA4LDQwNzM0LDQwNzc0LDQwODIwLDQwODIxLDQwODIyLDIyMjI4LDI1OTAyLDI2MDQwLDI3NDE2LDI3NDE3LDI3NDE1LDI3NDE4LDI4NzcwLDI5MjIyLDI5MzU0LDMwNjgwLDMwNjgxLDMxMDMzLDMxODQ5LDMxODUxLDMxOTkwLDMyNDEwLDMyNDA4LDMyNDExLDMyNDA5LDMzMjQ4LDMzMjQ5LDM0Mzc0LDM0Mzc1LDM0Mzc2LDM1MTkzLDM1MTk0LDM1MTk2LDM1MTk1LDM1MzI3LDM1NzM2LDM1NzM3LDM2NTE3LDM2NTE2LDM2NTE1LDM3OTk4LDM3OTk3LDM3OTk5LDM4MDAxLDM4MDAzLDM4NzI5LDM5MDI2LDM5MjYzLDQwMDQwLDQwMDQ2LDQwMDQ1LDQwNDU5LDQwNDYxLDQwNDY0LDQwNDYzLDQwNDY2LDQwNDY1LDQwNjA5LDQwNjkzLDQwNzEzLDQwNzc1LDQwODI0LDQwODI3LDQwODI2LDQwODI1LDIyMzAyLDI4Nzc0LDMxODU1LDM0ODc2LDM2Mjc0LDM2NTE4LDM3MzE1LDM4MDA0LDM4MDA4LDM4MDA2LDM4MDA1LDM5NTIwLDQwMDUyLDQwMDUxLDQwMDQ5LDQwMDUzLDQwNDY4LDQwNDY3LDQwNjk0LDQwNzE0LDQwODY4LDI4Nzc2LDI4NzczLDMxOTkxLDM0NDEwLDM0ODc4LDM0ODc3LDM0ODc5LDM1NzQyLDM1OTk2LDM2NTIxLDM2NTUzLDM4NzMxLDM5MDI3LDM5MDI4LDM5MTE2LDM5MjY1LDM5MzM5LDM5NTI0LDM5NTI2LDM5NTI3LDM5NzE2LDQwNDY5LDQwNDcxLDQwNzc2LDI1MDk1LDI3NDIyLDI5MjIzLDM0MzgwLDM2NTIwLDM4MDE4LDM4MDE2LDM4MDE3LDM5NTI5LDM5NTI4LDM5NzI2LDQwNDczLDI5MjI1LDM0Mzc5LDM1NzQzLDM4MDE5LDQwMDU3LDQwNjMxLDMwMzI1LDM5NTMxLDQwMDU4LDQwNDc3LDI4Nzc3LDI4Nzc4LDQwNjEyLDQwODMwLDQwNzc3LDQwODU2LDMwODQ5LDM3NTYxLDM1MDIzLDIyNzE1LDI0NjU4LDMxOTExLDIzMjkwLDk1NTYsOTU3NCw5NTU5LDk1NjgsOTU4MCw5NTcxLDk1NjIsOTU3Nyw5NTY1LDk1NTQsOTU3Miw5NTU3LDk1NjYsOTU3OCw5NTY5LDk1NjAsOTU3NSw5NTYzLDk1NTUsOTU3Myw5NTU4LDk1NjcsOTU3OSw5NTcwLDk1NjEsOTU3Niw5NTY0LDk1NTMsOTU1Miw5NTgxLDk1ODIsOTU4NCw5NTgzLDY1NTE3LDEzMjQyMywzNzU5NSwxMzI1NzUsMTQ3Mzk3LDM0MTI0LDE3MDc3LDI5Njc5LDIwOTE3LDEzODk3LDE0OTgyNiwxNjYzNzIsMzc3MDAsMTM3NjkxLDMzNTE4LDE0NjYzMiwzMDc4MCwyNjQzNiwyNTMxMSwxNDk4MTEsMTY2MzE0LDEzMTc0NCwxNTg2NDMsMTM1OTQxLDIwMzk1LDE0MDUyNSwyMDQ4OCwxNTkwMTcsMTYyNDM2LDE0NDg5NiwxNTAxOTMsMTQwNTYzLDIwNTIxLDEzMTk2NiwyNDQ4NCwxMzE5NjgsMTMxOTExLDI4Mzc5LDEzMjEyNywyMDYwNSwyMDczNywxMzQzNCwyMDc1MCwzOTAyMCwxNDE0NywzMzgxNCwxNDk5MjQsMTMyMjMxLDIwODMyLDE0NDMwOCwyMDg0MiwxMzQxNDMsMTM5NTE2LDEzMTgxMywxNDA1OTIsMTMyNDk0LDE0MzkyMywxMzc2MDMsMjM0MjYsMzQ2ODUsMTMyNTMxLDE0NjU4NSwyMDkxNCwyMDkyMCw0MDI0NCwyMDkzNywyMDk0MywyMDk0NSwxNTU4MCwyMDk0NywxNTAxODIsMjA5MTUsMjA5NjIsMjEzMTQsMjA5NzMsMzM3NDEsMjY5NDIsMTQ1MTk3LDI0NDQzLDIxMDAzLDIxMDMwLDIxMDUyLDIxMTczLDIxMDc5LDIxMTQwLDIxMTc3LDIxMTg5LDMxNzY1LDM0MTE0LDIxMjE2LDM0MzE3LDE1ODQ4MywyMTI1MywxNjY2MjIsMjE4MzMsMjgzNzcsMTQ3MzI4LDEzMzQ2MCwxNDc0MzYsMjEyOTksMjEzMTYsMTM0MTE0LDI3ODUxLDEzNjk5OCwyNjY1MSwyOTY1MywyNDY1MCwxNjA0MiwxNDU0MCwxMzY5MzYsMjkxNDksMTc1NzAsMjEzNTcsMjEzNjQsMTY1NTQ3LDIxMzc0LDIxMzc1LDEzNjU5OCwxMzY3MjMsMzA2OTQsMjEzOTUsMTY2NTU1LDIxNDA4LDIxNDE5LDIxNDIyLDI5NjA3LDE1MzQ1OCwxNjIxNywyOTU5NiwyMTQ0MSwyMTQ0NSwyNzcyMSwyMDA0MSwyMjUyNiwyMTQ2NSwxNTAxOSwxMzQwMzEsMjE0NzIsMTQ3NDM1LDE0Mjc1NSwyMTQ5NCwxMzQyNjMsMjE1MjMsMjg3OTMsMjE4MDMsMjYxOTksMjc5OTUsMjE2MTMsMTU4NTQ3LDEzNDUxNiwyMTg1MywyMTY0NywyMTY2OCwxODM0MiwxMzY5NzMsMTM0ODc3LDE1Nzk2LDEzNDQ3NywxNjYzMzIsMTQwOTUyLDIxODMxLDE5NjkzLDIxNTUxLDI5NzE5LDIxODk0LDIxOTI5LDIyMDIxLDEzNzQzMSwxNDc1MTQsMTc3NDYsMTQ4NTMzLDI2MjkxLDEzNTM0OCwyMjA3MSwyNjMxNywxNDQwMTAsMjYyNzYsMjYyODUsMjIwOTMsMjIwOTUsMzA5NjEsMjIyNTcsMzg3OTEsMjE1MDIsMjIyNzIsMjIyNTUsMjIyNTMsMTY2NzU4LDEzODU5LDEzNTc1OSwyMjM0MiwxNDc4NzcsMjc3NTgsMjg4MTEsMjIzMzgsMTQwMDEsMTU4ODQ2LDIyNTAyLDEzNjIxNCwyMjUzMSwxMzYyNzYsMTQ4MzIzLDIyNTY2LDE1MDUxNywyMjYyMCwyMjY5OCwxMzY2NSwyMjc1MiwyMjc0OCwxMzU3NDAsMjI3NzksMjM1NTEsMjIzMzksMTcyMzY4LDE0ODA4OCwzNzg0MywxMzcyOSwyMjgxNSwyNjc5MCwxNDAxOSwyODI0OSwxMzY3NjYsMjMwNzYsMjE4NDMsMTM2ODUwLDM0MDUzLDIyOTg1LDEzNDQ3OCwxNTg4NDksMTU5MDE4LDEzNzE4MCwyMzAwMSwxMzcyMTEsMTM3MTM4LDE1OTE0MiwyODAxNywxMzcyNTYsMTM2OTE3LDIzMDMzLDE1OTMwMSwyMzIxMSwyMzEzOSwxNDA1NCwxNDk5MjksMjMxNTksMTQwODgsMjMxOTAsMjk3OTcsMjMyNTEsMTU5NjQ5LDE0MDYyOCwxNTc0OSwxMzc0ODksMTQxMzAsMTM2ODg4LDI0MTk1LDIxMjAwLDIzNDE0LDI1OTkyLDIzNDIwLDE2MjMxOCwxNjM4OCwxODUyNSwxMzE1ODgsMjM1MDksMjQ5MjgsMTM3NzgwLDE1NDA2MCwxMzI1MTcsMjM1MzksMjM0NTMsMTk3MjgsMjM1NTcsMTM4MDUyLDIzNTcxLDI5NjQ2LDIzNTcyLDEzODQwNSwxNTg1MDQsMjM2MjUsMTg2NTMsMjM2ODUsMjM3ODUsMjM3OTEsMjM5NDcsMTM4NzQ1LDEzODgwNywyMzgyNCwyMzgzMiwyMzg3OCwxMzg5MTYsMjM3MzgsMjQwMjMsMzM1MzIsMTQzODEsMTQ5NzYxLDEzOTMzNywxMzk2MzUsMzM0MTUsMTQzOTAsMTUyOTgsMjQxMTAsMjcyNzQsMjQxODEsMjQxODYsMTQ4NjY4LDEzNDM1NSwyMTQxNCwyMDE1MSwyNDI3MiwyMTQxNiwxMzcwNzMsMjQwNzMsMjQzMDgsMTY0OTk0LDI0MzEzLDI0MzE1LDE0NDk2LDI0MzE2LDI2Njg2LDM3OTE1LDI0MzMzLDEzMTUyMSwxOTQ3MDgsMTUwNzAsMTg2MDYsMTM1OTk0LDI0Mzc4LDE1NzgzMiwxNDAyNDAsMjQ0MDgsMTQwNDAxLDI0NDE5LDM4ODQ1LDE1OTM0MiwyNDQzNCwzNzY5NiwxNjY0NTQsMjQ0ODcsMjM5OTAsMTU3MTEsMTUyMTQ0LDEzOTExNCwxNTk5OTIsMTQwOTA0LDM3MzM0LDEzMTc0MiwxNjY0NDEsMjQ2MjUsMjYyNDUsMTM3MzM1LDE0NjkxLDE1ODE1LDEzODgxLDIyNDE2LDE0MTIzNiwzMTA4OSwxNTkzNiwyNDczNCwyNDc0MCwyNDc1NSwxNDk4OTAsMTQ5OTAzLDE2MjM4NywyOTg2MCwyMDcwNSwyMzIwMCwyNDkzMiwzMzgyOCwyNDg5OCwxOTQ3MjYsMTU5NDQyLDI0OTYxLDIwOTgwLDEzMjY5NCwyNDk2NywyMzQ2NiwxNDczODMsMTQxNDA3LDI1MDQzLDE2NjgxMywxNzAzMzMsMjUwNDAsMTQ2NDIsMTQxNjk2LDE0MTUwNSwyNDYxMSwyNDkyNCwyNTg4NiwyNTQ4MywxMzEzNTIsMjUyODUsMTM3MDcyLDI1MzAxLDE0Mjg2MSwyNTQ1MiwxNDk5ODMsMTQ4NzEsMjU2NTYsMjU1OTIsMTM2MDc4LDEzNzIxMiwyNTc0NCwyODU1NCwxNDI5MDIsMzg5MzIsMTQ3NTk2LDE1MzM3MywyNTgyNSwyNTgyOSwzODAxMSwxNDk1MCwyNTY1OCwxNDkzNSwyNTkzMywyODQzOCwxNTAwNTYsMTUwMDUxLDI1OTg5LDI1OTY1LDI1OTUxLDE0MzQ4NiwyNjAzNywxNDk4MjQsMTkyNTUsMjYwNjUsMTY2MDAsMTM3MjU3LDI2MDgwLDI2MDgzLDI0NTQzLDE0NDM4NCwyNjEzNiwxNDM4NjMsMTQzODY0LDI2MTgwLDE0Mzc4MCwxNDM3ODEsMjYxODcsMTM0NzczLDI2MjE1LDE1MjAzOCwyNjIyNywyNjIyOCwxMzg4MTMsMTQzOTIxLDE2NTM2NCwxNDM4MTYsMTUyMzM5LDMwNjYxLDE0MTU1OSwzOTMzMiwyNjM3MCwxNDgzODAsMTUwMDQ5LDE1MTQ3LDI3MTMwLDE0NTM0NiwyNjQ2MiwyNjQ3MSwyNjQ2NiwxNDc5MTcsMTY4MTczLDI2NTgzLDE3NjQxLDI2NjU4LDI4MjQwLDM3NDM2LDI2NjI1LDE0NDM1OCwxNTkxMzYsMjY3MTcsMTQ0NDk1LDI3MTA1LDI3MTQ3LDE2NjYyMywyNjk5NSwyNjgxOSwxNDQ4NDUsMjY4ODEsMjY4ODAsMTU2NjYsMTQ4NDksMTQ0OTU2LDE1MjMyLDI2NTQwLDI2OTc3LDE2NjQ3NCwxNzE0OCwyNjkzNCwyNzAzMiwxNTI2NSwxMzIwNDEsMzM2MzUsMjA2MjQsMjcxMjksMTQ0OTg1LDEzOTU2MiwyNzIwNSwxNDUxNTUsMjcyOTMsMTUzNDcsMjY1NDUsMjczMzYsMTY4MzQ4LDE1MzczLDI3NDIxLDEzMzQxMSwyNDc5OCwyNzQ0NSwyNzUwOCwxNDEyNjEsMjgzNDEsMTQ2MTM5LDEzMjAyMSwxMzc1NjAsMTQxNDQsMjE1MzcsMTQ2MjY2LDI3NjE3LDE0NzE5NiwyNzYxMiwyNzcwMywxNDA0MjcsMTQ5NzQ1LDE1ODU0NSwyNzczOCwzMzMxOCwyNzc2OSwxNDY4NzYsMTc2MDUsMTQ2ODc3LDE0Nzg3NiwxNDk3NzIsMTQ5NzYwLDE0NjYzMywxNDA1MywxNTU5NSwxMzQ0NTAsMzk4MTEsMTQzODY1LDE0MDQzMywzMjY1NSwyNjY3OSwxNTkwMTMsMTU5MTM3LDE1OTIxMSwyODA1NCwyNzk5NiwyODI4NCwyODQyMCwxNDk4ODcsMTQ3NTg5LDE1OTM0NiwzNDA5OSwxNTk2MDQsMjA5MzUsMjc4MDQsMjgxODksMzM4MzgsMTY2Njg5LDI4MjA3LDE0Njk5MSwyOTc3OSwxNDczMzAsMzExODAsMjgyMzksMjMxODUsMTQzNDM1LDI4NjY0LDE0MDkzLDI4NTczLDE0Njk5MiwyODQxMCwxMzYzNDMsMTQ3NTE3LDE3NzQ5LDM3ODcyLDI4NDg0LDI4NTA4LDE1Njk0LDI4NTMyLDE2ODMwNCwxNTY3NSwyODU3NSwxNDc3ODAsMjg2MjcsMTQ3NjAxLDE0Nzc5NywxNDc1MTMsMTQ3NDQwLDE0NzM4MCwxNDc3NzUsMjA5NTksMTQ3Nzk4LDE0Nzc5OSwxNDc3NzYsMTU2MTI1LDI4NzQ3LDI4Nzk4LDI4ODM5LDI4ODAxLDI4ODc2LDI4ODg1LDI4ODg2LDI4ODk1LDE2NjQ0LDE1ODQ4LDI5MTA4LDI5MDc4LDE0ODA4NywyODk3MSwyODk5NywyMzE3NiwyOTAwMiwyOTAzOCwyMzcwOCwxNDgzMjUsMjkwMDcsMzc3MzAsMTQ4MTYxLDI4OTcyLDE0ODU3MCwxNTAwNTUsMTUwMDUwLDI5MTE0LDE2Njg4OCwyODg2MSwyOTE5OCwzNzk1NCwyOTIwNSwyMjgwMSwzNzk1NSwyOTIyMCwzNzY5NywxNTMwOTMsMjkyMzAsMjkyNDgsMTQ5ODc2LDI2ODEzLDI5MjY5LDI5MjcxLDE1OTU3LDE0MzQyOCwyNjYzNywyODQ3NywyOTMxNCwyOTQ4MiwyOTQ4MywxNDk1MzksMTY1OTMxLDE4NjY5LDE2NTg5MiwyOTQ4MCwyOTQ4NiwyOTY0NywyOTYxMCwxMzQyMDIsMTU4MjU0LDI5NjQxLDI5NzY5LDE0NzkzOCwxMzY5MzUsMTUwMDUyLDI2MTQ3LDE0MDIxLDE0OTk0MywxNDk5MDEsMTUwMDExLDI5Njg3LDI5NzE3LDI2ODgzLDE1MDA1NCwyOTc1MywxMzI1NDcsMTYwODcsMjk3ODgsMTQxNDg1LDI5NzkyLDE2NzYwMiwyOTc2NywyOTY2OCwyOTgxNCwzMzcyMSwyOTgwNCwxNDEyOCwyOTgxMiwzNzg3MywyNzE4MCwyOTgyNiwxODc3MSwxNTAxNTYsMTQ3ODA3LDE1MDEzNywxNjY3OTksMjMzNjYsMTY2OTE1LDEzNzM3NCwyOTg5NiwxMzc2MDgsMjk5NjYsMjk5MjksMjk5ODIsMTY3NjQxLDEzNzgwMywyMzUxMSwxNjc1OTYsMzc3NjUsMzAwMjksMzAwMjYsMzAwNTUsMzAwNjIsMTUxNDI2LDE2MTMyLDE1MDgwMywzMDA5NCwyOTc4OSwzMDExMCwzMDEzMiwzMDIxMCwzMDI1MiwzMDI4OSwzMDI4NywzMDMxOSwzMDMyNiwxNTY2NjEsMzAzNTIsMzMyNjMsMTQzMjgsMTU3OTY5LDE1Nzk2NiwzMDM2OSwzMDM3MywzMDM5MSwzMDQxMiwxNTk2NDcsMzM4OTAsMTUxNzA5LDE1MTkzMywxMzg3ODAsMzA0OTQsMzA1MDIsMzA1MjgsMjU3NzUsMTUyMDk2LDMwNTUyLDE0NDA0NCwzMDYzOSwxNjYyNDQsMTY2MjQ4LDEzNjg5NywzMDcwOCwzMDcyOSwxMzYwNTQsMTUwMDM0LDI2ODI2LDMwODk1LDMwOTE5LDMwOTMxLDM4NTY1LDMxMDIyLDE1MzA1NiwzMDkzNSwzMTAyOCwzMDg5NywxNjEyOTIsMzY3OTIsMzQ5NDgsMTY2Njk5LDE1NTc3OSwxNDA4MjgsMzExMTAsMzUwNzIsMjY4ODIsMzExMDQsMTUzNjg3LDMxMTMzLDE2MjYxNywzMTAzNiwzMTE0NSwyODIwMiwxNjAwMzgsMTYwNDAsMzExNzQsMTY4MjA1LDMxMTg4XSxcbiAgXCJldWMta3JcIjpbNDQwMzQsNDQwMzUsNDQwMzcsNDQwMzgsNDQwNDMsNDQwNDQsNDQwNDUsNDQwNDYsNDQwNDcsNDQwNTYsNDQwNjIsNDQwNjMsNDQwNjUsNDQwNjYsNDQwNjcsNDQwNjksNDQwNzAsNDQwNzEsNDQwNzIsNDQwNzMsNDQwNzQsNDQwNzUsNDQwNzgsNDQwODIsNDQwODMsNDQwODQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQwODUsNDQwODYsNDQwODcsNDQwOTAsNDQwOTEsNDQwOTMsNDQwOTQsNDQwOTUsNDQwOTcsNDQwOTgsNDQwOTksNDQxMDAsNDQxMDEsNDQxMDIsNDQxMDMsNDQxMDQsNDQxMDUsNDQxMDYsNDQxMDgsNDQxMTAsNDQxMTEsNDQxMTIsNDQxMTMsNDQxMTQsNDQxMTUsNDQxMTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQxMTgsNDQxMTksNDQxMjEsNDQxMjIsNDQxMjMsNDQxMjUsNDQxMjYsNDQxMjcsNDQxMjgsNDQxMjksNDQxMzAsNDQxMzEsNDQxMzIsNDQxMzMsNDQxMzQsNDQxMzUsNDQxMzYsNDQxMzcsNDQxMzgsNDQxMzksNDQxNDAsNDQxNDEsNDQxNDIsNDQxNDMsNDQxNDYsNDQxNDcsNDQxNDksNDQxNTAsNDQxNTMsNDQxNTUsNDQxNTYsNDQxNTcsNDQxNTgsNDQxNTksNDQxNjIsNDQxNjcsNDQxNjgsNDQxNzMsNDQxNzQsNDQxNzUsNDQxNzcsNDQxNzgsNDQxNzksNDQxODEsNDQxODIsNDQxODMsNDQxODQsNDQxODUsNDQxODYsNDQxODcsNDQxOTAsNDQxOTQsNDQxOTUsNDQxOTYsNDQxOTcsNDQxOTgsNDQxOTksNDQyMDMsNDQyMDUsNDQyMDYsNDQyMDksNDQyMTAsNDQyMTEsNDQyMTIsNDQyMTMsNDQyMTQsNDQyMTUsNDQyMTgsNDQyMjIsNDQyMjMsNDQyMjQsNDQyMjYsNDQyMjcsNDQyMjksNDQyMzAsNDQyMzEsNDQyMzMsNDQyMzQsNDQyMzUsNDQyMzcsNDQyMzgsNDQyMzksNDQyNDAsNDQyNDEsNDQyNDIsNDQyNDMsNDQyNDQsNDQyNDYsNDQyNDgsNDQyNDksNDQyNTAsNDQyNTEsNDQyNTIsNDQyNTMsNDQyNTQsNDQyNTUsNDQyNTgsNDQyNTksNDQyNjEsNDQyNjIsNDQyNjUsNDQyNjcsNDQyNjksNDQyNzAsNDQyNzQsNDQyNzYsNDQyNzksNDQyODAsNDQyODEsNDQyODIsNDQyODMsNDQyODYsNDQyODcsNDQyODksNDQyOTAsNDQyOTEsNDQyOTMsNDQyOTUsNDQyOTYsNDQyOTcsNDQyOTgsNDQyOTksNDQzMDIsNDQzMDQsNDQzMDYsNDQzMDcsNDQzMDgsNDQzMDksNDQzMTAsNDQzMTEsNDQzMTMsNDQzMTQsNDQzMTUsNDQzMTcsNDQzMTgsNDQzMTksNDQzMjEsNDQzMjIsNDQzMjMsNDQzMjQsNDQzMjUsNDQzMjYsNDQzMjcsNDQzMjgsNDQzMzAsNDQzMzEsNDQzMzQsNDQzMzUsNDQzMzYsNDQzMzcsNDQzMzgsNDQzMzksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQzNDIsNDQzNDMsNDQzNDUsNDQzNDYsNDQzNDcsNDQzNDksNDQzNTAsNDQzNTEsNDQzNTIsNDQzNTMsNDQzNTQsNDQzNTUsNDQzNTgsNDQzNjAsNDQzNjIsNDQzNjMsNDQzNjQsNDQzNjUsNDQzNjYsNDQzNjcsNDQzNjksNDQzNzAsNDQzNzEsNDQzNzMsNDQzNzQsNDQzNzUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQzNzcsNDQzNzgsNDQzNzksNDQzODAsNDQzODEsNDQzODIsNDQzODMsNDQzODQsNDQzODYsNDQzODgsNDQzODksNDQzOTAsNDQzOTEsNDQzOTIsNDQzOTMsNDQzOTQsNDQzOTUsNDQzOTgsNDQzOTksNDQ0MDEsNDQ0MDIsNDQ0MDcsNDQ0MDgsNDQ0MDksNDQ0MTAsNDQ0MTQsNDQ0MTYsNDQ0MTksNDQ0MjAsNDQ0MjEsNDQ0MjIsNDQ0MjMsNDQ0MjYsNDQ0MjcsNDQ0MjksNDQ0MzAsNDQ0MzEsNDQ0MzMsNDQ0MzQsNDQ0MzUsNDQ0MzYsNDQ0MzcsNDQ0MzgsNDQ0MzksNDQ0NDAsNDQ0NDEsNDQ0NDIsNDQ0NDMsNDQ0NDYsNDQ0NDcsNDQ0NDgsNDQ0NDksNDQ0NTAsNDQ0NTEsNDQ0NTMsNDQ0NTQsNDQ0NTUsNDQ0NTYsNDQ0NTcsNDQ0NTgsNDQ0NTksNDQ0NjAsNDQ0NjEsNDQ0NjIsNDQ0NjMsNDQ0NjQsNDQ0NjUsNDQ0NjYsNDQ0NjcsNDQ0NjgsNDQ0NjksNDQ0NzAsNDQ0NzIsNDQ0NzMsNDQ0NzQsNDQ0NzUsNDQ0NzYsNDQ0NzcsNDQ0NzgsNDQ0NzksNDQ0ODIsNDQ0ODMsNDQ0ODUsNDQ0ODYsNDQ0ODcsNDQ0ODksNDQ0OTAsNDQ0OTEsNDQ0OTIsNDQ0OTMsNDQ0OTQsNDQ0OTUsNDQ0OTgsNDQ1MDAsNDQ1MDEsNDQ1MDIsNDQ1MDMsNDQ1MDQsNDQ1MDUsNDQ1MDYsNDQ1MDcsNDQ1MDksNDQ1MTAsNDQ1MTEsNDQ1MTMsNDQ1MTQsNDQ1MTUsNDQ1MTcsNDQ1MTgsNDQ1MTksNDQ1MjAsNDQ1MjEsNDQ1MjIsNDQ1MjMsNDQ1MjQsNDQ1MjUsNDQ1MjYsNDQ1MjcsNDQ1MjgsNDQ1MjksNDQ1MzAsNDQ1MzEsNDQ1MzIsNDQ1MzMsNDQ1MzQsNDQ1MzUsNDQ1MzgsNDQ1MzksNDQ1NDEsNDQ1NDIsNDQ1NDYsNDQ1NDcsNDQ1NDgsNDQ1NDksNDQ1NTAsNDQ1NTEsNDQ1NTQsNDQ1NTYsNDQ1NTgsNDQ1NTksNDQ1NjAsNDQ1NjEsNDQ1NjIsNDQ1NjMsNDQ1NjUsNDQ1NjYsNDQ1NjcsNDQ1NjgsNDQ1NjksNDQ1NzAsNDQ1NzEsNDQ1NzIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ1NzMsNDQ1NzQsNDQ1NzUsNDQ1NzYsNDQ1NzcsNDQ1NzgsNDQ1NzksNDQ1ODAsNDQ1ODEsNDQ1ODIsNDQ1ODMsNDQ1ODQsNDQ1ODUsNDQ1ODYsNDQ1ODcsNDQ1ODgsNDQ1ODksNDQ1OTAsNDQ1OTEsNDQ1OTQsNDQ1OTUsNDQ1OTcsNDQ1OTgsNDQ2MDEsNDQ2MDMsNDQ2MDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ2MDUsNDQ2MDYsNDQ2MDcsNDQ2MTAsNDQ2MTIsNDQ2MTUsNDQ2MTYsNDQ2MTcsNDQ2MTksNDQ2MjMsNDQ2MjUsNDQ2MjYsNDQ2MjcsNDQ2MjksNDQ2MzEsNDQ2MzIsNDQ2MzMsNDQ2MzQsNDQ2MzUsNDQ2MzgsNDQ2NDIsNDQ2NDMsNDQ2NDQsNDQ2NDYsNDQ2NDcsNDQ2NTAsNDQ2NTEsNDQ2NTMsNDQ2NTQsNDQ2NTUsNDQ2NTcsNDQ2NTgsNDQ2NTksNDQ2NjAsNDQ2NjEsNDQ2NjIsNDQ2NjMsNDQ2NjYsNDQ2NzAsNDQ2NzEsNDQ2NzIsNDQ2NzMsNDQ2NzQsNDQ2NzUsNDQ2NzgsNDQ2NzksNDQ2ODAsNDQ2ODEsNDQ2ODIsNDQ2ODMsNDQ2ODUsNDQ2ODYsNDQ2ODcsNDQ2ODgsNDQ2ODksNDQ2OTAsNDQ2OTEsNDQ2OTIsNDQ2OTMsNDQ2OTQsNDQ2OTUsNDQ2OTYsNDQ2OTcsNDQ2OTgsNDQ2OTksNDQ3MDAsNDQ3MDEsNDQ3MDIsNDQ3MDMsNDQ3MDQsNDQ3MDUsNDQ3MDYsNDQ3MDcsNDQ3MDgsNDQ3MDksNDQ3MTAsNDQ3MTEsNDQ3MTIsNDQ3MTMsNDQ3MTQsNDQ3MTUsNDQ3MTYsNDQ3MTcsNDQ3MTgsNDQ3MTksNDQ3MjAsNDQ3MjEsNDQ3MjIsNDQ3MjMsNDQ3MjQsNDQ3MjUsNDQ3MjYsNDQ3MjcsNDQ3MjgsNDQ3MjksNDQ3MzAsNDQ3MzEsNDQ3MzUsNDQ3MzcsNDQ3MzgsNDQ3MzksNDQ3NDEsNDQ3NDIsNDQ3NDMsNDQ3NDQsNDQ3NDUsNDQ3NDYsNDQ3NDcsNDQ3NTAsNDQ3NTQsNDQ3NTUsNDQ3NTYsNDQ3NTcsNDQ3NTgsNDQ3NTksNDQ3NjIsNDQ3NjMsNDQ3NjUsNDQ3NjYsNDQ3NjcsNDQ3NjgsNDQ3NjksNDQ3NzAsNDQ3NzEsNDQ3NzIsNDQ3NzMsNDQ3NzQsNDQ3NzUsNDQ3NzcsNDQ3NzgsNDQ3ODAsNDQ3ODIsNDQ3ODMsNDQ3ODQsNDQ3ODUsNDQ3ODYsNDQ3ODcsNDQ3ODksNDQ3OTAsNDQ3OTEsNDQ3OTMsNDQ3OTQsNDQ3OTUsNDQ3OTcsNDQ3OTgsNDQ3OTksNDQ4MDAsNDQ4MDEsNDQ4MDIsNDQ4MDMsNDQ4MDQsNDQ4MDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ4MDYsNDQ4MDksNDQ4MTAsNDQ4MTEsNDQ4MTIsNDQ4MTQsNDQ4MTUsNDQ4MTcsNDQ4MTgsNDQ4MTksNDQ4MjAsNDQ4MjEsNDQ4MjIsNDQ4MjMsNDQ4MjQsNDQ4MjUsNDQ4MjYsNDQ4MjcsNDQ4MjgsNDQ4MjksNDQ4MzAsNDQ4MzEsNDQ4MzIsNDQ4MzMsNDQ4MzQsNDQ4MzUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ4MzYsNDQ4MzcsNDQ4MzgsNDQ4MzksNDQ4NDAsNDQ4NDEsNDQ4NDIsNDQ4NDMsNDQ4NDYsNDQ4NDcsNDQ4NDksNDQ4NTEsNDQ4NTMsNDQ4NTQsNDQ4NTUsNDQ4NTYsNDQ4NTcsNDQ4NTgsNDQ4NTksNDQ4NjIsNDQ4NjQsNDQ4NjgsNDQ4NjksNDQ4NzAsNDQ4NzEsNDQ4NzQsNDQ4NzUsNDQ4NzYsNDQ4NzcsNDQ4NzgsNDQ4NzksNDQ4ODEsNDQ4ODIsNDQ4ODMsNDQ4ODQsNDQ4ODUsNDQ4ODYsNDQ4ODcsNDQ4ODgsNDQ4ODksNDQ4OTAsNDQ4OTEsNDQ4OTQsNDQ4OTUsNDQ4OTYsNDQ4OTcsNDQ4OTgsNDQ4OTksNDQ5MDIsNDQ5MDMsNDQ5MDQsNDQ5MDUsNDQ5MDYsNDQ5MDcsNDQ5MDgsNDQ5MDksNDQ5MTAsNDQ5MTEsNDQ5MTIsNDQ5MTMsNDQ5MTQsNDQ5MTUsNDQ5MTYsNDQ5MTcsNDQ5MTgsNDQ5MTksNDQ5MjAsNDQ5MjIsNDQ5MjMsNDQ5MjQsNDQ5MjUsNDQ5MjYsNDQ5MjcsNDQ5MjksNDQ5MzAsNDQ5MzEsNDQ5MzMsNDQ5MzQsNDQ5MzUsNDQ5MzcsNDQ5MzgsNDQ5MzksNDQ5NDAsNDQ5NDEsNDQ5NDIsNDQ5NDMsNDQ5NDYsNDQ5NDcsNDQ5NDgsNDQ5NTAsNDQ5NTEsNDQ5NTIsNDQ5NTMsNDQ5NTQsNDQ5NTUsNDQ5NTcsNDQ5NTgsNDQ5NTksNDQ5NjAsNDQ5NjEsNDQ5NjIsNDQ5NjMsNDQ5NjQsNDQ5NjUsNDQ5NjYsNDQ5NjcsNDQ5NjgsNDQ5NjksNDQ5NzAsNDQ5NzEsNDQ5NzIsNDQ5NzMsNDQ5NzQsNDQ5NzUsNDQ5NzYsNDQ5NzcsNDQ5NzgsNDQ5NzksNDQ5ODAsNDQ5ODEsNDQ5ODIsNDQ5ODMsNDQ5ODYsNDQ5ODcsNDQ5ODksNDQ5OTAsNDQ5OTEsNDQ5OTMsNDQ5OTQsNDQ5OTUsNDQ5OTYsNDQ5OTcsNDQ5OTgsNDUwMDIsNDUwMDQsNDUwMDcsNDUwMDgsNDUwMDksNDUwMTAsNDUwMTEsNDUwMTMsNDUwMTQsNDUwMTUsNDUwMTYsNDUwMTcsNDUwMTgsNDUwMTksNDUwMjEsNDUwMjIsNDUwMjMsNDUwMjQsNDUwMjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUwMjYsNDUwMjcsNDUwMjgsNDUwMjksNDUwMzAsNDUwMzEsNDUwMzQsNDUwMzUsNDUwMzYsNDUwMzcsNDUwMzgsNDUwMzksNDUwNDIsNDUwNDMsNDUwNDUsNDUwNDYsNDUwNDcsNDUwNDksNDUwNTAsNDUwNTEsNDUwNTIsNDUwNTMsNDUwNTQsNDUwNTUsNDUwNTgsNDUwNTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUwNjEsNDUwNjIsNDUwNjMsNDUwNjQsNDUwNjUsNDUwNjYsNDUwNjcsNDUwNjksNDUwNzAsNDUwNzEsNDUwNzMsNDUwNzQsNDUwNzUsNDUwNzcsNDUwNzgsNDUwNzksNDUwODAsNDUwODEsNDUwODIsNDUwODMsNDUwODYsNDUwODcsNDUwODgsNDUwODksNDUwOTAsNDUwOTEsNDUwOTIsNDUwOTMsNDUwOTQsNDUwOTUsNDUwOTcsNDUwOTgsNDUwOTksNDUxMDAsNDUxMDEsNDUxMDIsNDUxMDMsNDUxMDQsNDUxMDUsNDUxMDYsNDUxMDcsNDUxMDgsNDUxMDksNDUxMTAsNDUxMTEsNDUxMTIsNDUxMTMsNDUxMTQsNDUxMTUsNDUxMTYsNDUxMTcsNDUxMTgsNDUxMTksNDUxMjAsNDUxMjEsNDUxMjIsNDUxMjMsNDUxMjYsNDUxMjcsNDUxMjksNDUxMzEsNDUxMzMsNDUxMzUsNDUxMzYsNDUxMzcsNDUxMzgsNDUxNDIsNDUxNDQsNDUxNDYsNDUxNDcsNDUxNDgsNDUxNTAsNDUxNTEsNDUxNTIsNDUxNTMsNDUxNTQsNDUxNTUsNDUxNTYsNDUxNTcsNDUxNTgsNDUxNTksNDUxNjAsNDUxNjEsNDUxNjIsNDUxNjMsNDUxNjQsNDUxNjUsNDUxNjYsNDUxNjcsNDUxNjgsNDUxNjksNDUxNzAsNDUxNzEsNDUxNzIsNDUxNzMsNDUxNzQsNDUxNzUsNDUxNzYsNDUxNzcsNDUxNzgsNDUxNzksNDUxODIsNDUxODMsNDUxODUsNDUxODYsNDUxODcsNDUxODksNDUxOTAsNDUxOTEsNDUxOTIsNDUxOTMsNDUxOTQsNDUxOTUsNDUxOTgsNDUyMDAsNDUyMDIsNDUyMDMsNDUyMDQsNDUyMDUsNDUyMDYsNDUyMDcsNDUyMTEsNDUyMTMsNDUyMTQsNDUyMTksNDUyMjAsNDUyMjEsNDUyMjIsNDUyMjMsNDUyMjYsNDUyMzIsNDUyMzQsNDUyMzgsNDUyMzksNDUyNDEsNDUyNDIsNDUyNDMsNDUyNDUsNDUyNDYsNDUyNDcsNDUyNDgsNDUyNDksNDUyNTAsNDUyNTEsNDUyNTQsNDUyNTgsNDUyNTksNDUyNjAsNDUyNjEsNDUyNjIsNDUyNjMsNDUyNjYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUyNjcsNDUyNjksNDUyNzAsNDUyNzEsNDUyNzMsNDUyNzQsNDUyNzUsNDUyNzYsNDUyNzcsNDUyNzgsNDUyNzksNDUyODEsNDUyODIsNDUyODMsNDUyODQsNDUyODYsNDUyODcsNDUyODgsNDUyODksNDUyOTAsNDUyOTEsNDUyOTIsNDUyOTMsNDUyOTQsNDUyOTUsNDUyOTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUyOTcsNDUyOTgsNDUyOTksNDUzMDAsNDUzMDEsNDUzMDIsNDUzMDMsNDUzMDQsNDUzMDUsNDUzMDYsNDUzMDcsNDUzMDgsNDUzMDksNDUzMTAsNDUzMTEsNDUzMTIsNDUzMTMsNDUzMTQsNDUzMTUsNDUzMTYsNDUzMTcsNDUzMTgsNDUzMTksNDUzMjIsNDUzMjUsNDUzMjYsNDUzMjcsNDUzMjksNDUzMzIsNDUzMzMsNDUzMzQsNDUzMzUsNDUzMzgsNDUzNDIsNDUzNDMsNDUzNDQsNDUzNDUsNDUzNDYsNDUzNTAsNDUzNTEsNDUzNTMsNDUzNTQsNDUzNTUsNDUzNTcsNDUzNTgsNDUzNTksNDUzNjAsNDUzNjEsNDUzNjIsNDUzNjMsNDUzNjYsNDUzNzAsNDUzNzEsNDUzNzIsNDUzNzMsNDUzNzQsNDUzNzUsNDUzNzgsNDUzNzksNDUzODEsNDUzODIsNDUzODMsNDUzODUsNDUzODYsNDUzODcsNDUzODgsNDUzODksNDUzOTAsNDUzOTEsNDUzOTQsNDUzOTUsNDUzOTgsNDUzOTksNDU0MDEsNDU0MDIsNDU0MDMsNDU0MDUsNDU0MDYsNDU0MDcsNDU0MDksNDU0MTAsNDU0MTEsNDU0MTIsNDU0MTMsNDU0MTQsNDU0MTUsNDU0MTYsNDU0MTcsNDU0MTgsNDU0MTksNDU0MjAsNDU0MjEsNDU0MjIsNDU0MjMsNDU0MjQsNDU0MjUsNDU0MjYsNDU0MjcsNDU0MjgsNDU0MjksNDU0MzAsNDU0MzEsNDU0MzQsNDU0MzUsNDU0MzcsNDU0MzgsNDU0MzksNDU0NDEsNDU0NDMsNDU0NDQsNDU0NDUsNDU0NDYsNDU0NDcsNDU0NTAsNDU0NTIsNDU0NTQsNDU0NTUsNDU0NTYsNDU0NTcsNDU0NjEsNDU0NjIsNDU0NjMsNDU0NjUsNDU0NjYsNDU0NjcsNDU0NjksNDU0NzAsNDU0NzEsNDU0NzIsNDU0NzMsNDU0NzQsNDU0NzUsNDU0NzYsNDU0NzcsNDU0NzgsNDU0NzksNDU0ODEsNDU0ODIsNDU0ODMsNDU0ODQsNDU0ODUsNDU0ODYsNDU0ODcsNDU0ODgsNDU0ODksNDU0OTAsNDU0OTEsNDU0OTIsNDU0OTMsNDU0OTQsNDU0OTUsNDU0OTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU0OTcsNDU0OTgsNDU0OTksNDU1MDAsNDU1MDEsNDU1MDIsNDU1MDMsNDU1MDQsNDU1MDUsNDU1MDYsNDU1MDcsNDU1MDgsNDU1MDksNDU1MTAsNDU1MTEsNDU1MTIsNDU1MTMsNDU1MTQsNDU1MTUsNDU1MTcsNDU1MTgsNDU1MTksNDU1MjEsNDU1MjIsNDU1MjMsNDU1MjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU1MjYsNDU1MjcsNDU1MjgsNDU1MjksNDU1MzAsNDU1MzEsNDU1MzQsNDU1MzYsNDU1MzcsNDU1MzgsNDU1MzksNDU1NDAsNDU1NDEsNDU1NDIsNDU1NDMsNDU1NDYsNDU1NDcsNDU1NDksNDU1NTAsNDU1NTEsNDU1NTMsNDU1NTQsNDU1NTUsNDU1NTYsNDU1NTcsNDU1NTgsNDU1NTksNDU1NjAsNDU1NjIsNDU1NjQsNDU1NjYsNDU1NjcsNDU1NjgsNDU1NjksNDU1NzAsNDU1NzEsNDU1NzQsNDU1NzUsNDU1NzcsNDU1NzgsNDU1ODEsNDU1ODIsNDU1ODMsNDU1ODQsNDU1ODUsNDU1ODYsNDU1ODcsNDU1OTAsNDU1OTIsNDU1OTQsNDU1OTUsNDU1OTYsNDU1OTcsNDU1OTgsNDU1OTksNDU2MDEsNDU2MDIsNDU2MDMsNDU2MDQsNDU2MDUsNDU2MDYsNDU2MDcsNDU2MDgsNDU2MDksNDU2MTAsNDU2MTEsNDU2MTIsNDU2MTMsNDU2MTQsNDU2MTUsNDU2MTYsNDU2MTcsNDU2MTgsNDU2MTksNDU2MjEsNDU2MjIsNDU2MjMsNDU2MjQsNDU2MjUsNDU2MjYsNDU2MjcsNDU2MjksNDU2MzAsNDU2MzEsNDU2MzIsNDU2MzMsNDU2MzQsNDU2MzUsNDU2MzYsNDU2MzcsNDU2MzgsNDU2MzksNDU2NDAsNDU2NDEsNDU2NDIsNDU2NDMsNDU2NDQsNDU2NDUsNDU2NDYsNDU2NDcsNDU2NDgsNDU2NDksNDU2NTAsNDU2NTEsNDU2NTIsNDU2NTMsNDU2NTQsNDU2NTUsNDU2NTcsNDU2NTgsNDU2NTksNDU2NjEsNDU2NjIsNDU2NjMsNDU2NjUsNDU2NjYsNDU2NjcsNDU2NjgsNDU2NjksNDU2NzAsNDU2NzEsNDU2NzQsNDU2NzUsNDU2NzYsNDU2NzcsNDU2NzgsNDU2NzksNDU2ODAsNDU2ODEsNDU2ODIsNDU2ODMsNDU2ODYsNDU2ODcsNDU2ODgsNDU2ODksNDU2OTAsNDU2OTEsNDU2OTMsNDU2OTQsNDU2OTUsNDU2OTYsNDU2OTcsNDU2OTgsNDU2OTksNDU3MDIsNDU3MDMsNDU3MDQsNDU3MDYsNDU3MDcsNDU3MDgsNDU3MDksNDU3MTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU3MTEsNDU3MTQsNDU3MTUsNDU3MTcsNDU3MTgsNDU3MTksNDU3MjMsNDU3MjQsNDU3MjUsNDU3MjYsNDU3MjcsNDU3MzAsNDU3MzIsNDU3MzUsNDU3MzYsNDU3MzcsNDU3MzksNDU3NDEsNDU3NDIsNDU3NDMsNDU3NDUsNDU3NDYsNDU3NDcsNDU3NDksNDU3NTAsNDU3NTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU3NTIsNDU3NTMsNDU3NTQsNDU3NTUsNDU3NTYsNDU3NTcsNDU3NTgsNDU3NTksNDU3NjAsNDU3NjEsNDU3NjIsNDU3NjMsNDU3NjQsNDU3NjUsNDU3NjYsNDU3NjcsNDU3NzAsNDU3NzEsNDU3NzMsNDU3NzQsNDU3NzUsNDU3NzcsNDU3NzksNDU3ODAsNDU3ODEsNDU3ODIsNDU3ODMsNDU3ODYsNDU3ODgsNDU3OTAsNDU3OTEsNDU3OTIsNDU3OTMsNDU3OTUsNDU3OTksNDU4MDEsNDU4MDIsNDU4MDgsNDU4MDksNDU4MTAsNDU4MTQsNDU4MjAsNDU4MjEsNDU4MjIsNDU4MjYsNDU4MjcsNDU4MjksNDU4MzAsNDU4MzEsNDU4MzMsNDU4MzQsNDU4MzUsNDU4MzYsNDU4MzcsNDU4MzgsNDU4MzksNDU4NDIsNDU4NDYsNDU4NDcsNDU4NDgsNDU4NDksNDU4NTAsNDU4NTEsNDU4NTMsNDU4NTQsNDU4NTUsNDU4NTYsNDU4NTcsNDU4NTgsNDU4NTksNDU4NjAsNDU4NjEsNDU4NjIsNDU4NjMsNDU4NjQsNDU4NjUsNDU4NjYsNDU4NjcsNDU4NjgsNDU4NjksNDU4NzAsNDU4NzEsNDU4NzIsNDU4NzMsNDU4NzQsNDU4NzUsNDU4NzYsNDU4NzcsNDU4NzgsNDU4NzksNDU4ODAsNDU4ODEsNDU4ODIsNDU4ODMsNDU4ODQsNDU4ODUsNDU4ODYsNDU4ODcsNDU4ODgsNDU4ODksNDU4OTAsNDU4OTEsNDU4OTIsNDU4OTMsNDU4OTQsNDU4OTUsNDU4OTYsNDU4OTcsNDU4OTgsNDU4OTksNDU5MDAsNDU5MDEsNDU5MDIsNDU5MDMsNDU5MDQsNDU5MDUsNDU5MDYsNDU5MDcsNDU5MTEsNDU5MTMsNDU5MTQsNDU5MTcsNDU5MjAsNDU5MjEsNDU5MjIsNDU5MjMsNDU5MjYsNDU5MjgsNDU5MzAsNDU5MzIsNDU5MzMsNDU5MzUsNDU5MzgsNDU5MzksNDU5NDEsNDU5NDIsNDU5NDMsNDU5NDUsNDU5NDYsNDU5NDcsNDU5NDgsNDU5NDksNDU5NTAsNDU5NTEsNDU5NTQsNDU5NTgsNDU5NTksNDU5NjAsNDU5NjEsNDU5NjIsNDU5NjMsNDU5NjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU5NjYsNDU5NjcsNDU5NjksNDU5NzAsNDU5NzEsNDU5NzMsNDU5NzQsNDU5NzUsNDU5NzYsNDU5NzcsNDU5NzgsNDU5NzksNDU5ODAsNDU5ODEsNDU5ODIsNDU5ODMsNDU5ODYsNDU5ODcsNDU5ODgsNDU5ODksNDU5OTAsNDU5OTEsNDU5OTMsNDU5OTQsNDU5OTUsNDU5OTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU5OTgsNDU5OTksNDYwMDAsNDYwMDEsNDYwMDIsNDYwMDMsNDYwMDQsNDYwMDUsNDYwMDYsNDYwMDcsNDYwMDgsNDYwMDksNDYwMTAsNDYwMTEsNDYwMTIsNDYwMTMsNDYwMTQsNDYwMTUsNDYwMTYsNDYwMTcsNDYwMTgsNDYwMTksNDYwMjIsNDYwMjMsNDYwMjUsNDYwMjYsNDYwMjksNDYwMzEsNDYwMzMsNDYwMzQsNDYwMzUsNDYwMzgsNDYwNDAsNDYwNDIsNDYwNDQsNDYwNDYsNDYwNDcsNDYwNDksNDYwNTAsNDYwNTEsNDYwNTMsNDYwNTQsNDYwNTUsNDYwNTcsNDYwNTgsNDYwNTksNDYwNjAsNDYwNjEsNDYwNjIsNDYwNjMsNDYwNjQsNDYwNjUsNDYwNjYsNDYwNjcsNDYwNjgsNDYwNjksNDYwNzAsNDYwNzEsNDYwNzIsNDYwNzMsNDYwNzQsNDYwNzUsNDYwNzcsNDYwNzgsNDYwNzksNDYwODAsNDYwODEsNDYwODIsNDYwODMsNDYwODQsNDYwODUsNDYwODYsNDYwODcsNDYwODgsNDYwODksNDYwOTAsNDYwOTEsNDYwOTIsNDYwOTMsNDYwOTQsNDYwOTUsNDYwOTcsNDYwOTgsNDYwOTksNDYxMDAsNDYxMDEsNDYxMDIsNDYxMDMsNDYxMDUsNDYxMDYsNDYxMDcsNDYxMDksNDYxMTAsNDYxMTEsNDYxMTMsNDYxMTQsNDYxMTUsNDYxMTYsNDYxMTcsNDYxMTgsNDYxMTksNDYxMjIsNDYxMjQsNDYxMjUsNDYxMjYsNDYxMjcsNDYxMjgsNDYxMjksNDYxMzAsNDYxMzEsNDYxMzMsNDYxMzQsNDYxMzUsNDYxMzYsNDYxMzcsNDYxMzgsNDYxMzksNDYxNDAsNDYxNDEsNDYxNDIsNDYxNDMsNDYxNDQsNDYxNDUsNDYxNDYsNDYxNDcsNDYxNDgsNDYxNDksNDYxNTAsNDYxNTEsNDYxNTIsNDYxNTMsNDYxNTQsNDYxNTUsNDYxNTYsNDYxNTcsNDYxNTgsNDYxNTksNDYxNjIsNDYxNjMsNDYxNjUsNDYxNjYsNDYxNjcsNDYxNjksNDYxNzAsNDYxNzEsNDYxNzIsNDYxNzMsNDYxNzQsNDYxNzUsNDYxNzgsNDYxODAsNDYxODIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDYxODMsNDYxODQsNDYxODUsNDYxODYsNDYxODcsNDYxODksNDYxOTAsNDYxOTEsNDYxOTIsNDYxOTMsNDYxOTQsNDYxOTUsNDYxOTYsNDYxOTcsNDYxOTgsNDYxOTksNDYyMDAsNDYyMDEsNDYyMDIsNDYyMDMsNDYyMDQsNDYyMDUsNDYyMDYsNDYyMDcsNDYyMDksNDYyMTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDYyMTEsNDYyMTIsNDYyMTMsNDYyMTQsNDYyMTUsNDYyMTcsNDYyMTgsNDYyMTksNDYyMjAsNDYyMjEsNDYyMjIsNDYyMjMsNDYyMjQsNDYyMjUsNDYyMjYsNDYyMjcsNDYyMjgsNDYyMjksNDYyMzAsNDYyMzEsNDYyMzIsNDYyMzMsNDYyMzQsNDYyMzUsNDYyMzYsNDYyMzgsNDYyMzksNDYyNDAsNDYyNDEsNDYyNDIsNDYyNDMsNDYyNDUsNDYyNDYsNDYyNDcsNDYyNDksNDYyNTAsNDYyNTEsNDYyNTMsNDYyNTQsNDYyNTUsNDYyNTYsNDYyNTcsNDYyNTgsNDYyNTksNDYyNjAsNDYyNjIsNDYyNjQsNDYyNjYsNDYyNjcsNDYyNjgsNDYyNjksNDYyNzAsNDYyNzEsNDYyNzMsNDYyNzQsNDYyNzUsNDYyNzcsNDYyNzgsNDYyNzksNDYyODEsNDYyODIsNDYyODMsNDYyODQsNDYyODUsNDYyODYsNDYyODcsNDYyODksNDYyOTAsNDYyOTEsNDYyOTIsNDYyOTQsNDYyOTUsNDYyOTYsNDYyOTcsNDYyOTgsNDYyOTksNDYzMDIsNDYzMDMsNDYzMDUsNDYzMDYsNDYzMDksNDYzMTEsNDYzMTIsNDYzMTMsNDYzMTQsNDYzMTUsNDYzMTgsNDYzMjAsNDYzMjIsNDYzMjMsNDYzMjQsNDYzMjUsNDYzMjYsNDYzMjcsNDYzMjksNDYzMzAsNDYzMzEsNDYzMzIsNDYzMzMsNDYzMzQsNDYzMzUsNDYzMzYsNDYzMzcsNDYzMzgsNDYzMzksNDYzNDAsNDYzNDEsNDYzNDIsNDYzNDMsNDYzNDQsNDYzNDUsNDYzNDYsNDYzNDcsNDYzNDgsNDYzNDksNDYzNTAsNDYzNTEsNDYzNTIsNDYzNTMsNDYzNTQsNDYzNTUsNDYzNTgsNDYzNTksNDYzNjEsNDYzNjIsNDYzNjUsNDYzNjYsNDYzNjcsNDYzNjgsNDYzNjksNDYzNzAsNDYzNzEsNDYzNzQsNDYzNzksNDYzODAsNDYzODEsNDYzODIsNDYzODMsNDYzODYsNDYzODcsNDYzODksNDYzOTAsNDYzOTEsNDYzOTMsNDYzOTQsNDYzOTUsNDYzOTYsNDYzOTcsNDYzOTgsNDYzOTksNDY0MDIsNDY0MDYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY0MDcsNDY0MDgsNDY0MDksNDY0MTAsNDY0MTQsNDY0MTUsNDY0MTcsNDY0MTgsNDY0MTksNDY0MjEsNDY0MjIsNDY0MjMsNDY0MjQsNDY0MjUsNDY0MjYsNDY0MjcsNDY0MzAsNDY0MzQsNDY0MzUsNDY0MzYsNDY0MzcsNDY0MzgsNDY0MzksNDY0NDAsNDY0NDEsNDY0NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY0NDMsNDY0NDQsNDY0NDUsNDY0NDYsNDY0NDcsNDY0NDgsNDY0NDksNDY0NTAsNDY0NTEsNDY0NTIsNDY0NTMsNDY0NTQsNDY0NTUsNDY0NTYsNDY0NTcsNDY0NTgsNDY0NTksNDY0NjAsNDY0NjEsNDY0NjIsNDY0NjMsNDY0NjQsNDY0NjUsNDY0NjYsNDY0NjcsNDY0NjgsNDY0NjksNDY0NzAsNDY0NzEsNDY0NzIsNDY0NzMsNDY0NzQsNDY0NzUsNDY0NzYsNDY0NzcsNDY0NzgsNDY0NzksNDY0ODAsNDY0ODEsNDY0ODIsNDY0ODMsNDY0ODQsNDY0ODUsNDY0ODYsNDY0ODcsNDY0ODgsNDY0ODksNDY0OTAsNDY0OTEsNDY0OTIsNDY0OTMsNDY0OTQsNDY0OTUsNDY0OTgsNDY0OTksNDY1MDEsNDY1MDIsNDY1MDMsNDY1MDUsNDY1MDgsNDY1MDksNDY1MTAsNDY1MTEsNDY1MTQsNDY1MTgsNDY1MTksNDY1MjAsNDY1MjEsNDY1MjIsNDY1MjYsNDY1MjcsNDY1MjksNDY1MzAsNDY1MzEsNDY1MzMsNDY1MzQsNDY1MzUsNDY1MzYsNDY1MzcsNDY1MzgsNDY1MzksNDY1NDIsNDY1NDYsNDY1NDcsNDY1NDgsNDY1NDksNDY1NTAsNDY1NTEsNDY1NTMsNDY1NTQsNDY1NTUsNDY1NTYsNDY1NTcsNDY1NTgsNDY1NTksNDY1NjAsNDY1NjEsNDY1NjIsNDY1NjMsNDY1NjQsNDY1NjUsNDY1NjYsNDY1NjcsNDY1NjgsNDY1NjksNDY1NzAsNDY1NzEsNDY1NzMsNDY1NzQsNDY1NzUsNDY1NzYsNDY1NzcsNDY1NzgsNDY1NzksNDY1ODAsNDY1ODEsNDY1ODIsNDY1ODMsNDY1ODQsNDY1ODUsNDY1ODYsNDY1ODcsNDY1ODgsNDY1ODksNDY1OTAsNDY1OTEsNDY1OTIsNDY1OTMsNDY1OTQsNDY1OTUsNDY1OTYsNDY1OTcsNDY1OTgsNDY1OTksNDY2MDAsNDY2MDEsNDY2MDIsNDY2MDMsNDY2MDQsNDY2MDUsNDY2MDYsNDY2MDcsNDY2MTAsNDY2MTEsNDY2MTMsNDY2MTQsNDY2MTUsNDY2MTcsNDY2MTgsNDY2MTksNDY2MjAsNDY2MjEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY2MjIsNDY2MjMsNDY2MjQsNDY2MjUsNDY2MjYsNDY2MjcsNDY2MjgsNDY2MzAsNDY2MzEsNDY2MzIsNDY2MzMsNDY2MzQsNDY2MzUsNDY2MzcsNDY2MzgsNDY2MzksNDY2NDAsNDY2NDEsNDY2NDIsNDY2NDMsNDY2NDUsNDY2NDYsNDY2NDcsNDY2NDgsNDY2NDksNDY2NTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY2NTEsNDY2NTIsNDY2NTMsNDY2NTQsNDY2NTUsNDY2NTYsNDY2NTcsNDY2NTgsNDY2NTksNDY2NjAsNDY2NjEsNDY2NjIsNDY2NjMsNDY2NjUsNDY2NjYsNDY2NjcsNDY2NjgsNDY2NjksNDY2NzAsNDY2NzEsNDY2NzIsNDY2NzMsNDY2NzQsNDY2NzUsNDY2NzYsNDY2NzcsNDY2NzgsNDY2NzksNDY2ODAsNDY2ODEsNDY2ODIsNDY2ODMsNDY2ODQsNDY2ODUsNDY2ODYsNDY2ODcsNDY2ODgsNDY2ODksNDY2OTAsNDY2OTEsNDY2OTMsNDY2OTQsNDY2OTUsNDY2OTcsNDY2OTgsNDY2OTksNDY3MDAsNDY3MDEsNDY3MDIsNDY3MDMsNDY3MDQsNDY3MDUsNDY3MDYsNDY3MDcsNDY3MDgsNDY3MDksNDY3MTAsNDY3MTEsNDY3MTIsNDY3MTMsNDY3MTQsNDY3MTUsNDY3MTYsNDY3MTcsNDY3MTgsNDY3MTksNDY3MjAsNDY3MjEsNDY3MjIsNDY3MjMsNDY3MjQsNDY3MjUsNDY3MjYsNDY3MjcsNDY3MjgsNDY3MjksNDY3MzAsNDY3MzEsNDY3MzIsNDY3MzMsNDY3MzQsNDY3MzUsNDY3MzYsNDY3MzcsNDY3MzgsNDY3MzksNDY3NDAsNDY3NDEsNDY3NDIsNDY3NDMsNDY3NDQsNDY3NDUsNDY3NDYsNDY3NDcsNDY3NTAsNDY3NTEsNDY3NTMsNDY3NTQsNDY3NTUsNDY3NTcsNDY3NTgsNDY3NTksNDY3NjAsNDY3NjEsNDY3NjIsNDY3NjUsNDY3NjYsNDY3NjcsNDY3NjgsNDY3NzAsNDY3NzEsNDY3NzIsNDY3NzMsNDY3NzQsNDY3NzUsNDY3NzYsNDY3NzcsNDY3NzgsNDY3NzksNDY3ODAsNDY3ODEsNDY3ODIsNDY3ODMsNDY3ODQsNDY3ODUsNDY3ODYsNDY3ODcsNDY3ODgsNDY3ODksNDY3OTAsNDY3OTEsNDY3OTIsNDY3OTMsNDY3OTQsNDY3OTUsNDY3OTYsNDY3OTcsNDY3OTgsNDY3OTksNDY4MDAsNDY4MDEsNDY4MDIsNDY4MDMsNDY4MDUsNDY4MDYsNDY4MDcsNDY4MDgsNDY4MDksNDY4MTAsNDY4MTEsNDY4MTIsNDY4MTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY4MTQsNDY4MTUsNDY4MTYsNDY4MTcsNDY4MTgsNDY4MTksNDY4MjAsNDY4MjEsNDY4MjIsNDY4MjMsNDY4MjQsNDY4MjUsNDY4MjYsNDY4MjcsNDY4MjgsNDY4MjksNDY4MzAsNDY4MzEsNDY4MzMsNDY4MzQsNDY4MzUsNDY4MzcsNDY4MzgsNDY4MzksNDY4NDEsNDY4NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY4NDMsNDY4NDQsNDY4NDUsNDY4NDYsNDY4NDcsNDY4NTAsNDY4NTEsNDY4NTIsNDY4NTQsNDY4NTUsNDY4NTYsNDY4NTcsNDY4NTgsNDY4NTksNDY4NjAsNDY4NjEsNDY4NjIsNDY4NjMsNDY4NjQsNDY4NjUsNDY4NjYsNDY4NjcsNDY4NjgsNDY4NjksNDY4NzAsNDY4NzEsNDY4NzIsNDY4NzMsNDY4NzQsNDY4NzUsNDY4NzYsNDY4NzcsNDY4NzgsNDY4NzksNDY4ODAsNDY4ODEsNDY4ODIsNDY4ODMsNDY4ODQsNDY4ODUsNDY4ODYsNDY4ODcsNDY4OTAsNDY4OTEsNDY4OTMsNDY4OTQsNDY4OTcsNDY4OTgsNDY4OTksNDY5MDAsNDY5MDEsNDY5MDIsNDY5MDMsNDY5MDYsNDY5MDgsNDY5MDksNDY5MTAsNDY5MTEsNDY5MTIsNDY5MTMsNDY5MTQsNDY5MTUsNDY5MTcsNDY5MTgsNDY5MTksNDY5MjEsNDY5MjIsNDY5MjMsNDY5MjUsNDY5MjYsNDY5MjcsNDY5MjgsNDY5MjksNDY5MzAsNDY5MzEsNDY5MzQsNDY5MzUsNDY5MzYsNDY5MzcsNDY5MzgsNDY5MzksNDY5NDAsNDY5NDEsNDY5NDIsNDY5NDMsNDY5NDUsNDY5NDYsNDY5NDcsNDY5NDksNDY5NTAsNDY5NTEsNDY5NTMsNDY5NTQsNDY5NTUsNDY5NTYsNDY5NTcsNDY5NTgsNDY5NTksNDY5NjIsNDY5NjQsNDY5NjYsNDY5NjcsNDY5NjgsNDY5NjksNDY5NzAsNDY5NzEsNDY5NzQsNDY5NzUsNDY5NzcsNDY5NzgsNDY5NzksNDY5ODEsNDY5ODIsNDY5ODMsNDY5ODQsNDY5ODUsNDY5ODYsNDY5ODcsNDY5OTAsNDY5OTUsNDY5OTYsNDY5OTcsNDcwMDIsNDcwMDMsNDcwMDUsNDcwMDYsNDcwMDcsNDcwMDksNDcwMTAsNDcwMTEsNDcwMTIsNDcwMTMsNDcwMTQsNDcwMTUsNDcwMTgsNDcwMjIsNDcwMjMsNDcwMjQsNDcwMjUsNDcwMjYsNDcwMjcsNDcwMzAsNDcwMzEsNDcwMzMsNDcwMzQsNDcwMzUsNDcwMzYsNDcwMzcsNDcwMzgsNDcwMzksNDcwNDAsNDcwNDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcwNDIsNDcwNDMsNDcwNDQsNDcwNDUsNDcwNDYsNDcwNDgsNDcwNTAsNDcwNTEsNDcwNTIsNDcwNTMsNDcwNTQsNDcwNTUsNDcwNTYsNDcwNTcsNDcwNTgsNDcwNTksNDcwNjAsNDcwNjEsNDcwNjIsNDcwNjMsNDcwNjQsNDcwNjUsNDcwNjYsNDcwNjcsNDcwNjgsNDcwNjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcwNzAsNDcwNzEsNDcwNzIsNDcwNzMsNDcwNzQsNDcwNzUsNDcwNzYsNDcwNzcsNDcwNzgsNDcwNzksNDcwODAsNDcwODEsNDcwODIsNDcwODMsNDcwODYsNDcwODcsNDcwODksNDcwOTAsNDcwOTEsNDcwOTMsNDcwOTQsNDcwOTUsNDcwOTYsNDcwOTcsNDcwOTgsNDcwOTksNDcxMDIsNDcxMDYsNDcxMDcsNDcxMDgsNDcxMDksNDcxMTAsNDcxMTQsNDcxMTUsNDcxMTcsNDcxMTgsNDcxMTksNDcxMjEsNDcxMjIsNDcxMjMsNDcxMjQsNDcxMjUsNDcxMjYsNDcxMjcsNDcxMzAsNDcxMzIsNDcxMzQsNDcxMzUsNDcxMzYsNDcxMzcsNDcxMzgsNDcxMzksNDcxNDIsNDcxNDMsNDcxNDUsNDcxNDYsNDcxNDcsNDcxNDksNDcxNTAsNDcxNTEsNDcxNTIsNDcxNTMsNDcxNTQsNDcxNTUsNDcxNTgsNDcxNjIsNDcxNjMsNDcxNjQsNDcxNjUsNDcxNjYsNDcxNjcsNDcxNjksNDcxNzAsNDcxNzEsNDcxNzMsNDcxNzQsNDcxNzUsNDcxNzYsNDcxNzcsNDcxNzgsNDcxNzksNDcxODAsNDcxODEsNDcxODIsNDcxODMsNDcxODQsNDcxODYsNDcxODgsNDcxODksNDcxOTAsNDcxOTEsNDcxOTIsNDcxOTMsNDcxOTQsNDcxOTUsNDcxOTgsNDcxOTksNDcyMDEsNDcyMDIsNDcyMDMsNDcyMDUsNDcyMDYsNDcyMDcsNDcyMDgsNDcyMDksNDcyMTAsNDcyMTEsNDcyMTQsNDcyMTYsNDcyMTgsNDcyMTksNDcyMjAsNDcyMjEsNDcyMjIsNDcyMjMsNDcyMjUsNDcyMjYsNDcyMjcsNDcyMjksNDcyMzAsNDcyMzEsNDcyMzIsNDcyMzMsNDcyMzQsNDcyMzUsNDcyMzYsNDcyMzcsNDcyMzgsNDcyMzksNDcyNDAsNDcyNDEsNDcyNDIsNDcyNDMsNDcyNDQsNDcyNDYsNDcyNDcsNDcyNDgsNDcyNDksNDcyNTAsNDcyNTEsNDcyNTIsNDcyNTMsNDcyNTQsNDcyNTUsNDcyNTYsNDcyNTcsNDcyNTgsNDcyNTksNDcyNjAsNDcyNjEsNDcyNjIsNDcyNjMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcyNjQsNDcyNjUsNDcyNjYsNDcyNjcsNDcyNjgsNDcyNjksNDcyNzAsNDcyNzEsNDcyNzMsNDcyNzQsNDcyNzUsNDcyNzYsNDcyNzcsNDcyNzgsNDcyNzksNDcyODEsNDcyODIsNDcyODMsNDcyODUsNDcyODYsNDcyODcsNDcyODksNDcyOTAsNDcyOTEsNDcyOTIsNDcyOTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcyOTQsNDcyOTUsNDcyOTgsNDczMDAsNDczMDIsNDczMDMsNDczMDQsNDczMDUsNDczMDYsNDczMDcsNDczMDksNDczMTAsNDczMTEsNDczMTMsNDczMTQsNDczMTUsNDczMTcsNDczMTgsNDczMTksNDczMjAsNDczMjEsNDczMjIsNDczMjMsNDczMjQsNDczMjYsNDczMjgsNDczMzAsNDczMzEsNDczMzIsNDczMzMsNDczMzQsNDczMzUsNDczMzgsNDczMzksNDczNDEsNDczNDIsNDczNDMsNDczNDUsNDczNDYsNDczNDcsNDczNDgsNDczNDksNDczNTAsNDczNTEsNDczNTQsNDczNTYsNDczNTgsNDczNTksNDczNjAsNDczNjEsNDczNjIsNDczNjMsNDczNjUsNDczNjYsNDczNjcsNDczNjgsNDczNjksNDczNzAsNDczNzEsNDczNzIsNDczNzMsNDczNzQsNDczNzUsNDczNzYsNDczNzcsNDczNzgsNDczNzksNDczODAsNDczODEsNDczODIsNDczODMsNDczODUsNDczODYsNDczODcsNDczODgsNDczODksNDczOTAsNDczOTEsNDczOTMsNDczOTQsNDczOTUsNDczOTYsNDczOTcsNDczOTgsNDczOTksNDc0MDAsNDc0MDEsNDc0MDIsNDc0MDMsNDc0MDQsNDc0MDUsNDc0MDYsNDc0MDcsNDc0MDgsNDc0MDksNDc0MTAsNDc0MTEsNDc0MTIsNDc0MTMsNDc0MTQsNDc0MTUsNDc0MTYsNDc0MTcsNDc0MTgsNDc0MTksNDc0MjIsNDc0MjMsNDc0MjUsNDc0MjYsNDc0MjcsNDc0MjksNDc0MzAsNDc0MzEsNDc0MzIsNDc0MzMsNDc0MzQsNDc0MzUsNDc0MzcsNDc0MzgsNDc0NDAsNDc0NDIsNDc0NDMsNDc0NDQsNDc0NDUsNDc0NDYsNDc0NDcsNDc0NTAsNDc0NTEsNDc0NTMsNDc0NTQsNDc0NTUsNDc0NTcsNDc0NTgsNDc0NTksNDc0NjAsNDc0NjEsNDc0NjIsNDc0NjMsNDc0NjYsNDc0NjgsNDc0NzAsNDc0NzEsNDc0NzIsNDc0NzMsNDc0NzQsNDc0NzUsNDc0NzgsNDc0NzksNDc0ODEsNDc0ODIsNDc0ODMsNDc0ODUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc0ODYsNDc0ODcsNDc0ODgsNDc0ODksNDc0OTAsNDc0OTEsNDc0OTQsNDc0OTYsNDc0OTksNDc1MDAsNDc1MDMsNDc1MDQsNDc1MDUsNDc1MDYsNDc1MDcsNDc1MDgsNDc1MDksNDc1MTAsNDc1MTEsNDc1MTIsNDc1MTMsNDc1MTQsNDc1MTUsNDc1MTYsNDc1MTcsNDc1MTgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc1MTksNDc1MjAsNDc1MjEsNDc1MjIsNDc1MjMsNDc1MjQsNDc1MjUsNDc1MjYsNDc1MjcsNDc1MjgsNDc1MjksNDc1MzAsNDc1MzEsNDc1MzQsNDc1MzUsNDc1MzcsNDc1MzgsNDc1MzksNDc1NDEsNDc1NDIsNDc1NDMsNDc1NDQsNDc1NDUsNDc1NDYsNDc1NDcsNDc1NTAsNDc1NTIsNDc1NTQsNDc1NTUsNDc1NTYsNDc1NTcsNDc1NTgsNDc1NTksNDc1NjIsNDc1NjMsNDc1NjUsNDc1NzEsNDc1NzIsNDc1NzMsNDc1NzQsNDc1NzUsNDc1NzgsNDc1ODAsNDc1ODMsNDc1ODQsNDc1ODYsNDc1OTAsNDc1OTEsNDc1OTMsNDc1OTQsNDc1OTUsNDc1OTcsNDc1OTgsNDc1OTksNDc2MDAsNDc2MDEsNDc2MDIsNDc2MDMsNDc2MDYsNDc2MTEsNDc2MTIsNDc2MTMsNDc2MTQsNDc2MTUsNDc2MTgsNDc2MTksNDc2MjAsNDc2MjEsNDc2MjIsNDc2MjMsNDc2MjUsNDc2MjYsNDc2MjcsNDc2MjgsNDc2MjksNDc2MzAsNDc2MzEsNDc2MzIsNDc2MzMsNDc2MzQsNDc2MzUsNDc2MzYsNDc2MzgsNDc2MzksNDc2NDAsNDc2NDEsNDc2NDIsNDc2NDMsNDc2NDQsNDc2NDUsNDc2NDYsNDc2NDcsNDc2NDgsNDc2NDksNDc2NTAsNDc2NTEsNDc2NTIsNDc2NTMsNDc2NTQsNDc2NTUsNDc2NTYsNDc2NTcsNDc2NTgsNDc2NTksNDc2NjAsNDc2NjEsNDc2NjIsNDc2NjMsNDc2NjQsNDc2NjUsNDc2NjYsNDc2NjcsNDc2NjgsNDc2NjksNDc2NzAsNDc2NzEsNDc2NzQsNDc2NzUsNDc2NzcsNDc2NzgsNDc2NzksNDc2ODEsNDc2ODMsNDc2ODQsNDc2ODUsNDc2ODYsNDc2ODcsNDc2OTAsNDc2OTIsNDc2OTUsNDc2OTYsNDc2OTcsNDc2OTgsNDc3MDIsNDc3MDMsNDc3MDUsNDc3MDYsNDc3MDcsNDc3MDksNDc3MTAsNDc3MTEsNDc3MTIsNDc3MTMsNDc3MTQsNDc3MTUsNDc3MTgsNDc3MjIsNDc3MjMsNDc3MjQsNDc3MjUsNDc3MjYsNDc3MjcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc3MzAsNDc3MzEsNDc3MzMsNDc3MzQsNDc3MzUsNDc3MzcsNDc3MzgsNDc3MzksNDc3NDAsNDc3NDEsNDc3NDIsNDc3NDMsNDc3NDQsNDc3NDUsNDc3NDYsNDc3NTAsNDc3NTIsNDc3NTMsNDc3NTQsNDc3NTUsNDc3NTcsNDc3NTgsNDc3NTksNDc3NjAsNDc3NjEsNDc3NjIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc3NjMsNDc3NjQsNDc3NjUsNDc3NjYsNDc3NjcsNDc3NjgsNDc3NjksNDc3NzAsNDc3NzEsNDc3NzIsNDc3NzMsNDc3NzQsNDc3NzUsNDc3NzYsNDc3NzcsNDc3NzgsNDc3NzksNDc3ODAsNDc3ODEsNDc3ODIsNDc3ODMsNDc3ODYsNDc3ODksNDc3OTAsNDc3OTEsNDc3OTMsNDc3OTUsNDc3OTYsNDc3OTcsNDc3OTgsNDc3OTksNDc4MDIsNDc4MDQsNDc4MDYsNDc4MDcsNDc4MDgsNDc4MDksNDc4MTAsNDc4MTEsNDc4MTMsNDc4MTQsNDc4MTUsNDc4MTcsNDc4MTgsNDc4MTksNDc4MjAsNDc4MjEsNDc4MjIsNDc4MjMsNDc4MjQsNDc4MjUsNDc4MjYsNDc4MjcsNDc4MjgsNDc4MjksNDc4MzAsNDc4MzEsNDc4MzQsNDc4MzUsNDc4MzYsNDc4MzcsNDc4MzgsNDc4MzksNDc4NDAsNDc4NDEsNDc4NDIsNDc4NDMsNDc4NDQsNDc4NDUsNDc4NDYsNDc4NDcsNDc4NDgsNDc4NDksNDc4NTAsNDc4NTEsNDc4NTIsNDc4NTMsNDc4NTQsNDc4NTUsNDc4NTYsNDc4NTcsNDc4NTgsNDc4NTksNDc4NjAsNDc4NjEsNDc4NjIsNDc4NjMsNDc4NjQsNDc4NjUsNDc4NjYsNDc4NjcsNDc4NjksNDc4NzAsNDc4NzEsNDc4NzMsNDc4NzQsNDc4NzUsNDc4NzcsNDc4NzgsNDc4NzksNDc4ODAsNDc4ODEsNDc4ODIsNDc4ODMsNDc4ODQsNDc4ODYsNDc4ODgsNDc4OTAsNDc4OTEsNDc4OTIsNDc4OTMsNDc4OTQsNDc4OTUsNDc4OTcsNDc4OTgsNDc4OTksNDc5MDEsNDc5MDIsNDc5MDMsNDc5MDUsNDc5MDYsNDc5MDcsNDc5MDgsNDc5MDksNDc5MTAsNDc5MTEsNDc5MTIsNDc5MTQsNDc5MTYsNDc5MTcsNDc5MTgsNDc5MTksNDc5MjAsNDc5MjEsNDc5MjIsNDc5MjMsNDc5MjcsNDc5MjksNDc5MzAsNDc5MzUsNDc5MzYsNDc5MzcsNDc5MzgsNDc5MzksNDc5NDIsNDc5NDQsNDc5NDYsNDc5NDcsNDc5NDgsNDc5NTAsNDc5NTMsNDc5NTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc5NTUsNDc5NTcsNDc5NTgsNDc5NTksNDc5NjEsNDc5NjIsNDc5NjMsNDc5NjQsNDc5NjUsNDc5NjYsNDc5NjcsNDc5NjgsNDc5NzAsNDc5NzIsNDc5NzMsNDc5NzQsNDc5NzUsNDc5NzYsNDc5NzcsNDc5NzgsNDc5NzksNDc5ODEsNDc5ODIsNDc5ODMsNDc5ODQsNDc5ODUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc5ODYsNDc5ODcsNDc5ODgsNDc5ODksNDc5OTAsNDc5OTEsNDc5OTIsNDc5OTMsNDc5OTQsNDc5OTUsNDc5OTYsNDc5OTcsNDc5OTgsNDc5OTksNDgwMDAsNDgwMDEsNDgwMDIsNDgwMDMsNDgwMDQsNDgwMDUsNDgwMDYsNDgwMDcsNDgwMDksNDgwMTAsNDgwMTEsNDgwMTMsNDgwMTQsNDgwMTUsNDgwMTcsNDgwMTgsNDgwMTksNDgwMjAsNDgwMjEsNDgwMjIsNDgwMjMsNDgwMjQsNDgwMjUsNDgwMjYsNDgwMjcsNDgwMjgsNDgwMjksNDgwMzAsNDgwMzEsNDgwMzIsNDgwMzMsNDgwMzQsNDgwMzUsNDgwMzcsNDgwMzgsNDgwMzksNDgwNDEsNDgwNDIsNDgwNDMsNDgwNDUsNDgwNDYsNDgwNDcsNDgwNDgsNDgwNDksNDgwNTAsNDgwNTEsNDgwNTMsNDgwNTQsNDgwNTYsNDgwNTcsNDgwNTgsNDgwNTksNDgwNjAsNDgwNjEsNDgwNjIsNDgwNjMsNDgwNjUsNDgwNjYsNDgwNjcsNDgwNjksNDgwNzAsNDgwNzEsNDgwNzMsNDgwNzQsNDgwNzUsNDgwNzYsNDgwNzcsNDgwNzgsNDgwNzksNDgwODEsNDgwODIsNDgwODQsNDgwODUsNDgwODYsNDgwODcsNDgwODgsNDgwODksNDgwOTAsNDgwOTEsNDgwOTIsNDgwOTMsNDgwOTQsNDgwOTUsNDgwOTYsNDgwOTcsNDgwOTgsNDgwOTksNDgxMDAsNDgxMDEsNDgxMDIsNDgxMDMsNDgxMDQsNDgxMDUsNDgxMDYsNDgxMDcsNDgxMDgsNDgxMDksNDgxMTAsNDgxMTEsNDgxMTIsNDgxMTMsNDgxMTQsNDgxMTUsNDgxMTYsNDgxMTcsNDgxMTgsNDgxMTksNDgxMjIsNDgxMjMsNDgxMjUsNDgxMjYsNDgxMjksNDgxMzEsNDgxMzIsNDgxMzMsNDgxMzQsNDgxMzUsNDgxMzgsNDgxNDIsNDgxNDQsNDgxNDYsNDgxNDcsNDgxNTMsNDgxNTQsNDgxNjAsNDgxNjEsNDgxNjIsNDgxNjMsNDgxNjYsNDgxNjgsNDgxNzAsNDgxNzEsNDgxNzIsNDgxNzQsNDgxNzUsNDgxNzgsNDgxNzksNDgxODEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDgxODIsNDgxODMsNDgxODUsNDgxODYsNDgxODcsNDgxODgsNDgxODksNDgxOTAsNDgxOTEsNDgxOTQsNDgxOTgsNDgxOTksNDgyMDAsNDgyMDIsNDgyMDMsNDgyMDYsNDgyMDcsNDgyMDksNDgyMTAsNDgyMTEsNDgyMTIsNDgyMTMsNDgyMTQsNDgyMTUsNDgyMTYsNDgyMTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDgyMTgsNDgyMTksNDgyMjAsNDgyMjIsNDgyMjMsNDgyMjQsNDgyMjUsNDgyMjYsNDgyMjcsNDgyMjgsNDgyMjksNDgyMzAsNDgyMzEsNDgyMzIsNDgyMzMsNDgyMzQsNDgyMzUsNDgyMzYsNDgyMzcsNDgyMzgsNDgyMzksNDgyNDAsNDgyNDEsNDgyNDIsNDgyNDMsNDgyNDQsNDgyNDUsNDgyNDYsNDgyNDcsNDgyNDgsNDgyNDksNDgyNTAsNDgyNTEsNDgyNTIsNDgyNTMsNDgyNTQsNDgyNTUsNDgyNTYsNDgyNTcsNDgyNTgsNDgyNTksNDgyNjIsNDgyNjMsNDgyNjUsNDgyNjYsNDgyNjksNDgyNzEsNDgyNzIsNDgyNzMsNDgyNzQsNDgyNzUsNDgyNzgsNDgyODAsNDgyODMsNDgyODQsNDgyODUsNDgyODYsNDgyODcsNDgyOTAsNDgyOTEsNDgyOTMsNDgyOTQsNDgyOTcsNDgyOTgsNDgyOTksNDgzMDAsNDgzMDEsNDgzMDIsNDgzMDMsNDgzMDYsNDgzMTAsNDgzMTEsNDgzMTIsNDgzMTMsNDgzMTQsNDgzMTUsNDgzMTgsNDgzMTksNDgzMjEsNDgzMjIsNDgzMjMsNDgzMjUsNDgzMjYsNDgzMjcsNDgzMjgsNDgzMjksNDgzMzAsNDgzMzEsNDgzMzIsNDgzMzQsNDgzMzgsNDgzMzksNDgzNDAsNDgzNDIsNDgzNDMsNDgzNDUsNDgzNDYsNDgzNDcsNDgzNDksNDgzNTAsNDgzNTEsNDgzNTIsNDgzNTMsNDgzNTQsNDgzNTUsNDgzNTYsNDgzNTcsNDgzNTgsNDgzNTksNDgzNjAsNDgzNjEsNDgzNjIsNDgzNjMsNDgzNjQsNDgzNjUsNDgzNjYsNDgzNjcsNDgzNjgsNDgzNjksNDgzNzAsNDgzNzEsNDgzNzUsNDgzNzcsNDgzNzgsNDgzNzksNDgzODEsNDgzODIsNDgzODMsNDgzODQsNDgzODUsNDgzODYsNDgzODcsNDgzOTAsNDgzOTIsNDgzOTQsNDgzOTUsNDgzOTYsNDgzOTcsNDgzOTgsNDgzOTksNDg0MDEsNDg0MDIsNDg0MDMsNDg0MDUsNDg0MDYsNDg0MDcsNDg0MDgsNDg0MDksNDg0MTAsNDg0MTEsNDg0MTIsNDg0MTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg0MTQsNDg0MTUsNDg0MTYsNDg0MTcsNDg0MTgsNDg0MTksNDg0MjEsNDg0MjIsNDg0MjMsNDg0MjQsNDg0MjUsNDg0MjYsNDg0MjcsNDg0MjksNDg0MzAsNDg0MzEsNDg0MzIsNDg0MzMsNDg0MzQsNDg0MzUsNDg0MzYsNDg0MzcsNDg0MzgsNDg0MzksNDg0NDAsNDg0NDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg0NDIsNDg0NDMsNDg0NDQsNDg0NDUsNDg0NDYsNDg0NDcsNDg0NDksNDg0NTAsNDg0NTEsNDg0NTIsNDg0NTMsNDg0NTQsNDg0NTUsNDg0NTgsNDg0NTksNDg0NjEsNDg0NjIsNDg0NjMsNDg0NjUsNDg0NjYsNDg0NjcsNDg0NjgsNDg0NjksNDg0NzAsNDg0NzEsNDg0NzQsNDg0NzUsNDg0NzYsNDg0NzcsNDg0NzgsNDg0NzksNDg0ODAsNDg0ODEsNDg0ODIsNDg0ODMsNDg0ODUsNDg0ODYsNDg0ODcsNDg0ODksNDg0OTAsNDg0OTEsNDg0OTIsNDg0OTMsNDg0OTQsNDg0OTUsNDg0OTYsNDg0OTcsNDg0OTgsNDg0OTksNDg1MDAsNDg1MDEsNDg1MDIsNDg1MDMsNDg1MDQsNDg1MDUsNDg1MDYsNDg1MDcsNDg1MDgsNDg1MDksNDg1MTAsNDg1MTEsNDg1MTQsNDg1MTUsNDg1MTcsNDg1MTgsNDg1MjMsNDg1MjQsNDg1MjUsNDg1MjYsNDg1MjcsNDg1MzAsNDg1MzIsNDg1MzQsNDg1MzUsNDg1MzYsNDg1MzksNDg1NDEsNDg1NDIsNDg1NDMsNDg1NDQsNDg1NDUsNDg1NDYsNDg1NDcsNDg1NDksNDg1NTAsNDg1NTEsNDg1NTIsNDg1NTMsNDg1NTQsNDg1NTUsNDg1NTYsNDg1NTcsNDg1NTgsNDg1NTksNDg1NjEsNDg1NjIsNDg1NjMsNDg1NjQsNDg1NjUsNDg1NjYsNDg1NjcsNDg1NjksNDg1NzAsNDg1NzEsNDg1NzIsNDg1NzMsNDg1NzQsNDg1NzUsNDg1NzYsNDg1NzcsNDg1NzgsNDg1NzksNDg1ODAsNDg1ODEsNDg1ODIsNDg1ODMsNDg1ODQsNDg1ODUsNDg1ODYsNDg1ODcsNDg1ODgsNDg1ODksNDg1OTAsNDg1OTEsNDg1OTIsNDg1OTMsNDg1OTQsNDg1OTUsNDg1OTgsNDg1OTksNDg2MDEsNDg2MDIsNDg2MDMsNDg2MDUsNDg2MDYsNDg2MDcsNDg2MDgsNDg2MDksNDg2MTAsNDg2MTEsNDg2MTIsNDg2MTMsNDg2MTQsNDg2MTUsNDg2MTYsNDg2MTgsNDg2MTksNDg2MjAsNDg2MjEsNDg2MjIsNDg2MjMsNDg2MjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg2MjYsNDg2MjcsNDg2MjksNDg2MzAsNDg2MzEsNDg2MzMsNDg2MzQsNDg2MzUsNDg2MzYsNDg2MzcsNDg2MzgsNDg2MzksNDg2NDEsNDg2NDIsNDg2NDQsNDg2NDYsNDg2NDcsNDg2NDgsNDg2NDksNDg2NTAsNDg2NTEsNDg2NTQsNDg2NTUsNDg2NTcsNDg2NTgsNDg2NTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg2NjEsNDg2NjIsNDg2NjMsNDg2NjQsNDg2NjUsNDg2NjYsNDg2NjcsNDg2NzAsNDg2NzIsNDg2NzMsNDg2NzQsNDg2NzUsNDg2NzYsNDg2NzcsNDg2NzgsNDg2NzksNDg2ODAsNDg2ODEsNDg2ODIsNDg2ODMsNDg2ODQsNDg2ODUsNDg2ODYsNDg2ODcsNDg2ODgsNDg2ODksNDg2OTAsNDg2OTEsNDg2OTIsNDg2OTMsNDg2OTQsNDg2OTUsNDg2OTYsNDg2OTcsNDg2OTgsNDg2OTksNDg3MDAsNDg3MDEsNDg3MDIsNDg3MDMsNDg3MDQsNDg3MDUsNDg3MDYsNDg3MDcsNDg3MTAsNDg3MTEsNDg3MTMsNDg3MTQsNDg3MTUsNDg3MTcsNDg3MTksNDg3MjAsNDg3MjEsNDg3MjIsNDg3MjMsNDg3MjYsNDg3MjgsNDg3MzIsNDg3MzMsNDg3MzQsNDg3MzUsNDg3MzgsNDg3MzksNDg3NDEsNDg3NDIsNDg3NDMsNDg3NDUsNDg3NDcsNDg3NDgsNDg3NDksNDg3NTAsNDg3NTEsNDg3NTQsNDg3NTgsNDg3NTksNDg3NjAsNDg3NjEsNDg3NjIsNDg3NjYsNDg3NjcsNDg3NjksNDg3NzAsNDg3NzEsNDg3NzMsNDg3NzQsNDg3NzUsNDg3NzYsNDg3NzcsNDg3NzgsNDg3NzksNDg3ODIsNDg3ODYsNDg3ODcsNDg3ODgsNDg3ODksNDg3OTAsNDg3OTEsNDg3OTQsNDg3OTUsNDg3OTYsNDg3OTcsNDg3OTgsNDg3OTksNDg4MDAsNDg4MDEsNDg4MDIsNDg4MDMsNDg4MDQsNDg4MDUsNDg4MDYsNDg4MDcsNDg4MDksNDg4MTAsNDg4MTEsNDg4MTIsNDg4MTMsNDg4MTQsNDg4MTUsNDg4MTYsNDg4MTcsNDg4MTgsNDg4MTksNDg4MjAsNDg4MjEsNDg4MjIsNDg4MjMsNDg4MjQsNDg4MjUsNDg4MjYsNDg4MjcsNDg4MjgsNDg4MjksNDg4MzAsNDg4MzEsNDg4MzIsNDg4MzMsNDg4MzQsNDg4MzUsNDg4MzYsNDg4MzcsNDg4MzgsNDg4MzksNDg4NDAsNDg4NDEsNDg4NDIsNDg4NDMsNDg4NDQsNDg4NDUsNDg4NDYsNDg4NDcsNDg4NTAsNDg4NTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg4NTMsNDg4NTQsNDg4NTcsNDg4NTgsNDg4NTksNDg4NjAsNDg4NjEsNDg4NjIsNDg4NjMsNDg4NjUsNDg4NjYsNDg4NzAsNDg4NzEsNDg4NzIsNDg4NzMsNDg4NzQsNDg4NzUsNDg4NzcsNDg4NzgsNDg4NzksNDg4ODAsNDg4ODEsNDg4ODIsNDg4ODMsNDg4ODQsNDg4ODUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg4ODYsNDg4ODcsNDg4ODgsNDg4ODksNDg4OTAsNDg4OTEsNDg4OTIsNDg4OTMsNDg4OTQsNDg4OTUsNDg4OTYsNDg4OTgsNDg4OTksNDg5MDAsNDg5MDEsNDg5MDIsNDg5MDMsNDg5MDYsNDg5MDcsNDg5MDgsNDg5MDksNDg5MTAsNDg5MTEsNDg5MTIsNDg5MTMsNDg5MTQsNDg5MTUsNDg5MTYsNDg5MTcsNDg5MTgsNDg5MTksNDg5MjIsNDg5MjYsNDg5MjcsNDg5MjgsNDg5MjksNDg5MzAsNDg5MzEsNDg5MzIsNDg5MzMsNDg5MzQsNDg5MzUsNDg5MzYsNDg5MzcsNDg5MzgsNDg5MzksNDg5NDAsNDg5NDEsNDg5NDIsNDg5NDMsNDg5NDQsNDg5NDUsNDg5NDYsNDg5NDcsNDg5NDgsNDg5NDksNDg5NTAsNDg5NTEsNDg5NTIsNDg5NTMsNDg5NTQsNDg5NTUsNDg5NTYsNDg5NTcsNDg5NTgsNDg5NTksNDg5NjIsNDg5NjMsNDg5NjUsNDg5NjYsNDg5NjcsNDg5NjksNDg5NzAsNDg5NzEsNDg5NzIsNDg5NzMsNDg5NzQsNDg5NzUsNDg5NzgsNDg5NzksNDg5ODAsNDg5ODIsNDg5ODMsNDg5ODQsNDg5ODUsNDg5ODYsNDg5ODcsNDg5ODgsNDg5ODksNDg5OTAsNDg5OTEsNDg5OTIsNDg5OTMsNDg5OTQsNDg5OTUsNDg5OTYsNDg5OTcsNDg5OTgsNDg5OTksNDkwMDAsNDkwMDEsNDkwMDIsNDkwMDMsNDkwMDQsNDkwMDUsNDkwMDYsNDkwMDcsNDkwMDgsNDkwMDksNDkwMTAsNDkwMTEsNDkwMTIsNDkwMTMsNDkwMTQsNDkwMTUsNDkwMTYsNDkwMTcsNDkwMTgsNDkwMTksNDkwMjAsNDkwMjEsNDkwMjIsNDkwMjMsNDkwMjQsNDkwMjUsNDkwMjYsNDkwMjcsNDkwMjgsNDkwMjksNDkwMzAsNDkwMzEsNDkwMzIsNDkwMzMsNDkwMzQsNDkwMzUsNDkwMzYsNDkwMzcsNDkwMzgsNDkwMzksNDkwNDAsNDkwNDEsNDkwNDIsNDkwNDMsNDkwNDUsNDkwNDYsNDkwNDcsNDkwNDgsNDkwNDksNDkwNTAsNDkwNTEsNDkwNTIsNDkwNTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkwNTQsNDkwNTUsNDkwNTYsNDkwNTcsNDkwNTgsNDkwNTksNDkwNjAsNDkwNjEsNDkwNjIsNDkwNjMsNDkwNjQsNDkwNjUsNDkwNjYsNDkwNjcsNDkwNjgsNDkwNjksNDkwNzAsNDkwNzEsNDkwNzMsNDkwNzQsNDkwNzUsNDkwNzYsNDkwNzcsNDkwNzgsNDkwNzksNDkwODAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkwODEsNDkwODIsNDkwODMsNDkwODQsNDkwODUsNDkwODYsNDkwODcsNDkwODgsNDkwODksNDkwOTAsNDkwOTEsNDkwOTIsNDkwOTQsNDkwOTUsNDkwOTYsNDkwOTcsNDkwOTgsNDkwOTksNDkxMDIsNDkxMDMsNDkxMDUsNDkxMDYsNDkxMDcsNDkxMDksNDkxMTAsNDkxMTEsNDkxMTIsNDkxMTMsNDkxMTQsNDkxMTUsNDkxMTcsNDkxMTgsNDkxMjAsNDkxMjIsNDkxMjMsNDkxMjQsNDkxMjUsNDkxMjYsNDkxMjcsNDkxMjgsNDkxMjksNDkxMzAsNDkxMzEsNDkxMzIsNDkxMzMsNDkxMzQsNDkxMzUsNDkxMzYsNDkxMzcsNDkxMzgsNDkxMzksNDkxNDAsNDkxNDEsNDkxNDIsNDkxNDMsNDkxNDQsNDkxNDUsNDkxNDYsNDkxNDcsNDkxNDgsNDkxNDksNDkxNTAsNDkxNTEsNDkxNTIsNDkxNTMsNDkxNTQsNDkxNTUsNDkxNTYsNDkxNTcsNDkxNTgsNDkxNTksNDkxNjAsNDkxNjEsNDkxNjIsNDkxNjMsNDkxNjQsNDkxNjUsNDkxNjYsNDkxNjcsNDkxNjgsNDkxNjksNDkxNzAsNDkxNzEsNDkxNzIsNDkxNzMsNDkxNzQsNDkxNzUsNDkxNzYsNDkxNzcsNDkxNzgsNDkxNzksNDkxODAsNDkxODEsNDkxODIsNDkxODMsNDkxODQsNDkxODUsNDkxODYsNDkxODcsNDkxODgsNDkxODksNDkxOTAsNDkxOTEsNDkxOTIsNDkxOTMsNDkxOTQsNDkxOTUsNDkxOTYsNDkxOTcsNDkxOTgsNDkxOTksNDkyMDAsNDkyMDEsNDkyMDIsNDkyMDMsNDkyMDQsNDkyMDUsNDkyMDYsNDkyMDcsNDkyMDgsNDkyMDksNDkyMTAsNDkyMTEsNDkyMTMsNDkyMTQsNDkyMTUsNDkyMTYsNDkyMTcsNDkyMTgsNDkyMTksNDkyMjAsNDkyMjEsNDkyMjIsNDkyMjMsNDkyMjQsNDkyMjUsNDkyMjYsNDkyMjcsNDkyMjgsNDkyMjksNDkyMzAsNDkyMzEsNDkyMzIsNDkyMzQsNDkyMzUsNDkyMzYsNDkyMzcsNDkyMzgsNDkyMzksNDkyNDEsNDkyNDIsNDkyNDMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkyNDUsNDkyNDYsNDkyNDcsNDkyNDksNDkyNTAsNDkyNTEsNDkyNTIsNDkyNTMsNDkyNTQsNDkyNTUsNDkyNTgsNDkyNTksNDkyNjAsNDkyNjEsNDkyNjIsNDkyNjMsNDkyNjQsNDkyNjUsNDkyNjYsNDkyNjcsNDkyNjgsNDkyNjksNDkyNzAsNDkyNzEsNDkyNzIsNDkyNzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkyNzQsNDkyNzUsNDkyNzYsNDkyNzcsNDkyNzgsNDkyNzksNDkyODAsNDkyODEsNDkyODIsNDkyODMsNDkyODQsNDkyODUsNDkyODYsNDkyODcsNDkyODgsNDkyODksNDkyOTAsNDkyOTEsNDkyOTIsNDkyOTMsNDkyOTQsNDkyOTUsNDkyOTgsNDkyOTksNDkzMDEsNDkzMDIsNDkzMDMsNDkzMDUsNDkzMDYsNDkzMDcsNDkzMDgsNDkzMDksNDkzMTAsNDkzMTEsNDkzMTQsNDkzMTYsNDkzMTgsNDkzMTksNDkzMjAsNDkzMjEsNDkzMjIsNDkzMjMsNDkzMjYsNDkzMjksNDkzMzAsNDkzMzUsNDkzMzYsNDkzMzcsNDkzMzgsNDkzMzksNDkzNDIsNDkzNDYsNDkzNDcsNDkzNDgsNDkzNTAsNDkzNTEsNDkzNTQsNDkzNTUsNDkzNTcsNDkzNTgsNDkzNTksNDkzNjEsNDkzNjIsNDkzNjMsNDkzNjQsNDkzNjUsNDkzNjYsNDkzNjcsNDkzNzAsNDkzNzQsNDkzNzUsNDkzNzYsNDkzNzcsNDkzNzgsNDkzNzksNDkzODIsNDkzODMsNDkzODUsNDkzODYsNDkzODcsNDkzODksNDkzOTAsNDkzOTEsNDkzOTIsNDkzOTMsNDkzOTQsNDkzOTUsNDkzOTgsNDk0MDAsNDk0MDIsNDk0MDMsNDk0MDQsNDk0MDUsNDk0MDYsNDk0MDcsNDk0MDksNDk0MTAsNDk0MTEsNDk0MTMsNDk0MTQsNDk0MTUsNDk0MTcsNDk0MTgsNDk0MTksNDk0MjAsNDk0MjEsNDk0MjIsNDk0MjMsNDk0MjUsNDk0MjYsNDk0MjcsNDk0MjgsNDk0MzAsNDk0MzEsNDk0MzIsNDk0MzMsNDk0MzQsNDk0MzUsNDk0NDEsNDk0NDIsNDk0NDUsNDk0NDgsNDk0NDksNDk0NTAsNDk0NTEsNDk0NTQsNDk0NTgsNDk0NTksNDk0NjAsNDk0NjEsNDk0NjMsNDk0NjYsNDk0NjcsNDk0NjksNDk0NzAsNDk0NzEsNDk0NzMsNDk0NzQsNDk0NzUsNDk0NzYsNDk0NzcsNDk0NzgsNDk0NzksNDk0ODIsNDk0ODYsNDk0ODcsNDk0ODgsNDk0ODksNDk0OTAsNDk0OTEsNDk0OTQsNDk0OTUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk0OTcsNDk0OTgsNDk0OTksNDk1MDEsNDk1MDIsNDk1MDMsNDk1MDQsNDk1MDUsNDk1MDYsNDk1MDcsNDk1MTAsNDk1MTQsNDk1MTUsNDk1MTYsNDk1MTcsNDk1MTgsNDk1MTksNDk1MjEsNDk1MjIsNDk1MjMsNDk1MjUsNDk1MjYsNDk1MjcsNDk1MjksNDk1MzAsNDk1MzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk1MzIsNDk1MzMsNDk1MzQsNDk1MzUsNDk1MzYsNDk1MzcsNDk1MzgsNDk1MzksNDk1NDAsNDk1NDIsNDk1NDMsNDk1NDQsNDk1NDUsNDk1NDYsNDk1NDcsNDk1NTEsNDk1NTMsNDk1NTQsNDk1NTUsNDk1NTcsNDk1NTksNDk1NjAsNDk1NjEsNDk1NjIsNDk1NjMsNDk1NjYsNDk1NjgsNDk1NzAsNDk1NzEsNDk1NzIsNDk1NzQsNDk1NzUsNDk1NzgsNDk1NzksNDk1ODEsNDk1ODIsNDk1ODMsNDk1ODUsNDk1ODYsNDk1ODcsNDk1ODgsNDk1ODksNDk1OTAsNDk1OTEsNDk1OTIsNDk1OTMsNDk1OTQsNDk1OTUsNDk1OTYsNDk1OTgsNDk1OTksNDk2MDAsNDk2MDEsNDk2MDIsNDk2MDMsNDk2MDUsNDk2MDYsNDk2MDcsNDk2MDksNDk2MTAsNDk2MTEsNDk2MTMsNDk2MTQsNDk2MTUsNDk2MTYsNDk2MTcsNDk2MTgsNDk2MTksNDk2MjEsNDk2MjIsNDk2MjUsNDk2MjYsNDk2MjcsNDk2MjgsNDk2MjksNDk2MzAsNDk2MzEsNDk2MzMsNDk2MzQsNDk2MzUsNDk2MzcsNDk2MzgsNDk2MzksNDk2NDEsNDk2NDIsNDk2NDMsNDk2NDQsNDk2NDUsNDk2NDYsNDk2NDcsNDk2NTAsNDk2NTIsNDk2NTMsNDk2NTQsNDk2NTUsNDk2NTYsNDk2NTcsNDk2NTgsNDk2NTksNDk2NjIsNDk2NjMsNDk2NjUsNDk2NjYsNDk2NjcsNDk2NjksNDk2NzAsNDk2NzEsNDk2NzIsNDk2NzMsNDk2NzQsNDk2NzUsNDk2NzgsNDk2ODAsNDk2ODIsNDk2ODMsNDk2ODQsNDk2ODUsNDk2ODYsNDk2ODcsNDk2OTAsNDk2OTEsNDk2OTMsNDk2OTQsNDk2OTcsNDk2OTgsNDk2OTksNDk3MDAsNDk3MDEsNDk3MDIsNDk3MDMsNDk3MDYsNDk3MDgsNDk3MTAsNDk3MTIsNDk3MTUsNDk3MTcsNDk3MTgsNDk3MTksNDk3MjAsNDk3MjEsNDk3MjIsNDk3MjMsNDk3MjQsNDk3MjUsNDk3MjYsNDk3MjcsNDk3MjgsNDk3MjksNDk3MzAsNDk3MzEsNDk3MzIsNDk3MzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk3MzQsNDk3MzUsNDk3MzcsNDk3MzgsNDk3MzksNDk3NDAsNDk3NDEsNDk3NDIsNDk3NDMsNDk3NDYsNDk3NDcsNDk3NDksNDk3NTAsNDk3NTEsNDk3NTMsNDk3NTQsNDk3NTUsNDk3NTYsNDk3NTcsNDk3NTgsNDk3NTksNDk3NjEsNDk3NjIsNDk3NjMsNDk3NjQsNDk3NjYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk3NjcsNDk3NjgsNDk3NjksNDk3NzAsNDk3NzEsNDk3NzQsNDk3NzUsNDk3NzcsNDk3NzgsNDk3NzksNDk3ODEsNDk3ODIsNDk3ODMsNDk3ODQsNDk3ODUsNDk3ODYsNDk3ODcsNDk3OTAsNDk3OTIsNDk3OTQsNDk3OTUsNDk3OTYsNDk3OTcsNDk3OTgsNDk3OTksNDk4MDIsNDk4MDMsNDk4MDQsNDk4MDUsNDk4MDYsNDk4MDcsNDk4MDksNDk4MTAsNDk4MTEsNDk4MTIsNDk4MTMsNDk4MTQsNDk4MTUsNDk4MTcsNDk4MTgsNDk4MjAsNDk4MjIsNDk4MjMsNDk4MjQsNDk4MjUsNDk4MjYsNDk4MjcsNDk4MzAsNDk4MzEsNDk4MzMsNDk4MzQsNDk4MzUsNDk4MzgsNDk4MzksNDk4NDAsNDk4NDEsNDk4NDIsNDk4NDMsNDk4NDYsNDk4NDgsNDk4NTAsNDk4NTEsNDk4NTIsNDk4NTMsNDk4NTQsNDk4NTUsNDk4NTYsNDk4NTcsNDk4NTgsNDk4NTksNDk4NjAsNDk4NjEsNDk4NjIsNDk4NjMsNDk4NjQsNDk4NjUsNDk4NjYsNDk4NjcsNDk4NjgsNDk4NjksNDk4NzAsNDk4NzEsNDk4NzIsNDk4NzMsNDk4NzQsNDk4NzUsNDk4NzYsNDk4NzcsNDk4NzgsNDk4NzksNDk4ODAsNDk4ODEsNDk4ODIsNDk4ODMsNDk4ODYsNDk4ODcsNDk4ODksNDk4OTAsNDk4OTMsNDk4OTQsNDk4OTUsNDk4OTYsNDk4OTcsNDk4OTgsNDk5MDIsNDk5MDQsNDk5MDYsNDk5MDcsNDk5MDgsNDk5MDksNDk5MTEsNDk5MTQsNDk5MTcsNDk5MTgsNDk5MTksNDk5MjEsNDk5MjIsNDk5MjMsNDk5MjQsNDk5MjUsNDk5MjYsNDk5MjcsNDk5MzAsNDk5MzEsNDk5MzQsNDk5MzUsNDk5MzYsNDk5MzcsNDk5MzgsNDk5NDIsNDk5NDMsNDk5NDUsNDk5NDYsNDk5NDcsNDk5NDksNDk5NTAsNDk5NTEsNDk5NTIsNDk5NTMsNDk5NTQsNDk5NTUsNDk5NTgsNDk5NTksNDk5NjIsNDk5NjMsNDk5NjQsNDk5NjUsNDk5NjYsNDk5NjcsNDk5NjgsNDk5NjksNDk5NzAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk5NzEsNDk5NzIsNDk5NzMsNDk5NzQsNDk5NzUsNDk5NzYsNDk5NzcsNDk5NzgsNDk5NzksNDk5ODAsNDk5ODEsNDk5ODIsNDk5ODMsNDk5ODQsNDk5ODUsNDk5ODYsNDk5ODcsNDk5ODgsNDk5OTAsNDk5OTEsNDk5OTIsNDk5OTMsNDk5OTQsNDk5OTUsNDk5OTYsNDk5OTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk5OTgsNDk5OTksNTAwMDAsNTAwMDEsNTAwMDIsNTAwMDMsNTAwMDQsNTAwMDUsNTAwMDYsNTAwMDcsNTAwMDgsNTAwMDksNTAwMTAsNTAwMTEsNTAwMTIsNTAwMTMsNTAwMTQsNTAwMTUsNTAwMTYsNTAwMTcsNTAwMTgsNTAwMTksNTAwMjAsNTAwMjEsNTAwMjIsNTAwMjMsNTAwMjYsNTAwMjcsNTAwMjksNTAwMzAsNTAwMzEsNTAwMzMsNTAwMzUsNTAwMzYsNTAwMzcsNTAwMzgsNTAwMzksNTAwNDIsNTAwNDMsNTAwNDYsNTAwNDcsNTAwNDgsNTAwNDksNTAwNTAsNTAwNTEsNTAwNTMsNTAwNTQsNTAwNTUsNTAwNTcsNTAwNTgsNTAwNTksNTAwNjEsNTAwNjIsNTAwNjMsNTAwNjQsNTAwNjUsNTAwNjYsNTAwNjcsNTAwNjgsNTAwNjksNTAwNzAsNTAwNzEsNTAwNzIsNTAwNzMsNTAwNzQsNTAwNzUsNTAwNzYsNTAwNzcsNTAwNzgsNTAwNzksNTAwODAsNTAwODEsNTAwODIsNTAwODMsNTAwODQsNTAwODUsNTAwODYsNTAwODcsNTAwODgsNTAwODksNTAwOTAsNTAwOTEsNTAwOTIsNTAwOTMsNTAwOTQsNTAwOTUsNTAwOTYsNTAwOTcsNTAwOTgsNTAwOTksNTAxMDAsNTAxMDEsNTAxMDIsNTAxMDMsNTAxMDQsNTAxMDUsNTAxMDYsNTAxMDcsNTAxMDgsNTAxMDksNTAxMTAsNTAxMTEsNTAxMTMsNTAxMTQsNTAxMTUsNTAxMTYsNTAxMTcsNTAxMTgsNTAxMTksNTAxMjAsNTAxMjEsNTAxMjIsNTAxMjMsNTAxMjQsNTAxMjUsNTAxMjYsNTAxMjcsNTAxMjgsNTAxMjksNTAxMzAsNTAxMzEsNTAxMzIsNTAxMzMsNTAxMzQsNTAxMzUsNTAxMzgsNTAxMzksNTAxNDEsNTAxNDIsNTAxNDUsNTAxNDcsNTAxNDgsNTAxNDksNTAxNTAsNTAxNTEsNTAxNTQsNTAxNTUsNTAxNTYsNTAxNTgsNTAxNTksNTAxNjAsNTAxNjEsNTAxNjIsNTAxNjMsNTAxNjYsNTAxNjcsNTAxNjksNTAxNzAsNTAxNzEsNTAxNzIsNTAxNzMsNTAxNzQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTAxNzUsNTAxNzYsNTAxNzcsNTAxNzgsNTAxNzksNTAxODAsNTAxODEsNTAxODIsNTAxODMsNTAxODUsNTAxODYsNTAxODcsNTAxODgsNTAxODksNTAxOTAsNTAxOTEsNTAxOTMsNTAxOTQsNTAxOTUsNTAxOTYsNTAxOTcsNTAxOTgsNTAxOTksNTAyMDAsNTAyMDEsNTAyMDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTAyMDMsNTAyMDQsNTAyMDUsNTAyMDYsNTAyMDcsNTAyMDgsNTAyMDksNTAyMTAsNTAyMTEsNTAyMTMsNTAyMTQsNTAyMTUsNTAyMTYsNTAyMTcsNTAyMTgsNTAyMTksNTAyMjEsNTAyMjIsNTAyMjMsNTAyMjUsNTAyMjYsNTAyMjcsNTAyMjksNTAyMzAsNTAyMzEsNTAyMzIsNTAyMzMsNTAyMzQsNTAyMzUsNTAyMzgsNTAyMzksNTAyNDAsNTAyNDEsNTAyNDIsNTAyNDMsNTAyNDQsNTAyNDUsNTAyNDYsNTAyNDcsNTAyNDksNTAyNTAsNTAyNTEsNTAyNTIsNTAyNTMsNTAyNTQsNTAyNTUsNTAyNTYsNTAyNTcsNTAyNTgsNTAyNTksNTAyNjAsNTAyNjEsNTAyNjIsNTAyNjMsNTAyNjQsNTAyNjUsNTAyNjYsNTAyNjcsNTAyNjgsNTAyNjksNTAyNzAsNTAyNzEsNTAyNzIsNTAyNzMsNTAyNzQsNTAyNzUsNTAyNzgsNTAyNzksNTAyODEsNTAyODIsNTAyODMsNTAyODUsNTAyODYsNTAyODcsNTAyODgsNTAyODksNTAyOTAsNTAyOTEsNTAyOTQsNTAyOTUsNTAyOTYsNTAyOTgsNTAyOTksNTAzMDAsNTAzMDEsNTAzMDIsNTAzMDMsNTAzMDUsNTAzMDYsNTAzMDcsNTAzMDgsNTAzMDksNTAzMTAsNTAzMTEsNTAzMTIsNTAzMTMsNTAzMTQsNTAzMTUsNTAzMTYsNTAzMTcsNTAzMTgsNTAzMTksNTAzMjAsNTAzMjEsNTAzMjIsNTAzMjMsNTAzMjUsNTAzMjYsNTAzMjcsNTAzMjgsNTAzMjksNTAzMzAsNTAzMzEsNTAzMzMsNTAzMzQsNTAzMzUsNTAzMzYsNTAzMzcsNTAzMzgsNTAzMzksNTAzNDAsNTAzNDEsNTAzNDIsNTAzNDMsNTAzNDQsNTAzNDUsNTAzNDYsNTAzNDcsNTAzNDgsNTAzNDksNTAzNTAsNTAzNTEsNTAzNTIsNTAzNTMsNTAzNTQsNTAzNTUsNTAzNTYsNTAzNTcsNTAzNTgsNTAzNTksNTAzNjEsNTAzNjIsNTAzNjMsNTAzNjUsNTAzNjYsNTAzNjcsNTAzNjgsNTAzNjksNTAzNzAsNTAzNzEsNTAzNzIsNTAzNzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTAzNzQsNTAzNzUsNTAzNzYsNTAzNzcsNTAzNzgsNTAzNzksNTAzODAsNTAzODEsNTAzODIsNTAzODMsNTAzODQsNTAzODUsNTAzODYsNTAzODcsNTAzODgsNTAzODksNTAzOTAsNTAzOTEsNTAzOTIsNTAzOTMsNTAzOTQsNTAzOTUsNTAzOTYsNTAzOTcsNTAzOTgsNTAzOTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA0MDAsNTA0MDEsNTA0MDIsNTA0MDMsNTA0MDQsNTA0MDUsNTA0MDYsNTA0MDcsNTA0MDgsNTA0MTAsNTA0MTEsNTA0MTIsNTA0MTMsNTA0MTQsNTA0MTUsNTA0MTgsNTA0MTksNTA0MjEsNTA0MjIsNTA0MjMsNTA0MjUsNTA0MjcsNTA0MjgsNTA0MjksNTA0MzAsNTA0MzQsNTA0MzUsNTA0MzYsNTA0MzcsNTA0MzgsNTA0MzksNTA0NDAsNTA0NDEsNTA0NDIsNTA0NDMsNTA0NDUsNTA0NDYsNTA0NDcsNTA0NDksNTA0NTAsNTA0NTEsNTA0NTMsNTA0NTQsNTA0NTUsNTA0NTYsNTA0NTcsNTA0NTgsNTA0NTksNTA0NjEsNTA0NjIsNTA0NjMsNTA0NjQsNTA0NjUsNTA0NjYsNTA0NjcsNTA0NjgsNTA0NjksNTA0NzAsNTA0NzEsNTA0NzQsNTA0NzUsNTA0NzcsNTA0NzgsNTA0NzksNTA0ODEsNTA0ODIsNTA0ODMsNTA0ODQsNTA0ODUsNTA0ODYsNTA0ODcsNTA0OTAsNTA0OTIsNTA0OTQsNTA0OTUsNTA0OTYsNTA0OTcsNTA0OTgsNTA0OTksNTA1MDIsNTA1MDMsNTA1MDcsNTA1MTEsNTA1MTIsNTA1MTMsNTA1MTQsNTA1MTgsNTA1MjIsNTA1MjMsNTA1MjQsNTA1MjcsNTA1MzAsNTA1MzEsNTA1MzMsNTA1MzQsNTA1MzUsNTA1MzcsNTA1MzgsNTA1MzksNTA1NDAsNTA1NDEsNTA1NDIsNTA1NDMsNTA1NDYsNTA1NTAsNTA1NTEsNTA1NTIsNTA1NTMsNTA1NTQsNTA1NTUsNTA1NTgsNTA1NTksNTA1NjEsNTA1NjIsNTA1NjMsNTA1NjUsNTA1NjYsNTA1NjgsNTA1NjksNTA1NzAsNTA1NzEsNTA1NzQsNTA1NzYsNTA1NzgsNTA1NzksNTA1ODAsNTA1ODIsNTA1ODUsNTA1ODYsNTA1ODcsNTA1ODksNTA1OTAsNTA1OTEsNTA1OTMsNTA1OTQsNTA1OTUsNTA1OTYsNTA1OTcsNTA1OTgsNTA1OTksNTA2MDAsNTA2MDIsNTA2MDMsNTA2MDQsNTA2MDUsNTA2MDYsNTA2MDcsNTA2MDgsNTA2MDksNTA2MTAsNTA2MTEsNTA2MTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA2MTUsNTA2MTgsNTA2MjMsNTA2MjQsNTA2MjUsNTA2MjYsNTA2MjcsNTA2MzUsNTA2MzcsNTA2MzksNTA2NDIsNTA2NDMsNTA2NDUsNTA2NDYsNTA2NDcsNTA2NDksNTA2NTAsNTA2NTEsNTA2NTIsNTA2NTMsNTA2NTQsNTA2NTUsNTA2NTgsNTA2NjAsNTA2NjIsNTA2NjMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA2NjQsNTA2NjUsNTA2NjYsNTA2NjcsNTA2NzEsNTA2NzMsNTA2NzQsNTA2NzUsNTA2NzcsNTA2ODAsNTA2ODEsNTA2ODIsNTA2ODMsNTA2OTAsNTA2OTEsNTA2OTIsNTA2OTcsNTA2OTgsNTA2OTksNTA3MDEsNTA3MDIsNTA3MDMsNTA3MDUsNTA3MDYsNTA3MDcsNTA3MDgsNTA3MDksNTA3MTAsNTA3MTEsNTA3MTQsNTA3MTcsNTA3MTgsNTA3MTksNTA3MjAsNTA3MjEsNTA3MjIsNTA3MjMsNTA3MjYsNTA3MjcsNTA3MjksNTA3MzAsNTA3MzEsNTA3MzUsNTA3MzcsNTA3MzgsNTA3NDIsNTA3NDQsNTA3NDYsNTA3NDgsNTA3NDksNTA3NTAsNTA3NTEsNTA3NTQsNTA3NTUsNTA3NTcsNTA3NTgsNTA3NTksNTA3NjEsNTA3NjIsNTA3NjMsNTA3NjQsNTA3NjUsNTA3NjYsNTA3NjcsNTA3NzAsNTA3NzQsNTA3NzUsNTA3NzYsNTA3NzcsNTA3NzgsNTA3NzksNTA3ODIsNTA3ODMsNTA3ODUsNTA3ODYsNTA3ODcsNTA3ODgsNTA3ODksNTA3OTAsNTA3OTEsNTA3OTIsNTA3OTMsNTA3OTQsNTA3OTUsNTA3OTcsNTA3OTgsNTA4MDAsNTA4MDIsNTA4MDMsNTA4MDQsNTA4MDUsNTA4MDYsNTA4MDcsNTA4MTAsNTA4MTEsNTA4MTMsNTA4MTQsNTA4MTUsNTA4MTcsNTA4MTgsNTA4MTksNTA4MjAsNTA4MjEsNTA4MjIsNTA4MjMsNTA4MjYsNTA4MjgsNTA4MzAsNTA4MzEsNTA4MzIsNTA4MzMsNTA4MzQsNTA4MzUsNTA4MzgsNTA4MzksNTA4NDEsNTA4NDIsNTA4NDMsNTA4NDUsNTA4NDYsNTA4NDcsNTA4NDgsNTA4NDksNTA4NTAsNTA4NTEsNTA4NTQsNTA4NTYsNTA4NTgsNTA4NTksNTA4NjAsNTA4NjEsNTA4NjIsNTA4NjMsNTA4NjYsNTA4NjcsNTA4NjksNTA4NzAsNTA4NzEsNTA4NzUsNTA4NzYsNTA4NzcsNTA4NzgsNTA4NzksNTA4ODIsNTA4ODQsNTA4ODYsNTA4ODcsNTA4ODgsNTA4ODksNTA4OTAsNTA4OTEsNTA4OTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA4OTUsNTA4OTcsNTA4OTgsNTA4OTksNTA5MDEsNTA5MDIsNTA5MDMsNTA5MDQsNTA5MDUsNTA5MDYsNTA5MDcsNTA5MTAsNTA5MTEsNTA5MTQsNTA5MTUsNTA5MTYsNTA5MTcsNTA5MTgsNTA5MTksNTA5MjIsNTA5MjMsNTA5MjUsNTA5MjYsNTA5MjcsNTA5MjksNTA5MzAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA5MzEsNTA5MzIsNTA5MzMsNTA5MzQsNTA5MzUsNTA5MzgsNTA5MzksNTA5NDAsNTA5NDIsNTA5NDMsNTA5NDQsNTA5NDUsNTA5NDYsNTA5NDcsNTA5NTAsNTA5NTEsNTA5NTMsNTA5NTQsNTA5NTUsNTA5NTcsNTA5NTgsNTA5NTksNTA5NjAsNTA5NjEsNTA5NjIsNTA5NjMsNTA5NjYsNTA5NjgsNTA5NzAsNTA5NzEsNTA5NzIsNTA5NzMsNTA5NzQsNTA5NzUsNTA5NzgsNTA5NzksNTA5ODEsNTA5ODIsNTA5ODMsNTA5ODUsNTA5ODYsNTA5ODcsNTA5ODgsNTA5ODksNTA5OTAsNTA5OTEsNTA5OTQsNTA5OTYsNTA5OTgsNTEwMDAsNTEwMDEsNTEwMDIsNTEwMDMsNTEwMDYsNTEwMDcsNTEwMDksNTEwMTAsNTEwMTEsNTEwMTMsNTEwMTQsNTEwMTUsNTEwMTYsNTEwMTcsNTEwMTksNTEwMjIsNTEwMjQsNTEwMzMsNTEwMzQsNTEwMzUsNTEwMzcsNTEwMzgsNTEwMzksNTEwNDEsNTEwNDIsNTEwNDMsNTEwNDQsNTEwNDUsNTEwNDYsNTEwNDcsNTEwNDksNTEwNTAsNTEwNTIsNTEwNTMsNTEwNTQsNTEwNTUsNTEwNTYsNTEwNTcsNTEwNTgsNTEwNTksNTEwNjIsNTEwNjMsNTEwNjUsNTEwNjYsNTEwNjcsNTEwNzEsNTEwNzIsNTEwNzMsNTEwNzQsNTEwNzgsNTEwODMsNTEwODQsNTEwODUsNTEwODcsNTEwOTAsNTEwOTEsNTEwOTMsNTEwOTcsNTEwOTksNTExMDAsNTExMDEsNTExMDIsNTExMDMsNTExMDYsNTExMTEsNTExMTIsNTExMTMsNTExMTQsNTExMTUsNTExMTgsNTExMTksNTExMjEsNTExMjIsNTExMjMsNTExMjUsNTExMjYsNTExMjcsNTExMjgsNTExMjksNTExMzAsNTExMzEsNTExMzQsNTExMzgsNTExMzksNTExNDAsNTExNDEsNTExNDIsNTExNDMsNTExNDYsNTExNDcsNTExNDksNTExNTEsNTExNTMsNTExNTQsNTExNTUsNTExNTYsNTExNTcsNTExNTgsNTExNTksNTExNjEsNTExNjIsNTExNjMsNTExNjQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTExNjYsNTExNjcsNTExNjgsNTExNjksNTExNzAsNTExNzEsNTExNzMsNTExNzQsNTExNzUsNTExNzcsNTExNzgsNTExNzksNTExODEsNTExODIsNTExODMsNTExODQsNTExODUsNTExODYsNTExODcsNTExODgsNTExODksNTExOTAsNTExOTEsNTExOTIsNTExOTMsNTExOTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTExOTUsNTExOTYsNTExOTcsNTExOTgsNTExOTksNTEyMDIsNTEyMDMsNTEyMDUsNTEyMDYsNTEyMDcsNTEyMDksNTEyMTEsNTEyMTIsNTEyMTMsNTEyMTQsNTEyMTUsNTEyMTgsNTEyMjAsNTEyMjMsNTEyMjQsNTEyMjUsNTEyMjYsNTEyMjcsNTEyMzAsNTEyMzEsNTEyMzMsNTEyMzQsNTEyMzUsNTEyMzcsNTEyMzgsNTEyMzksNTEyNDAsNTEyNDEsNTEyNDIsNTEyNDMsNTEyNDYsNTEyNDgsNTEyNTAsNTEyNTEsNTEyNTIsNTEyNTMsNTEyNTQsNTEyNTUsNTEyNTcsNTEyNTgsNTEyNTksNTEyNjEsNTEyNjIsNTEyNjMsNTEyNjUsNTEyNjYsNTEyNjcsNTEyNjgsNTEyNjksNTEyNzAsNTEyNzEsNTEyNzQsNTEyNzUsNTEyNzgsNTEyNzksNTEyODAsNTEyODEsNTEyODIsNTEyODMsNTEyODUsNTEyODYsNTEyODcsNTEyODgsNTEyODksNTEyOTAsNTEyOTEsNTEyOTIsNTEyOTMsNTEyOTQsNTEyOTUsNTEyOTYsNTEyOTcsNTEyOTgsNTEyOTksNTEzMDAsNTEzMDEsNTEzMDIsNTEzMDMsNTEzMDQsNTEzMDUsNTEzMDYsNTEzMDcsNTEzMDgsNTEzMDksNTEzMTAsNTEzMTEsNTEzMTQsNTEzMTUsNTEzMTcsNTEzMTgsNTEzMTksNTEzMjEsNTEzMjMsNTEzMjQsNTEzMjUsNTEzMjYsNTEzMjcsNTEzMzAsNTEzMzIsNTEzMzYsNTEzMzcsNTEzMzgsNTEzNDIsNTEzNDMsNTEzNDQsNTEzNDUsNTEzNDYsNTEzNDcsNTEzNDksNTEzNTAsNTEzNTEsNTEzNTIsNTEzNTMsNTEzNTQsNTEzNTUsNTEzNTYsNTEzNTgsNTEzNjAsNTEzNjIsNTEzNjMsNTEzNjQsNTEzNjUsNTEzNjYsNTEzNjcsNTEzNjksNTEzNzAsNTEzNzEsNTEzNzIsNTEzNzMsNTEzNzQsNTEzNzUsNTEzNzYsNTEzNzcsNTEzNzgsNTEzNzksNTEzODAsNTEzODEsNTEzODIsNTEzODMsNTEzODQsNTEzODUsNTEzODYsNTEzODcsNTEzOTAsNTEzOTEsNTEzOTIsNTEzOTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTEzOTQsNTEzOTUsNTEzOTcsNTEzOTgsNTEzOTksNTE0MDEsNTE0MDIsNTE0MDMsNTE0MDUsNTE0MDYsNTE0MDcsNTE0MDgsNTE0MDksNTE0MTAsNTE0MTEsNTE0MTQsNTE0MTYsNTE0MTgsNTE0MTksNTE0MjAsNTE0MjEsNTE0MjIsNTE0MjMsNTE0MjYsNTE0MjcsNTE0MjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE0MzAsNTE0MzEsNTE0MzIsNTE0MzMsNTE0MzQsNTE0MzUsNTE0MzYsNTE0MzcsNTE0MzgsNTE0MzksNTE0NDAsNTE0NDEsNTE0NDIsNTE0NDMsNTE0NDQsNTE0NDYsNTE0NDcsNTE0NDgsNTE0NDksNTE0NTAsNTE0NTEsNTE0NTQsNTE0NTUsNTE0NTcsNTE0NTgsNTE0NTksNTE0NjMsNTE0NjQsNTE0NjUsNTE0NjYsNTE0NjcsNTE0NzAsMTIyODgsMTIyODksMTIyOTAsMTgzLDgyMjksODIzMCwxNjgsMTIyOTEsMTczLDgyMTMsODc0MSw2NTM0MCw4NzY0LDgyMTYsODIxNyw4MjIwLDgyMjEsMTIzMDgsMTIzMDksMTIyOTYsMTIyOTcsMTIyOTgsMTIyOTksMTIzMDAsMTIzMDEsMTIzMDIsMTIzMDMsMTIzMDQsMTIzMDUsMTc3LDIxNSwyNDcsODgwMCw4ODA0LDg4MDUsODczNCw4NzU2LDE3Niw4MjQyLDgyNDMsODQ1MSw4NDkxLDY1NTA0LDY1NTA1LDY1NTA5LDk3OTQsOTc5Miw4NzM2LDg4NjksODk3OCw4NzA2LDg3MTEsODgwMSw4Nzg2LDE2Nyw4MjUxLDk3MzQsOTczMyw5Njc1LDk2NzksOTY3OCw5NjcxLDk2NzAsOTYzMyw5NjMyLDk2NTEsOTY1MCw5NjYxLDk2NjAsODU5NCw4NTkyLDg1OTMsODU5NSw4NTk2LDEyMzA3LDg4MTAsODgxMSw4NzMwLDg3NjUsODczMyw4NzU3LDg3NDcsODc0OCw4NzEyLDg3MTUsODgzOCw4ODM5LDg4MzQsODgzNSw4NzQ2LDg3NDUsODc0Myw4NzQ0LDY1NTA2LDUxNDcyLDUxNDc0LDUxNDc1LDUxNDc2LDUxNDc3LDUxNDc4LDUxNDc5LDUxNDgxLDUxNDgyLDUxNDgzLDUxNDg0LDUxNDg1LDUxNDg2LDUxNDg3LDUxNDg4LDUxNDg5LDUxNDkwLDUxNDkxLDUxNDkyLDUxNDkzLDUxNDk0LDUxNDk1LDUxNDk2LDUxNDk3LDUxNDk4LDUxNDk5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNTAxLDUxNTAyLDUxNTAzLDUxNTA0LDUxNTA1LDUxNTA2LDUxNTA3LDUxNTA5LDUxNTEwLDUxNTExLDUxNTEyLDUxNTEzLDUxNTE0LDUxNTE1LDUxNTE2LDUxNTE3LDUxNTE4LDUxNTE5LDUxNTIwLDUxNTIxLDUxNTIyLDUxNTIzLDUxNTI0LDUxNTI1LDUxNTI2LDUxNTI3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNTI4LDUxNTI5LDUxNTMwLDUxNTMxLDUxNTMyLDUxNTMzLDUxNTM0LDUxNTM1LDUxNTM4LDUxNTM5LDUxNTQxLDUxNTQyLDUxNTQzLDUxNTQ1LDUxNTQ2LDUxNTQ3LDUxNTQ4LDUxNTQ5LDUxNTUwLDUxNTUxLDUxNTU0LDUxNTU2LDUxNTU3LDUxNTU4LDUxNTU5LDUxNTYwLDUxNTYxLDUxNTYyLDUxNTYzLDUxNTY1LDUxNTY2LDUxNTY3LDg2NTgsODY2MCw4NzA0LDg3MDcsMTgwLDY1Mzc0LDcxMSw3MjgsNzMzLDczMCw3MjksMTg0LDczMSwxNjEsMTkxLDcyMCw4NzUwLDg3MjEsODcxOSwxNjQsODQ1Nyw4MjQwLDk2NjUsOTY2NCw5NjU1LDk2NTQsOTgyOCw5ODI0LDk4MjUsOTgyOSw5ODMxLDk4MjcsODg1Nyw5NjcyLDk2MzUsOTY4MCw5NjgxLDk2MTgsOTYzNiw5NjM3LDk2NDAsOTYzOSw5NjM4LDk2NDEsOTgzMiw5NzQzLDk3NDIsOTc1Niw5NzU4LDE4Miw4MjI0LDgyMjUsODU5Nyw4NTk5LDg2MDEsODU5OCw4NjAwLDk4MzcsOTgzMyw5ODM0LDk4MzYsMTI5MjcsMTI4MjgsODQ3MCwxMzI1NSw4NDgyLDEzMjUwLDEzMjcyLDg0ODEsODM2NCwxNzQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNTY5LDUxNTcwLDUxNTcxLDUxNTczLDUxNTc0LDUxNTc1LDUxNTc2LDUxNTc3LDUxNTc4LDUxNTc5LDUxNTgxLDUxNTgyLDUxNTgzLDUxNTg0LDUxNTg1LDUxNTg2LDUxNTg3LDUxNTg4LDUxNTg5LDUxNTkwLDUxNTkxLDUxNTk0LDUxNTk1LDUxNTk3LDUxNTk4LDUxNTk5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNjAxLDUxNjAyLDUxNjAzLDUxNjA0LDUxNjA1LDUxNjA2LDUxNjA3LDUxNjEwLDUxNjEyLDUxNjE0LDUxNjE1LDUxNjE2LDUxNjE3LDUxNjE4LDUxNjE5LDUxNjIwLDUxNjIxLDUxNjIyLDUxNjIzLDUxNjI0LDUxNjI1LDUxNjI2LDUxNjI3LDUxNjI4LDUxNjI5LDUxNjMwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNjMxLDUxNjMyLDUxNjMzLDUxNjM0LDUxNjM1LDUxNjM2LDUxNjM3LDUxNjM4LDUxNjM5LDUxNjQwLDUxNjQxLDUxNjQyLDUxNjQzLDUxNjQ0LDUxNjQ1LDUxNjQ2LDUxNjQ3LDUxNjUwLDUxNjUxLDUxNjUzLDUxNjU0LDUxNjU3LDUxNjU5LDUxNjYwLDUxNjYxLDUxNjYyLDUxNjYzLDUxNjY2LDUxNjY4LDUxNjcxLDUxNjcyLDUxNjc1LDY1MjgxLDY1MjgyLDY1MjgzLDY1Mjg0LDY1Mjg1LDY1Mjg2LDY1Mjg3LDY1Mjg4LDY1Mjg5LDY1MjkwLDY1MjkxLDY1MjkyLDY1MjkzLDY1Mjk0LDY1Mjk1LDY1Mjk2LDY1Mjk3LDY1Mjk4LDY1Mjk5LDY1MzAwLDY1MzAxLDY1MzAyLDY1MzAzLDY1MzA0LDY1MzA1LDY1MzA2LDY1MzA3LDY1MzA4LDY1MzA5LDY1MzEwLDY1MzExLDY1MzEyLDY1MzEzLDY1MzE0LDY1MzE1LDY1MzE2LDY1MzE3LDY1MzE4LDY1MzE5LDY1MzIwLDY1MzIxLDY1MzIyLDY1MzIzLDY1MzI0LDY1MzI1LDY1MzI2LDY1MzI3LDY1MzI4LDY1MzI5LDY1MzMwLDY1MzMxLDY1MzMyLDY1MzMzLDY1MzM0LDY1MzM1LDY1MzM2LDY1MzM3LDY1MzM4LDY1MzM5LDY1NTEwLDY1MzQxLDY1MzQyLDY1MzQzLDY1MzQ0LDY1MzQ1LDY1MzQ2LDY1MzQ3LDY1MzQ4LDY1MzQ5LDY1MzUwLDY1MzUxLDY1MzUyLDY1MzUzLDY1MzU0LDY1MzU1LDY1MzU2LDY1MzU3LDY1MzU4LDY1MzU5LDY1MzYwLDY1MzYxLDY1MzYyLDY1MzYzLDY1MzY0LDY1MzY1LDY1MzY2LDY1MzY3LDY1MzY4LDY1MzY5LDY1MzcwLDY1MzcxLDY1MzcyLDY1MzczLDY1NTA3LDUxNjc4LDUxNjc5LDUxNjgxLDUxNjgzLDUxNjg1LDUxNjg2LDUxNjg4LDUxNjg5LDUxNjkwLDUxNjkxLDUxNjk0LDUxNjk4LDUxNjk5LDUxNzAwLDUxNzAxLDUxNzAyLDUxNzAzLDUxNzA2LDUxNzA3LDUxNzA5LDUxNzEwLDUxNzExLDUxNzEzLDUxNzE0LDUxNzE1LDUxNzE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNzE3LDUxNzE4LDUxNzE5LDUxNzIyLDUxNzI2LDUxNzI3LDUxNzI4LDUxNzI5LDUxNzMwLDUxNzMxLDUxNzMzLDUxNzM0LDUxNzM1LDUxNzM3LDUxNzM4LDUxNzM5LDUxNzQwLDUxNzQxLDUxNzQyLDUxNzQzLDUxNzQ0LDUxNzQ1LDUxNzQ2LDUxNzQ3LDUxNzQ4LDUxNzQ5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNzUwLDUxNzUxLDUxNzUyLDUxNzU0LDUxNzU1LDUxNzU2LDUxNzU3LDUxNzU4LDUxNzU5LDUxNzYwLDUxNzYxLDUxNzYyLDUxNzYzLDUxNzY0LDUxNzY1LDUxNzY2LDUxNzY3LDUxNzY4LDUxNzY5LDUxNzcwLDUxNzcxLDUxNzcyLDUxNzczLDUxNzc0LDUxNzc1LDUxNzc2LDUxNzc3LDUxNzc4LDUxNzc5LDUxNzgwLDUxNzgxLDUxNzgyLDEyNTkzLDEyNTk0LDEyNTk1LDEyNTk2LDEyNTk3LDEyNTk4LDEyNTk5LDEyNjAwLDEyNjAxLDEyNjAyLDEyNjAzLDEyNjA0LDEyNjA1LDEyNjA2LDEyNjA3LDEyNjA4LDEyNjA5LDEyNjEwLDEyNjExLDEyNjEyLDEyNjEzLDEyNjE0LDEyNjE1LDEyNjE2LDEyNjE3LDEyNjE4LDEyNjE5LDEyNjIwLDEyNjIxLDEyNjIyLDEyNjIzLDEyNjI0LDEyNjI1LDEyNjI2LDEyNjI3LDEyNjI4LDEyNjI5LDEyNjMwLDEyNjMxLDEyNjMyLDEyNjMzLDEyNjM0LDEyNjM1LDEyNjM2LDEyNjM3LDEyNjM4LDEyNjM5LDEyNjQwLDEyNjQxLDEyNjQyLDEyNjQzLDEyNjQ0LDEyNjQ1LDEyNjQ2LDEyNjQ3LDEyNjQ4LDEyNjQ5LDEyNjUwLDEyNjUxLDEyNjUyLDEyNjUzLDEyNjU0LDEyNjU1LDEyNjU2LDEyNjU3LDEyNjU4LDEyNjU5LDEyNjYwLDEyNjYxLDEyNjYyLDEyNjYzLDEyNjY0LDEyNjY1LDEyNjY2LDEyNjY3LDEyNjY4LDEyNjY5LDEyNjcwLDEyNjcxLDEyNjcyLDEyNjczLDEyNjc0LDEyNjc1LDEyNjc2LDEyNjc3LDEyNjc4LDEyNjc5LDEyNjgwLDEyNjgxLDEyNjgyLDEyNjgzLDEyNjg0LDEyNjg1LDEyNjg2LDUxNzgzLDUxNzg0LDUxNzg1LDUxNzg2LDUxNzg3LDUxNzkwLDUxNzkxLDUxNzkzLDUxNzk0LDUxNzk1LDUxNzk3LDUxNzk4LDUxNzk5LDUxODAwLDUxODAxLDUxODAyLDUxODAzLDUxODA2LDUxODEwLDUxODExLDUxODEyLDUxODEzLDUxODE0LDUxODE1LDUxODE3LDUxODE4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxODE5LDUxODIwLDUxODIxLDUxODIyLDUxODIzLDUxODI0LDUxODI1LDUxODI2LDUxODI3LDUxODI4LDUxODI5LDUxODMwLDUxODMxLDUxODMyLDUxODMzLDUxODM0LDUxODM1LDUxODM2LDUxODM4LDUxODM5LDUxODQwLDUxODQxLDUxODQyLDUxODQzLDUxODQ1LDUxODQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxODQ3LDUxODQ4LDUxODQ5LDUxODUwLDUxODUxLDUxODUyLDUxODUzLDUxODU0LDUxODU1LDUxODU2LDUxODU3LDUxODU4LDUxODU5LDUxODYwLDUxODYxLDUxODYyLDUxODYzLDUxODY1LDUxODY2LDUxODY3LDUxODY4LDUxODY5LDUxODcwLDUxODcxLDUxODcyLDUxODczLDUxODc0LDUxODc1LDUxODc2LDUxODc3LDUxODc4LDUxODc5LDg1NjAsODU2MSw4NTYyLDg1NjMsODU2NCw4NTY1LDg1NjYsODU2Nyw4NTY4LDg1NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDg1NDQsODU0NSw4NTQ2LDg1NDcsODU0OCw4NTQ5LDg1NTAsODU1MSw4NTUyLDg1NTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE4ODAsNTE4ODEsNTE4ODIsNTE4ODMsNTE4ODQsNTE4ODUsNTE4ODYsNTE4ODcsNTE4ODgsNTE4ODksNTE4OTAsNTE4OTEsNTE4OTIsNTE4OTMsNTE4OTQsNTE4OTUsNTE4OTYsNTE4OTcsNTE4OTgsNTE4OTksNTE5MDIsNTE5MDMsNTE5MDUsNTE5MDYsNTE5MDcsNTE5MDksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE5MTAsNTE5MTEsNTE5MTIsNTE5MTMsNTE5MTQsNTE5MTUsNTE5MTgsNTE5MjAsNTE5MjIsNTE5MjQsNTE5MjUsNTE5MjYsNTE5MjcsNTE5MzAsNTE5MzEsNTE5MzIsNTE5MzMsNTE5MzQsNTE5MzUsNTE5MzcsNTE5MzgsNTE5MzksNTE5NDAsNTE5NDEsNTE5NDIsNTE5NDMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE5NDQsNTE5NDUsNTE5NDYsNTE5NDcsNTE5NDksNTE5NTAsNTE5NTEsNTE5NTIsNTE5NTMsNTE5NTQsNTE5NTUsNTE5NTcsNTE5NTgsNTE5NTksNTE5NjAsNTE5NjEsNTE5NjIsNTE5NjMsNTE5NjQsNTE5NjUsNTE5NjYsNTE5NjcsNTE5NjgsNTE5NjksNTE5NzAsNTE5NzEsNTE5NzIsNTE5NzMsNTE5NzQsNTE5NzUsNTE5NzcsNTE5NzgsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDk2LDk0OTIsOTUwMCw5NTE2LDk1MDgsOTUyNCw5NTMyLDk0NzMsOTQ3NSw5NDg3LDk0OTEsOTQ5OSw5NDk1LDk1MDcsOTUyMyw5NTE1LDk1MzEsOTU0Nyw5NTA0LDk1MTksOTUxMiw5NTI3LDk1MzUsOTUwMSw5NTIwLDk1MDksOTUyOCw5NTM4LDk0OTAsOTQ4OSw5NDk4LDk0OTcsOTQ5NCw5NDkzLDk0ODYsOTQ4NSw5NTAyLDk1MDMsOTUwNSw5NTA2LDk1MTAsOTUxMSw5NTEzLDk1MTQsOTUxNyw5NTE4LDk1MjEsOTUyMiw5NTI1LDk1MjYsOTUyOSw5NTMwLDk1MzMsOTUzNCw5NTM2LDk1MzcsOTUzOSw5NTQwLDk1NDEsOTU0Miw5NTQzLDk1NDQsOTU0NSw5NTQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTk3OSw1MTk4MCw1MTk4MSw1MTk4Miw1MTk4Myw1MTk4NSw1MTk4Niw1MTk4Nyw1MTk4OSw1MTk5MCw1MTk5MSw1MTk5Myw1MTk5NCw1MTk5NSw1MTk5Niw1MTk5Nyw1MTk5OCw1MTk5OSw1MjAwMiw1MjAwMyw1MjAwNCw1MjAwNSw1MjAwNiw1MjAwNyw1MjAwOCw1MjAwOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjAxMCw1MjAxMSw1MjAxMiw1MjAxMyw1MjAxNCw1MjAxNSw1MjAxNiw1MjAxNyw1MjAxOCw1MjAxOSw1MjAyMCw1MjAyMSw1MjAyMiw1MjAyMyw1MjAyNCw1MjAyNSw1MjAyNiw1MjAyNyw1MjAyOCw1MjAyOSw1MjAzMCw1MjAzMSw1MjAzMiw1MjAzNCw1MjAzNSw1MjAzNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjAzNyw1MjAzOCw1MjAzOSw1MjA0Miw1MjA0Myw1MjA0NSw1MjA0Niw1MjA0Nyw1MjA0OSw1MjA1MCw1MjA1MSw1MjA1Miw1MjA1Myw1MjA1NCw1MjA1NSw1MjA1OCw1MjA1OSw1MjA2MCw1MjA2Miw1MjA2Myw1MjA2NCw1MjA2NSw1MjA2Niw1MjA2Nyw1MjA2OSw1MjA3MCw1MjA3MSw1MjA3Miw1MjA3Myw1MjA3NCw1MjA3NSw1MjA3NiwxMzIwNSwxMzIwNiwxMzIwNyw4NDY3LDEzMjA4LDEzMjUyLDEzMjE5LDEzMjIwLDEzMjIxLDEzMjIyLDEzMjA5LDEzMjEwLDEzMjExLDEzMjEyLDEzMjEzLDEzMjE0LDEzMjE1LDEzMjE2LDEzMjE3LDEzMjE4LDEzMjU4LDEzMTk3LDEzMTk4LDEzMTk5LDEzMjYzLDEzMTkyLDEzMTkzLDEzMjU2LDEzMjIzLDEzMjI0LDEzMjMyLDEzMjMzLDEzMjM0LDEzMjM1LDEzMjM2LDEzMjM3LDEzMjM4LDEzMjM5LDEzMjQwLDEzMjQxLDEzMTg0LDEzMTg1LDEzMTg2LDEzMTg3LDEzMTg4LDEzMjQyLDEzMjQzLDEzMjQ0LDEzMjQ1LDEzMjQ2LDEzMjQ3LDEzMjAwLDEzMjAxLDEzMjAyLDEzMjAzLDEzMjA0LDg0ODYsMTMyNDgsMTMyNDksMTMxOTQsMTMxOTUsMTMxOTYsMTMyNzAsMTMyNTMsMTMyMjksMTMyMzAsMTMyMzEsMTMyNzUsMTMyMjUsMTMyMjYsMTMyMjcsMTMyMjgsMTMyNzcsMTMyNjQsMTMyNjcsMTMyNTEsMTMyNTcsMTMyNzYsMTMyNTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIwNzcsNTIwNzgsNTIwNzksNTIwODAsNTIwODEsNTIwODIsNTIwODMsNTIwODQsNTIwODUsNTIwODYsNTIwODcsNTIwOTAsNTIwOTEsNTIwOTIsNTIwOTMsNTIwOTQsNTIwOTUsNTIwOTYsNTIwOTcsNTIwOTgsNTIwOTksNTIxMDAsNTIxMDEsNTIxMDIsNTIxMDMsNTIxMDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIxMDUsNTIxMDYsNTIxMDcsNTIxMDgsNTIxMDksNTIxMTAsNTIxMTEsNTIxMTIsNTIxMTMsNTIxMTQsNTIxMTUsNTIxMTYsNTIxMTcsNTIxMTgsNTIxMTksNTIxMjAsNTIxMjEsNTIxMjIsNTIxMjMsNTIxMjUsNTIxMjYsNTIxMjcsNTIxMjgsNTIxMjksNTIxMzAsNTIxMzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIxMzIsNTIxMzMsNTIxMzQsNTIxMzUsNTIxMzYsNTIxMzcsNTIxMzgsNTIxMzksNTIxNDAsNTIxNDEsNTIxNDIsNTIxNDMsNTIxNDQsNTIxNDUsNTIxNDYsNTIxNDcsNTIxNDgsNTIxNDksNTIxNTAsNTIxNTEsNTIxNTMsNTIxNTQsNTIxNTUsNTIxNTYsNTIxNTcsNTIxNTgsNTIxNTksNTIxNjAsNTIxNjEsNTIxNjIsNTIxNjMsNTIxNjQsMTk4LDIwOCwxNzAsMjk0LG51bGwsMzA2LG51bGwsMzE5LDMyMSwyMTYsMzM4LDE4NiwyMjIsMzU4LDMzMCxudWxsLDEyODk2LDEyODk3LDEyODk4LDEyODk5LDEyOTAwLDEyOTAxLDEyOTAyLDEyOTAzLDEyOTA0LDEyOTA1LDEyOTA2LDEyOTA3LDEyOTA4LDEyOTA5LDEyOTEwLDEyOTExLDEyOTEyLDEyOTEzLDEyOTE0LDEyOTE1LDEyOTE2LDEyOTE3LDEyOTE4LDEyOTE5LDEyOTIwLDEyOTIxLDEyOTIyLDEyOTIzLDk0MjQsOTQyNSw5NDI2LDk0MjcsOTQyOCw5NDI5LDk0MzAsOTQzMSw5NDMyLDk0MzMsOTQzNCw5NDM1LDk0MzYsOTQzNyw5NDM4LDk0MzksOTQ0MCw5NDQxLDk0NDIsOTQ0Myw5NDQ0LDk0NDUsOTQ0Niw5NDQ3LDk0NDgsOTQ0OSw5MzEyLDkzMTMsOTMxNCw5MzE1LDkzMTYsOTMxNyw5MzE4LDkzMTksOTMyMCw5MzIxLDkzMjIsOTMyMyw5MzI0LDkzMjUsOTMyNiwxODksODUzMSw4NTMyLDE4OCwxOTAsODUzOSw4NTQwLDg1NDEsODU0Miw1MjE2NSw1MjE2Niw1MjE2Nyw1MjE2OCw1MjE2OSw1MjE3MCw1MjE3MSw1MjE3Miw1MjE3Myw1MjE3NCw1MjE3NSw1MjE3Niw1MjE3Nyw1MjE3OCw1MjE3OSw1MjE4MSw1MjE4Miw1MjE4Myw1MjE4NCw1MjE4NSw1MjE4Niw1MjE4Nyw1MjE4OCw1MjE4OSw1MjE5MCw1MjE5MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjE5Miw1MjE5Myw1MjE5NCw1MjE5NSw1MjE5Nyw1MjE5OCw1MjIwMCw1MjIwMiw1MjIwMyw1MjIwNCw1MjIwNSw1MjIwNiw1MjIwNyw1MjIwOCw1MjIwOSw1MjIxMCw1MjIxMSw1MjIxMiw1MjIxMyw1MjIxNCw1MjIxNSw1MjIxNiw1MjIxNyw1MjIxOCw1MjIxOSw1MjIyMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjIyMSw1MjIyMiw1MjIyMyw1MjIyNCw1MjIyNSw1MjIyNiw1MjIyNyw1MjIyOCw1MjIyOSw1MjIzMCw1MjIzMSw1MjIzMiw1MjIzMyw1MjIzNCw1MjIzNSw1MjIzOCw1MjIzOSw1MjI0MSw1MjI0Miw1MjI0Myw1MjI0NSw1MjI0Niw1MjI0Nyw1MjI0OCw1MjI0OSw1MjI1MCw1MjI1MSw1MjI1NCw1MjI1NSw1MjI1Niw1MjI1OSw1MjI2MCwyMzAsMjczLDI0MCwyOTUsMzA1LDMwNywzMTIsMzIwLDMyMiwyNDgsMzM5LDIyMywyNTQsMzU5LDMzMSwzMjksMTI4MDAsMTI4MDEsMTI4MDIsMTI4MDMsMTI4MDQsMTI4MDUsMTI4MDYsMTI4MDcsMTI4MDgsMTI4MDksMTI4MTAsMTI4MTEsMTI4MTIsMTI4MTMsMTI4MTQsMTI4MTUsMTI4MTYsMTI4MTcsMTI4MTgsMTI4MTksMTI4MjAsMTI4MjEsMTI4MjIsMTI4MjMsMTI4MjQsMTI4MjUsMTI4MjYsMTI4MjcsOTM3Miw5MzczLDkzNzQsOTM3NSw5Mzc2LDkzNzcsOTM3OCw5Mzc5LDkzODAsOTM4MSw5MzgyLDkzODMsOTM4NCw5Mzg1LDkzODYsOTM4Nyw5Mzg4LDkzODksOTM5MCw5MzkxLDkzOTIsOTM5Myw5Mzk0LDkzOTUsOTM5Niw5Mzk3LDkzMzIsOTMzMyw5MzM0LDkzMzUsOTMzNiw5MzM3LDkzMzgsOTMzOSw5MzQwLDkzNDEsOTM0Miw5MzQzLDkzNDQsOTM0NSw5MzQ2LDE4NSwxNzgsMTc5LDgzMDgsODMxOSw4MzIxLDgzMjIsODMyMyw4MzI0LDUyMjYxLDUyMjYyLDUyMjY2LDUyMjY3LDUyMjY5LDUyMjcxLDUyMjczLDUyMjc0LDUyMjc1LDUyMjc2LDUyMjc3LDUyMjc4LDUyMjc5LDUyMjgyLDUyMjg3LDUyMjg4LDUyMjg5LDUyMjkwLDUyMjkxLDUyMjk0LDUyMjk1LDUyMjk3LDUyMjk4LDUyMjk5LDUyMzAxLDUyMzAyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMzAzLDUyMzA0LDUyMzA1LDUyMzA2LDUyMzA3LDUyMzEwLDUyMzE0LDUyMzE1LDUyMzE2LDUyMzE3LDUyMzE4LDUyMzE5LDUyMzIxLDUyMzIyLDUyMzIzLDUyMzI1LDUyMzI3LDUyMzI5LDUyMzMwLDUyMzMxLDUyMzMyLDUyMzMzLDUyMzM0LDUyMzM1LDUyMzM3LDUyMzM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMzM5LDUyMzQwLDUyMzQyLDUyMzQzLDUyMzQ0LDUyMzQ1LDUyMzQ2LDUyMzQ3LDUyMzQ4LDUyMzQ5LDUyMzUwLDUyMzUxLDUyMzUyLDUyMzUzLDUyMzU0LDUyMzU1LDUyMzU2LDUyMzU3LDUyMzU4LDUyMzU5LDUyMzYwLDUyMzYxLDUyMzYyLDUyMzYzLDUyMzY0LDUyMzY1LDUyMzY2LDUyMzY3LDUyMzY4LDUyMzY5LDUyMzcwLDUyMzcxLDEyMzUzLDEyMzU0LDEyMzU1LDEyMzU2LDEyMzU3LDEyMzU4LDEyMzU5LDEyMzYwLDEyMzYxLDEyMzYyLDEyMzYzLDEyMzY0LDEyMzY1LDEyMzY2LDEyMzY3LDEyMzY4LDEyMzY5LDEyMzcwLDEyMzcxLDEyMzcyLDEyMzczLDEyMzc0LDEyMzc1LDEyMzc2LDEyMzc3LDEyMzc4LDEyMzc5LDEyMzgwLDEyMzgxLDEyMzgyLDEyMzgzLDEyMzg0LDEyMzg1LDEyMzg2LDEyMzg3LDEyMzg4LDEyMzg5LDEyMzkwLDEyMzkxLDEyMzkyLDEyMzkzLDEyMzk0LDEyMzk1LDEyMzk2LDEyMzk3LDEyMzk4LDEyMzk5LDEyNDAwLDEyNDAxLDEyNDAyLDEyNDAzLDEyNDA0LDEyNDA1LDEyNDA2LDEyNDA3LDEyNDA4LDEyNDA5LDEyNDEwLDEyNDExLDEyNDEyLDEyNDEzLDEyNDE0LDEyNDE1LDEyNDE2LDEyNDE3LDEyNDE4LDEyNDE5LDEyNDIwLDEyNDIxLDEyNDIyLDEyNDIzLDEyNDI0LDEyNDI1LDEyNDI2LDEyNDI3LDEyNDI4LDEyNDI5LDEyNDMwLDEyNDMxLDEyNDMyLDEyNDMzLDEyNDM0LDEyNDM1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjM3Miw1MjM3Myw1MjM3NCw1MjM3NSw1MjM3OCw1MjM3OSw1MjM4MSw1MjM4Miw1MjM4Myw1MjM4NSw1MjM4Niw1MjM4Nyw1MjM4OCw1MjM4OSw1MjM5MCw1MjM5MSw1MjM5NCw1MjM5OCw1MjM5OSw1MjQwMCw1MjQwMSw1MjQwMiw1MjQwMyw1MjQwNiw1MjQwNyw1MjQwOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjQxMCw1MjQxMSw1MjQxMyw1MjQxNCw1MjQxNSw1MjQxNiw1MjQxNyw1MjQxOCw1MjQxOSw1MjQyMiw1MjQyNCw1MjQyNiw1MjQyNyw1MjQyOCw1MjQyOSw1MjQzMCw1MjQzMSw1MjQzMyw1MjQzNCw1MjQzNSw1MjQzNyw1MjQzOCw1MjQzOSw1MjQ0MCw1MjQ0MSw1MjQ0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjQ0Myw1MjQ0NCw1MjQ0NSw1MjQ0Niw1MjQ0Nyw1MjQ0OCw1MjQ0OSw1MjQ1MCw1MjQ1MSw1MjQ1Myw1MjQ1NCw1MjQ1NSw1MjQ1Niw1MjQ1Nyw1MjQ1OCw1MjQ1OSw1MjQ2MSw1MjQ2Miw1MjQ2Myw1MjQ2NSw1MjQ2Niw1MjQ2Nyw1MjQ2OCw1MjQ2OSw1MjQ3MCw1MjQ3MSw1MjQ3Miw1MjQ3Myw1MjQ3NCw1MjQ3NSw1MjQ3Niw1MjQ3NywxMjQ0OSwxMjQ1MCwxMjQ1MSwxMjQ1MiwxMjQ1MywxMjQ1NCwxMjQ1NSwxMjQ1NiwxMjQ1NywxMjQ1OCwxMjQ1OSwxMjQ2MCwxMjQ2MSwxMjQ2MiwxMjQ2MywxMjQ2NCwxMjQ2NSwxMjQ2NiwxMjQ2NywxMjQ2OCwxMjQ2OSwxMjQ3MCwxMjQ3MSwxMjQ3MiwxMjQ3MywxMjQ3NCwxMjQ3NSwxMjQ3NiwxMjQ3NywxMjQ3OCwxMjQ3OSwxMjQ4MCwxMjQ4MSwxMjQ4MiwxMjQ4MywxMjQ4NCwxMjQ4NSwxMjQ4NiwxMjQ4NywxMjQ4OCwxMjQ4OSwxMjQ5MCwxMjQ5MSwxMjQ5MiwxMjQ5MywxMjQ5NCwxMjQ5NSwxMjQ5NiwxMjQ5NywxMjQ5OCwxMjQ5OSwxMjUwMCwxMjUwMSwxMjUwMiwxMjUwMywxMjUwNCwxMjUwNSwxMjUwNiwxMjUwNywxMjUwOCwxMjUwOSwxMjUxMCwxMjUxMSwxMjUxMiwxMjUxMywxMjUxNCwxMjUxNSwxMjUxNiwxMjUxNywxMjUxOCwxMjUxOSwxMjUyMCwxMjUyMSwxMjUyMiwxMjUyMywxMjUyNCwxMjUyNSwxMjUyNiwxMjUyNywxMjUyOCwxMjUyOSwxMjUzMCwxMjUzMSwxMjUzMiwxMjUzMywxMjUzNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI0NzgsNTI0NzksNTI0ODAsNTI0ODIsNTI0ODMsNTI0ODQsNTI0ODUsNTI0ODYsNTI0ODcsNTI0OTAsNTI0OTEsNTI0OTMsNTI0OTQsNTI0OTUsNTI0OTcsNTI0OTgsNTI0OTksNTI1MDAsNTI1MDEsNTI1MDIsNTI1MDMsNTI1MDYsNTI1MDgsNTI1MTAsNTI1MTEsNTI1MTIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI1MTMsNTI1MTQsNTI1MTUsNTI1MTcsNTI1MTgsNTI1MTksNTI1MjEsNTI1MjIsNTI1MjMsNTI1MjUsNTI1MjYsNTI1MjcsNTI1MjgsNTI1MjksNTI1MzAsNTI1MzEsNTI1MzIsNTI1MzMsNTI1MzQsNTI1MzUsNTI1MzYsNTI1MzgsNTI1MzksNTI1NDAsNTI1NDEsNTI1NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI1NDMsNTI1NDQsNTI1NDUsNTI1NDYsNTI1NDcsNTI1NDgsNTI1NDksNTI1NTAsNTI1NTEsNTI1NTIsNTI1NTMsNTI1NTQsNTI1NTUsNTI1NTYsNTI1NTcsNTI1NTgsNTI1NTksNTI1NjAsNTI1NjEsNTI1NjIsNTI1NjMsNTI1NjQsNTI1NjUsNTI1NjYsNTI1NjcsNTI1NjgsNTI1NjksNTI1NzAsNTI1NzEsNTI1NzMsNTI1NzQsNTI1NzUsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTAyNSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTEwNSwxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjU3Nyw1MjU3OCw1MjU3OSw1MjU4MSw1MjU4Miw1MjU4Myw1MjU4NCw1MjU4NSw1MjU4Niw1MjU4Nyw1MjU5MCw1MjU5Miw1MjU5NCw1MjU5NSw1MjU5Niw1MjU5Nyw1MjU5OCw1MjU5OSw1MjYwMSw1MjYwMiw1MjYwMyw1MjYwNCw1MjYwNSw1MjYwNiw1MjYwNyw1MjYwOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjYwOSw1MjYxMCw1MjYxMSw1MjYxMiw1MjYxMyw1MjYxNCw1MjYxNSw1MjYxNyw1MjYxOCw1MjYxOSw1MjYyMCw1MjYyMSw1MjYyMiw1MjYyMyw1MjYyNCw1MjYyNSw1MjYyNiw1MjYyNyw1MjYzMCw1MjYzMSw1MjYzMyw1MjYzNCw1MjYzNSw1MjYzNyw1MjYzOCw1MjYzOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjY0MCw1MjY0MSw1MjY0Miw1MjY0Myw1MjY0Niw1MjY0OCw1MjY1MCw1MjY1MSw1MjY1Miw1MjY1Myw1MjY1NCw1MjY1NSw1MjY1Nyw1MjY1OCw1MjY1OSw1MjY2MCw1MjY2MSw1MjY2Miw1MjY2Myw1MjY2NCw1MjY2NSw1MjY2Niw1MjY2Nyw1MjY2OCw1MjY2OSw1MjY3MCw1MjY3MSw1MjY3Miw1MjY3Myw1MjY3NCw1MjY3NSw1MjY3NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNjc4LDUyNjc5LDUyNjgwLDUyNjgxLDUyNjgyLDUyNjgzLDUyNjg1LDUyNjg2LDUyNjg3LDUyNjg5LDUyNjkwLDUyNjkxLDUyNjkyLDUyNjkzLDUyNjk0LDUyNjk1LDUyNjk2LDUyNjk3LDUyNjk4LDUyNjk5LDUyNzAwLDUyNzAxLDUyNzAyLDUyNzAzLDUyNzA0LDUyNzA1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNzA2LDUyNzA3LDUyNzA4LDUyNzA5LDUyNzEwLDUyNzExLDUyNzEzLDUyNzE0LDUyNzE1LDUyNzE3LDUyNzE4LDUyNzE5LDUyNzIxLDUyNzIyLDUyNzIzLDUyNzI0LDUyNzI1LDUyNzI2LDUyNzI3LDUyNzMwLDUyNzMyLDUyNzM0LDUyNzM1LDUyNzM2LDUyNzM3LDUyNzM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNzM5LDUyNzQxLDUyNzQyLDUyNzQzLDUyNzQ1LDUyNzQ2LDUyNzQ3LDUyNzQ5LDUyNzUwLDUyNzUxLDUyNzUyLDUyNzUzLDUyNzU0LDUyNzU1LDUyNzU3LDUyNzU4LDUyNzU5LDUyNzYwLDUyNzYyLDUyNzYzLDUyNzY0LDUyNzY1LDUyNzY2LDUyNzY3LDUyNzcwLDUyNzcxLDUyNzczLDUyNzc0LDUyNzc1LDUyNzc3LDUyNzc4LDUyNzc5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI3ODAsNTI3ODEsNTI3ODIsNTI3ODMsNTI3ODYsNTI3ODgsNTI3OTAsNTI3OTEsNTI3OTIsNTI3OTMsNTI3OTQsNTI3OTUsNTI3OTYsNTI3OTcsNTI3OTgsNTI3OTksNTI4MDAsNTI4MDEsNTI4MDIsNTI4MDMsNTI4MDQsNTI4MDUsNTI4MDYsNTI4MDcsNTI4MDgsNTI4MDksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI4MTAsNTI4MTEsNTI4MTIsNTI4MTMsNTI4MTQsNTI4MTUsNTI4MTYsNTI4MTcsNTI4MTgsNTI4MTksNTI4MjAsNTI4MjEsNTI4MjIsNTI4MjMsNTI4MjYsNTI4MjcsNTI4MjksNTI4MzAsNTI4MzQsNTI4MzUsNTI4MzYsNTI4MzcsNTI4MzgsNTI4MzksNTI4NDIsNTI4NDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI4NDYsNTI4NDcsNTI4NDgsNTI4NDksNTI4NTAsNTI4NTEsNTI4NTQsNTI4NTUsNTI4NTcsNTI4NTgsNTI4NTksNTI4NjEsNTI4NjIsNTI4NjMsNTI4NjQsNTI4NjUsNTI4NjYsNTI4NjcsNTI4NzAsNTI4NzIsNTI4NzQsNTI4NzUsNTI4NzYsNTI4NzcsNTI4NzgsNTI4NzksNTI4ODIsNTI4ODMsNTI4ODUsNTI4ODYsNTI4ODcsNTI4ODksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mjg5MCw1Mjg5MSw1Mjg5Miw1Mjg5Myw1Mjg5NCw1Mjg5NSw1Mjg5OCw1MjkwMiw1MjkwMyw1MjkwNCw1MjkwNSw1MjkwNiw1MjkwNyw1MjkxMCw1MjkxMSw1MjkxMiw1MjkxMyw1MjkxNCw1MjkxNSw1MjkxNiw1MjkxNyw1MjkxOCw1MjkxOSw1MjkyMCw1MjkyMSw1MjkyMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjkyMyw1MjkyNCw1MjkyNSw1MjkyNiw1MjkyNyw1MjkyOCw1MjkzMCw1MjkzMSw1MjkzMiw1MjkzMyw1MjkzNCw1MjkzNSw1MjkzNiw1MjkzNyw1MjkzOCw1MjkzOSw1Mjk0MCw1Mjk0MSw1Mjk0Miw1Mjk0Myw1Mjk0NCw1Mjk0NSw1Mjk0Niw1Mjk0Nyw1Mjk0OCw1Mjk0OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mjk1MCw1Mjk1MSw1Mjk1Miw1Mjk1Myw1Mjk1NCw1Mjk1NSw1Mjk1Niw1Mjk1Nyw1Mjk1OCw1Mjk1OSw1Mjk2MCw1Mjk2MSw1Mjk2Miw1Mjk2Myw1Mjk2Niw1Mjk2Nyw1Mjk2OSw1Mjk3MCw1Mjk3Myw1Mjk3NCw1Mjk3NSw1Mjk3Niw1Mjk3Nyw1Mjk3OCw1Mjk3OSw1Mjk4Miw1Mjk4Niw1Mjk4Nyw1Mjk4OCw1Mjk4OSw1Mjk5MCw1Mjk5MSw0NDAzMiw0NDAzMyw0NDAzNiw0NDAzOSw0NDA0MCw0NDA0MSw0NDA0Miw0NDA0OCw0NDA0OSw0NDA1MCw0NDA1MSw0NDA1Miw0NDA1Myw0NDA1NCw0NDA1NSw0NDA1Nyw0NDA1OCw0NDA1OSw0NDA2MCw0NDA2MSw0NDA2NCw0NDA2OCw0NDA3Niw0NDA3Nyw0NDA3OSw0NDA4MCw0NDA4MSw0NDA4OCw0NDA4OSw0NDA5Miw0NDA5Niw0NDEwNyw0NDEwOSw0NDExNiw0NDEyMCw0NDEyNCw0NDE0NCw0NDE0NSw0NDE0OCw0NDE1MSw0NDE1Miw0NDE1NCw0NDE2MCw0NDE2MSw0NDE2Myw0NDE2NCw0NDE2NSw0NDE2Niw0NDE2OSw0NDE3MCw0NDE3MSw0NDE3Miw0NDE3Niw0NDE4MCw0NDE4OCw0NDE4OSw0NDE5MSw0NDE5Miw0NDE5Myw0NDIwMCw0NDIwMSw0NDIwMiw0NDIwNCw0NDIwNyw0NDIwOCw0NDIxNiw0NDIxNyw0NDIxOSw0NDIyMCw0NDIyMSw0NDIyNSw0NDIyOCw0NDIzMiw0NDIzNiw0NDI0NSw0NDI0Nyw0NDI1Niw0NDI1Nyw0NDI2MCw0NDI2Myw0NDI2NCw0NDI2Niw0NDI2OCw0NDI3MSw0NDI3Miw0NDI3Myw0NDI3NSw0NDI3Nyw0NDI3OCw0NDI4NCw0NDI4NSw0NDI4OCw0NDI5Miw0NDI5NCw1Mjk5NCw1Mjk5NSw1Mjk5Nyw1Mjk5OCw1Mjk5OSw1MzAwMSw1MzAwMiw1MzAwMyw1MzAwNCw1MzAwNSw1MzAwNiw1MzAwNyw1MzAxMCw1MzAxMiw1MzAxNCw1MzAxNSw1MzAxNiw1MzAxNyw1MzAxOCw1MzAxOSw1MzAyMSw1MzAyMiw1MzAyMyw1MzAyNSw1MzAyNiw1MzAyNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzAyOSw1MzAzMCw1MzAzMSw1MzAzMiw1MzAzMyw1MzAzNCw1MzAzNSw1MzAzOCw1MzA0Miw1MzA0Myw1MzA0NCw1MzA0NSw1MzA0Niw1MzA0Nyw1MzA0OSw1MzA1MCw1MzA1MSw1MzA1Miw1MzA1Myw1MzA1NCw1MzA1NSw1MzA1Niw1MzA1Nyw1MzA1OCw1MzA1OSw1MzA2MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzA2MSw1MzA2Miw1MzA2Myw1MzA2NCw1MzA2NSw1MzA2Niw1MzA2Nyw1MzA2OCw1MzA2OSw1MzA3MCw1MzA3MSw1MzA3Miw1MzA3Myw1MzA3NCw1MzA3NSw1MzA3OCw1MzA3OSw1MzA4MSw1MzA4Miw1MzA4Myw1MzA4NSw1MzA4Niw1MzA4Nyw1MzA4OCw1MzA4OSw1MzA5MCw1MzA5MSw1MzA5NCw1MzA5Niw1MzA5OCw1MzA5OSw1MzEwMCw0NDMwMCw0NDMwMSw0NDMwMyw0NDMwNSw0NDMxMiw0NDMxNiw0NDMyMCw0NDMyOSw0NDMzMiw0NDMzMyw0NDM0MCw0NDM0MSw0NDM0NCw0NDM0OCw0NDM1Niw0NDM1Nyw0NDM1OSw0NDM2MSw0NDM2OCw0NDM3Miw0NDM3Niw0NDM4NSw0NDM4Nyw0NDM5Niw0NDM5Nyw0NDQwMCw0NDQwMyw0NDQwNCw0NDQwNSw0NDQwNiw0NDQxMSw0NDQxMiw0NDQxMyw0NDQxNSw0NDQxNyw0NDQxOCw0NDQyNCw0NDQyNSw0NDQyOCw0NDQzMiw0NDQ0NCw0NDQ0NSw0NDQ1Miw0NDQ3MSw0NDQ4MCw0NDQ4MSw0NDQ4NCw0NDQ4OCw0NDQ5Niw0NDQ5Nyw0NDQ5OSw0NDUwOCw0NDUxMiw0NDUxNiw0NDUzNiw0NDUzNyw0NDU0MCw0NDU0Myw0NDU0NCw0NDU0NSw0NDU1Miw0NDU1Myw0NDU1NSw0NDU1Nyw0NDU2NCw0NDU5Miw0NDU5Myw0NDU5Niw0NDU5OSw0NDYwMCw0NDYwMiw0NDYwOCw0NDYwOSw0NDYxMSw0NDYxMyw0NDYxNCw0NDYxOCw0NDYyMCw0NDYyMSw0NDYyMiw0NDYyNCw0NDYyOCw0NDYzMCw0NDYzNiw0NDYzNyw0NDYzOSw0NDY0MCw0NDY0MSw0NDY0NSw0NDY0OCw0NDY0OSw0NDY1Miw0NDY1Niw0NDY2NCw1MzEwMSw1MzEwMiw1MzEwMyw1MzEwNiw1MzEwNyw1MzEwOSw1MzExMCw1MzExMSw1MzExMyw1MzExNCw1MzExNSw1MzExNiw1MzExNyw1MzExOCw1MzExOSw1MzEyMSw1MzEyMiw1MzEyMyw1MzEyNCw1MzEyNiw1MzEyNyw1MzEyOCw1MzEyOSw1MzEzMCw1MzEzMSw1MzEzMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzEzNCw1MzEzNSw1MzEzNiw1MzEzNyw1MzEzOCw1MzEzOSw1MzE0MCw1MzE0MSw1MzE0Miw1MzE0Myw1MzE0NCw1MzE0NSw1MzE0Niw1MzE0Nyw1MzE0OCw1MzE0OSw1MzE1MCw1MzE1MSw1MzE1Miw1MzE1NCw1MzE1NSw1MzE1Niw1MzE1Nyw1MzE1OCw1MzE1OSw1MzE2MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzE2Miw1MzE2Myw1MzE2NCw1MzE2NSw1MzE2Niw1MzE2Nyw1MzE2OSw1MzE3MCw1MzE3MSw1MzE3Miw1MzE3Myw1MzE3NCw1MzE3NSw1MzE3Niw1MzE3Nyw1MzE3OCw1MzE3OSw1MzE4MCw1MzE4MSw1MzE4Miw1MzE4Myw1MzE4NCw1MzE4NSw1MzE4Niw1MzE4Nyw1MzE4OSw1MzE5MCw1MzE5MSw1MzE5Miw1MzE5Myw1MzE5NCw1MzE5NSw0NDY2NSw0NDY2Nyw0NDY2OCw0NDY2OSw0NDY3Niw0NDY3Nyw0NDY4NCw0NDczMiw0NDczMyw0NDczNCw0NDczNiw0NDc0MCw0NDc0OCw0NDc0OSw0NDc1MSw0NDc1Miw0NDc1Myw0NDc2MCw0NDc2MSw0NDc2NCw0NDc3Niw0NDc3OSw0NDc4MSw0NDc4OCw0NDc5Miw0NDc5Niw0NDgwNyw0NDgwOCw0NDgxMyw0NDgxNiw0NDg0NCw0NDg0NSw0NDg0OCw0NDg1MCw0NDg1Miw0NDg2MCw0NDg2MSw0NDg2Myw0NDg2NSw0NDg2Niw0NDg2Nyw0NDg3Miw0NDg3Myw0NDg4MCw0NDg5Miw0NDg5Myw0NDkwMCw0NDkwMSw0NDkyMSw0NDkyOCw0NDkzMiw0NDkzNiw0NDk0NCw0NDk0NSw0NDk0OSw0NDk1Niw0NDk4NCw0NDk4NSw0NDk4OCw0NDk5Miw0NDk5OSw0NTAwMCw0NTAwMSw0NTAwMyw0NTAwNSw0NTAwNiw0NTAxMiw0NTAyMCw0NTAzMiw0NTAzMyw0NTA0MCw0NTA0MSw0NTA0NCw0NTA0OCw0NTA1Niw0NTA1Nyw0NTA2MCw0NTA2OCw0NTA3Miw0NTA3Niw0NTA4NCw0NTA4NSw0NTA5Niw0NTEyNCw0NTEyNSw0NTEyOCw0NTEzMCw0NTEzMiw0NTEzNCw0NTEzOSw0NTE0MCw0NTE0MSw0NTE0Myw0NTE0NSw1MzE5Niw1MzE5Nyw1MzE5OCw1MzE5OSw1MzIwMCw1MzIwMSw1MzIwMiw1MzIwMyw1MzIwNCw1MzIwNSw1MzIwNiw1MzIwNyw1MzIwOCw1MzIwOSw1MzIxMCw1MzIxMSw1MzIxMiw1MzIxMyw1MzIxNCw1MzIxNSw1MzIxOCw1MzIxOSw1MzIyMSw1MzIyMiw1MzIyMyw1MzIyNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzIyNiw1MzIyNyw1MzIyOCw1MzIyOSw1MzIzMCw1MzIzMSw1MzIzNCw1MzIzNiw1MzIzOCw1MzIzOSw1MzI0MCw1MzI0MSw1MzI0Miw1MzI0Myw1MzI0NSw1MzI0Niw1MzI0Nyw1MzI0OSw1MzI1MCw1MzI1MSw1MzI1Myw1MzI1NCw1MzI1NSw1MzI1Niw1MzI1Nyw1MzI1OCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzI1OSw1MzI2MCw1MzI2MSw1MzI2Miw1MzI2Myw1MzI2NCw1MzI2Niw1MzI2Nyw1MzI2OCw1MzI2OSw1MzI3MCw1MzI3MSw1MzI3Myw1MzI3NCw1MzI3NSw1MzI3Niw1MzI3Nyw1MzI3OCw1MzI3OSw1MzI4MCw1MzI4MSw1MzI4Miw1MzI4Myw1MzI4NCw1MzI4NSw1MzI4Niw1MzI4Nyw1MzI4OCw1MzI4OSw1MzI5MCw1MzI5MSw1MzI5Miw0NTE0OSw0NTE4MCw0NTE4MSw0NTE4NCw0NTE4OCw0NTE5Niw0NTE5Nyw0NTE5OSw0NTIwMSw0NTIwOCw0NTIwOSw0NTIxMCw0NTIxMiw0NTIxNSw0NTIxNiw0NTIxNyw0NTIxOCw0NTIyNCw0NTIyNSw0NTIyNyw0NTIyOCw0NTIyOSw0NTIzMCw0NTIzMSw0NTIzMyw0NTIzNSw0NTIzNiw0NTIzNyw0NTI0MCw0NTI0NCw0NTI1Miw0NTI1Myw0NTI1NSw0NTI1Niw0NTI1Nyw0NTI2NCw0NTI2NSw0NTI2OCw0NTI3Miw0NTI4MCw0NTI4NSw0NTMyMCw0NTMyMSw0NTMyMyw0NTMyNCw0NTMyOCw0NTMzMCw0NTMzMSw0NTMzNiw0NTMzNyw0NTMzOSw0NTM0MCw0NTM0MSw0NTM0Nyw0NTM0OCw0NTM0OSw0NTM1Miw0NTM1Niw0NTM2NCw0NTM2NSw0NTM2Nyw0NTM2OCw0NTM2OSw0NTM3Niw0NTM3Nyw0NTM4MCw0NTM4NCw0NTM5Miw0NTM5Myw0NTM5Niw0NTM5Nyw0NTQwMCw0NTQwNCw0NTQwOCw0NTQzMiw0NTQzMyw0NTQzNiw0NTQ0MCw0NTQ0Miw0NTQ0OCw0NTQ0OSw0NTQ1MSw0NTQ1Myw0NTQ1OCw0NTQ1OSw0NTQ2MCw0NTQ2NCw0NTQ2OCw0NTQ4MCw0NTUxNiw0NTUyMCw0NTUyNCw0NTUzMiw0NTUzMyw1MzI5NCw1MzI5NSw1MzI5Niw1MzI5Nyw1MzI5OCw1MzI5OSw1MzMwMiw1MzMwMyw1MzMwNSw1MzMwNiw1MzMwNyw1MzMwOSw1MzMxMCw1MzMxMSw1MzMxMiw1MzMxMyw1MzMxNCw1MzMxNSw1MzMxOCw1MzMyMCw1MzMyMiw1MzMyMyw1MzMyNCw1MzMyNSw1MzMyNiw1MzMyNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzMyOSw1MzMzMCw1MzMzMSw1MzMzMyw1MzMzNCw1MzMzNSw1MzMzNyw1MzMzOCw1MzMzOSw1MzM0MCw1MzM0MSw1MzM0Miw1MzM0Myw1MzM0NSw1MzM0Niw1MzM0Nyw1MzM0OCw1MzM0OSw1MzM1MCw1MzM1MSw1MzM1Miw1MzM1Myw1MzM1NCw1MzM1NSw1MzM1OCw1MzM1OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzM2MSw1MzM2Miw1MzM2Myw1MzM2NSw1MzM2Niw1MzM2Nyw1MzM2OCw1MzM2OSw1MzM3MCw1MzM3MSw1MzM3NCw1MzM3NSw1MzM3Niw1MzM3OCw1MzM3OSw1MzM4MCw1MzM4MSw1MzM4Miw1MzM4Myw1MzM4NCw1MzM4NSw1MzM4Niw1MzM4Nyw1MzM4OCw1MzM4OSw1MzM5MCw1MzM5MSw1MzM5Miw1MzM5Myw1MzM5NCw1MzM5NSw1MzM5Niw0NTUzNSw0NTU0NCw0NTU0NSw0NTU0OCw0NTU1Miw0NTU2MSw0NTU2Myw0NTU2NSw0NTU3Miw0NTU3Myw0NTU3Niw0NTU3OSw0NTU4MCw0NTU4OCw0NTU4OSw0NTU5MSw0NTU5Myw0NTYwMCw0NTYyMCw0NTYyOCw0NTY1Niw0NTY2MCw0NTY2NCw0NTY3Miw0NTY3Myw0NTY4NCw0NTY4NSw0NTY5Miw0NTcwMCw0NTcwMSw0NTcwNSw0NTcxMiw0NTcxMyw0NTcxNiw0NTcyMCw0NTcyMSw0NTcyMiw0NTcyOCw0NTcyOSw0NTczMSw0NTczMyw0NTczNCw0NTczOCw0NTc0MCw0NTc0NCw0NTc0OCw0NTc2OCw0NTc2OSw0NTc3Miw0NTc3Niw0NTc3OCw0NTc4NCw0NTc4NSw0NTc4Nyw0NTc4OSw0NTc5NCw0NTc5Niw0NTc5Nyw0NTc5OCw0NTgwMCw0NTgwMyw0NTgwNCw0NTgwNSw0NTgwNiw0NTgwNyw0NTgxMSw0NTgxMiw0NTgxMyw0NTgxNSw0NTgxNiw0NTgxNyw0NTgxOCw0NTgxOSw0NTgyMyw0NTgyNCw0NTgyNSw0NTgyOCw0NTgzMiw0NTg0MCw0NTg0MSw0NTg0Myw0NTg0NCw0NTg0NSw0NTg1Miw0NTkwOCw0NTkwOSw0NTkxMCw0NTkxMiw0NTkxNSw0NTkxNiw0NTkxOCw0NTkxOSw0NTkyNCw0NTkyNSw1MzM5Nyw1MzM5OCw1MzM5OSw1MzQwMCw1MzQwMSw1MzQwMiw1MzQwMyw1MzQwNCw1MzQwNSw1MzQwNiw1MzQwNyw1MzQwOCw1MzQwOSw1MzQxMCw1MzQxMSw1MzQxNCw1MzQxNSw1MzQxNyw1MzQxOCw1MzQxOSw1MzQyMSw1MzQyMiw1MzQyMyw1MzQyNCw1MzQyNSw1MzQyNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzQyNyw1MzQzMCw1MzQzMiw1MzQzNCw1MzQzNSw1MzQzNiw1MzQzNyw1MzQzOCw1MzQzOSw1MzQ0Miw1MzQ0Myw1MzQ0NSw1MzQ0Niw1MzQ0Nyw1MzQ1MCw1MzQ1MSw1MzQ1Miw1MzQ1Myw1MzQ1NCw1MzQ1NSw1MzQ1OCw1MzQ2Miw1MzQ2Myw1MzQ2NCw1MzQ2NSw1MzQ2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzQ2Nyw1MzQ3MCw1MzQ3MSw1MzQ3Myw1MzQ3NCw1MzQ3NSw1MzQ3Nyw1MzQ3OCw1MzQ3OSw1MzQ4MCw1MzQ4MSw1MzQ4Miw1MzQ4Myw1MzQ4Niw1MzQ5MCw1MzQ5MSw1MzQ5Miw1MzQ5Myw1MzQ5NCw1MzQ5NSw1MzQ5Nyw1MzQ5OCw1MzQ5OSw1MzUwMCw1MzUwMSw1MzUwMiw1MzUwMyw1MzUwNCw1MzUwNSw1MzUwNiw1MzUwNyw1MzUwOCw0NTkyNyw0NTkyOSw0NTkzMSw0NTkzNCw0NTkzNiw0NTkzNyw0NTk0MCw0NTk0NCw0NTk1Miw0NTk1Myw0NTk1NSw0NTk1Niw0NTk1Nyw0NTk2NCw0NTk2OCw0NTk3Miw0NTk4NCw0NTk4NSw0NTk5Miw0NTk5Niw0NjAyMCw0NjAyMSw0NjAyNCw0NjAyNyw0NjAyOCw0NjAzMCw0NjAzMiw0NjAzNiw0NjAzNyw0NjAzOSw0NjA0MSw0NjA0Myw0NjA0NSw0NjA0OCw0NjA1Miw0NjA1Niw0NjA3Niw0NjA5Niw0NjEwNCw0NjEwOCw0NjExMiw0NjEyMCw0NjEyMSw0NjEyMyw0NjEzMiw0NjE2MCw0NjE2MSw0NjE2NCw0NjE2OCw0NjE3Niw0NjE3Nyw0NjE3OSw0NjE4MSw0NjE4OCw0NjIwOCw0NjIxNiw0NjIzNyw0NjI0NCw0NjI0OCw0NjI1Miw0NjI2MSw0NjI2Myw0NjI2NSw0NjI3Miw0NjI3Niw0NjI4MCw0NjI4OCw0NjI5Myw0NjMwMCw0NjMwMSw0NjMwNCw0NjMwNyw0NjMwOCw0NjMxMCw0NjMxNiw0NjMxNyw0NjMxOSw0NjMyMSw0NjMyOCw0NjM1Niw0NjM1Nyw0NjM2MCw0NjM2Myw0NjM2NCw0NjM3Miw0NjM3Myw0NjM3NSw0NjM3Niw0NjM3Nyw0NjM3OCw0NjM4NCw0NjM4NSw0NjM4OCw0NjM5Miw1MzUwOSw1MzUxMCw1MzUxMSw1MzUxMiw1MzUxMyw1MzUxNCw1MzUxNSw1MzUxNiw1MzUxOCw1MzUxOSw1MzUyMCw1MzUyMSw1MzUyMiw1MzUyMyw1MzUyNCw1MzUyNSw1MzUyNiw1MzUyNyw1MzUyOCw1MzUyOSw1MzUzMCw1MzUzMSw1MzUzMiw1MzUzMyw1MzUzNCw1MzUzNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzUzNiw1MzUzNyw1MzUzOCw1MzUzOSw1MzU0MCw1MzU0MSw1MzU0Miw1MzU0Myw1MzU0NCw1MzU0NSw1MzU0Niw1MzU0Nyw1MzU0OCw1MzU0OSw1MzU1MCw1MzU1MSw1MzU1NCw1MzU1NSw1MzU1Nyw1MzU1OCw1MzU1OSw1MzU2MSw1MzU2Myw1MzU2NCw1MzU2NSw1MzU2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzU2Nyw1MzU3MCw1MzU3NCw1MzU3NSw1MzU3Niw1MzU3Nyw1MzU3OCw1MzU3OSw1MzU4Miw1MzU4Myw1MzU4NSw1MzU4Niw1MzU4Nyw1MzU4OSw1MzU5MCw1MzU5MSw1MzU5Miw1MzU5Myw1MzU5NCw1MzU5NSw1MzU5OCw1MzYwMCw1MzYwMiw1MzYwMyw1MzYwNCw1MzYwNSw1MzYwNiw1MzYwNyw1MzYwOSw1MzYxMCw1MzYxMSw1MzYxMyw0NjQwMCw0NjQwMSw0NjQwMyw0NjQwNCw0NjQwNSw0NjQxMSw0NjQxMiw0NjQxMyw0NjQxNiw0NjQyMCw0NjQyOCw0NjQyOSw0NjQzMSw0NjQzMiw0NjQzMyw0NjQ5Niw0NjQ5Nyw0NjUwMCw0NjUwNCw0NjUwNiw0NjUwNyw0NjUxMiw0NjUxMyw0NjUxNSw0NjUxNiw0NjUxNyw0NjUyMyw0NjUyNCw0NjUyNSw0NjUyOCw0NjUzMiw0NjU0MCw0NjU0MSw0NjU0Myw0NjU0NCw0NjU0NSw0NjU1Miw0NjU3Miw0NjYwOCw0NjYwOSw0NjYxMiw0NjYxNiw0NjYyOSw0NjYzNiw0NjY0NCw0NjY2NCw0NjY5Miw0NjY5Niw0Njc0OCw0Njc0OSw0Njc1Miw0Njc1Niw0Njc2Myw0Njc2NCw0Njc2OSw0NjgwNCw0NjgzMiw0NjgzNiw0Njg0MCw0Njg0OCw0Njg0OSw0Njg1Myw0Njg4OCw0Njg4OSw0Njg5Miw0Njg5NSw0Njg5Niw0NjkwNCw0NjkwNSw0NjkwNyw0NjkxNiw0NjkyMCw0NjkyNCw0NjkzMiw0NjkzMyw0Njk0NCw0Njk0OCw0Njk1Miw0Njk2MCw0Njk2MSw0Njk2Myw0Njk2NSw0Njk3Miw0Njk3Myw0Njk3Niw0Njk4MCw0Njk4OCw0Njk4OSw0Njk5MSw0Njk5Miw0Njk5Myw0Njk5NCw0Njk5OCw0Njk5OSw1MzYxNCw1MzYxNSw1MzYxNiw1MzYxNyw1MzYxOCw1MzYxOSw1MzYyMCw1MzYyMSw1MzYyMiw1MzYyMyw1MzYyNCw1MzYyNSw1MzYyNiw1MzYyNyw1MzYyOSw1MzYzMCw1MzYzMSw1MzYzMiw1MzYzMyw1MzYzNCw1MzYzNSw1MzYzNyw1MzYzOCw1MzYzOSw1MzY0MSw1MzY0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzY0Myw1MzY0NCw1MzY0NSw1MzY0Niw1MzY0Nyw1MzY0OCw1MzY0OSw1MzY1MCw1MzY1MSw1MzY1Miw1MzY1Myw1MzY1NCw1MzY1NSw1MzY1Niw1MzY1Nyw1MzY1OCw1MzY1OSw1MzY2MCw1MzY2MSw1MzY2Miw1MzY2Myw1MzY2Niw1MzY2Nyw1MzY2OSw1MzY3MCw1MzY3MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzY3Myw1MzY3NCw1MzY3NSw1MzY3Niw1MzY3Nyw1MzY3OCw1MzY3OSw1MzY4Miw1MzY4NCw1MzY4Niw1MzY4Nyw1MzY4OCw1MzY4OSw1MzY5MSw1MzY5Myw1MzY5NCw1MzY5NSw1MzY5Nyw1MzY5OCw1MzY5OSw1MzcwMCw1MzcwMSw1MzcwMiw1MzcwMyw1MzcwNCw1MzcwNSw1MzcwNiw1MzcwNyw1MzcwOCw1MzcwOSw1MzcxMCw1MzcxMSw0NzAwMCw0NzAwMSw0NzAwNCw0NzAwOCw0NzAxNiw0NzAxNyw0NzAxOSw0NzAyMCw0NzAyMSw0NzAyOCw0NzAyOSw0NzAzMiw0NzA0Nyw0NzA0OSw0NzA4NCw0NzA4NSw0NzA4OCw0NzA5Miw0NzEwMCw0NzEwMSw0NzEwMyw0NzEwNCw0NzEwNSw0NzExMSw0NzExMiw0NzExMyw0NzExNiw0NzEyMCw0NzEyOCw0NzEyOSw0NzEzMSw0NzEzMyw0NzE0MCw0NzE0MSw0NzE0NCw0NzE0OCw0NzE1Niw0NzE1Nyw0NzE1OSw0NzE2MCw0NzE2MSw0NzE2OCw0NzE3Miw0NzE4NSw0NzE4Nyw0NzE5Niw0NzE5Nyw0NzIwMCw0NzIwNCw0NzIxMiw0NzIxMyw0NzIxNSw0NzIxNyw0NzIyNCw0NzIyOCw0NzI0NSw0NzI3Miw0NzI4MCw0NzI4NCw0NzI4OCw0NzI5Niw0NzI5Nyw0NzI5OSw0NzMwMSw0NzMwOCw0NzMxMiw0NzMxNiw0NzMyNSw0NzMyNyw0NzMyOSw0NzMzNiw0NzMzNyw0NzM0MCw0NzM0NCw0NzM1Miw0NzM1Myw0NzM1NSw0NzM1Nyw0NzM2NCw0NzM4NCw0NzM5Miw0NzQyMCw0NzQyMSw0NzQyNCw0NzQyOCw0NzQzNiw0NzQzOSw0NzQ0MSw0NzQ0OCw0NzQ0OSw0NzQ1Miw0NzQ1Niw0NzQ2NCw0NzQ2NSw1MzcxMiw1MzcxMyw1MzcxNCw1MzcxNSw1MzcxNiw1MzcxNyw1MzcxOCw1MzcxOSw1MzcyMSw1MzcyMiw1MzcyMyw1MzcyNCw1MzcyNSw1MzcyNiw1MzcyNyw1MzcyOCw1MzcyOSw1MzczMCw1MzczMSw1MzczMiw1MzczMyw1MzczNCw1MzczNSw1MzczNiw1MzczNyw1MzczOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzczOSw1Mzc0MCw1Mzc0MSw1Mzc0Miw1Mzc0Myw1Mzc0NCw1Mzc0NSw1Mzc0Niw1Mzc0Nyw1Mzc0OSw1Mzc1MCw1Mzc1MSw1Mzc1Myw1Mzc1NCw1Mzc1NSw1Mzc1Niw1Mzc1Nyw1Mzc1OCw1Mzc1OSw1Mzc2MCw1Mzc2MSw1Mzc2Miw1Mzc2Myw1Mzc2NCw1Mzc2NSw1Mzc2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzc2OCw1Mzc3MCw1Mzc3MSw1Mzc3Miw1Mzc3Myw1Mzc3NCw1Mzc3NSw1Mzc3Nyw1Mzc3OCw1Mzc3OSw1Mzc4MCw1Mzc4MSw1Mzc4Miw1Mzc4Myw1Mzc4NCw1Mzc4NSw1Mzc4Niw1Mzc4Nyw1Mzc4OCw1Mzc4OSw1Mzc5MCw1Mzc5MSw1Mzc5Miw1Mzc5Myw1Mzc5NCw1Mzc5NSw1Mzc5Niw1Mzc5Nyw1Mzc5OCw1Mzc5OSw1MzgwMCw1MzgwMSw0NzQ2Nyw0NzQ2OSw0NzQ3Niw0NzQ3Nyw0NzQ4MCw0NzQ4NCw0NzQ5Miw0NzQ5Myw0NzQ5NSw0NzQ5Nyw0NzQ5OCw0NzUwMSw0NzUwMiw0NzUzMiw0NzUzMyw0NzUzNiw0NzU0MCw0NzU0OCw0NzU0OSw0NzU1MSw0NzU1Myw0NzU2MCw0NzU2MSw0NzU2NCw0NzU2Niw0NzU2Nyw0NzU2OCw0NzU2OSw0NzU3MCw0NzU3Niw0NzU3Nyw0NzU3OSw0NzU4MSw0NzU4Miw0NzU4NSw0NzU4Nyw0NzU4OCw0NzU4OSw0NzU5Miw0NzU5Niw0NzYwNCw0NzYwNSw0NzYwNyw0NzYwOCw0NzYwOSw0NzYxMCw0NzYxNiw0NzYxNyw0NzYyNCw0NzYzNyw0NzY3Miw0NzY3Myw0NzY3Niw0NzY4MCw0NzY4Miw0NzY4OCw0NzY4OSw0NzY5MSw0NzY5Myw0NzY5NCw0NzY5OSw0NzcwMCw0NzcwMSw0NzcwNCw0NzcwOCw0NzcxNiw0NzcxNyw0NzcxOSw0NzcyMCw0NzcyMSw0NzcyOCw0NzcyOSw0NzczMiw0NzczNiw0Nzc0Nyw0Nzc0OCw0Nzc0OSw0Nzc1MSw0Nzc1Niw0Nzc4NCw0Nzc4NSw0Nzc4Nyw0Nzc4OCw0Nzc5Miw0Nzc5NCw0NzgwMCw0NzgwMSw0NzgwMyw0NzgwNSw0NzgxMiw0NzgxNiw0NzgzMiw0NzgzMyw0Nzg2OCw1MzgwMiw1MzgwMyw1MzgwNiw1MzgwNyw1MzgwOSw1MzgxMCw1MzgxMSw1MzgxMyw1MzgxNCw1MzgxNSw1MzgxNiw1MzgxNyw1MzgxOCw1MzgxOSw1MzgyMiw1MzgyNCw1MzgyNiw1MzgyNyw1MzgyOCw1MzgyOSw1MzgzMCw1MzgzMSw1MzgzMyw1MzgzNCw1MzgzNSw1MzgzNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzgzNyw1MzgzOCw1MzgzOSw1Mzg0MCw1Mzg0MSw1Mzg0Miw1Mzg0Myw1Mzg0NCw1Mzg0NSw1Mzg0Niw1Mzg0Nyw1Mzg0OCw1Mzg0OSw1Mzg1MCw1Mzg1MSw1Mzg1Myw1Mzg1NCw1Mzg1NSw1Mzg1Niw1Mzg1Nyw1Mzg1OCw1Mzg1OSw1Mzg2MSw1Mzg2Miw1Mzg2Myw1Mzg2NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzg2NSw1Mzg2Niw1Mzg2Nyw1Mzg2OCw1Mzg2OSw1Mzg3MCw1Mzg3MSw1Mzg3Miw1Mzg3Myw1Mzg3NCw1Mzg3NSw1Mzg3Niw1Mzg3Nyw1Mzg3OCw1Mzg3OSw1Mzg4MCw1Mzg4MSw1Mzg4Miw1Mzg4Myw1Mzg4NCw1Mzg4NSw1Mzg4Niw1Mzg4Nyw1Mzg5MCw1Mzg5MSw1Mzg5Myw1Mzg5NCw1Mzg5NSw1Mzg5Nyw1Mzg5OCw1Mzg5OSw1MzkwMCw0Nzg3Miw0Nzg3Niw0Nzg4NSw0Nzg4Nyw0Nzg4OSw0Nzg5Niw0NzkwMCw0NzkwNCw0NzkxMyw0NzkxNSw0NzkyNCw0NzkyNSw0NzkyNiw0NzkyOCw0NzkzMSw0NzkzMiw0NzkzMyw0NzkzNCw0Nzk0MCw0Nzk0MSw0Nzk0Myw0Nzk0NSw0Nzk0OSw0Nzk1MSw0Nzk1Miw0Nzk1Niw0Nzk2MCw0Nzk2OSw0Nzk3MSw0Nzk4MCw0ODAwOCw0ODAxMiw0ODAxNiw0ODAzNiw0ODA0MCw0ODA0NCw0ODA1Miw0ODA1NSw0ODA2NCw0ODA2OCw0ODA3Miw0ODA4MCw0ODA4Myw0ODEyMCw0ODEyMSw0ODEyNCw0ODEyNyw0ODEyOCw0ODEzMCw0ODEzNiw0ODEzNyw0ODEzOSw0ODE0MCw0ODE0MSw0ODE0Myw0ODE0NSw0ODE0OCw0ODE0OSw0ODE1MCw0ODE1MSw0ODE1Miw0ODE1NSw0ODE1Niw0ODE1Nyw0ODE1OCw0ODE1OSw0ODE2NCw0ODE2NSw0ODE2Nyw0ODE2OSw0ODE3Myw0ODE3Niw0ODE3Nyw0ODE4MCw0ODE4NCw0ODE5Miw0ODE5Myw0ODE5NSw0ODE5Niw0ODE5Nyw0ODIwMSw0ODIwNCw0ODIwNSw0ODIwOCw0ODIyMSw0ODI2MCw0ODI2MSw0ODI2NCw0ODI2Nyw0ODI2OCw0ODI3MCw0ODI3Niw0ODI3Nyw0ODI3OSw1MzkwMSw1MzkwMiw1MzkwMyw1MzkwNiw1MzkwNyw1MzkwOCw1MzkxMCw1MzkxMSw1MzkxMiw1MzkxMyw1MzkxNCw1MzkxNSw1MzkxNyw1MzkxOCw1MzkxOSw1MzkyMSw1MzkyMiw1MzkyMyw1MzkyNSw1MzkyNiw1MzkyNyw1MzkyOCw1MzkyOSw1MzkzMCw1MzkzMSw1MzkzMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzkzNCw1MzkzNSw1MzkzNiw1MzkzOCw1MzkzOSw1Mzk0MCw1Mzk0MSw1Mzk0Miw1Mzk0Myw1Mzk0Niw1Mzk0Nyw1Mzk0OSw1Mzk1MCw1Mzk1Myw1Mzk1NSw1Mzk1Niw1Mzk1Nyw1Mzk1OCw1Mzk1OSw1Mzk2Miw1Mzk2NCw1Mzk2NSw1Mzk2Niw1Mzk2Nyw1Mzk2OCw1Mzk2OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzk3MCw1Mzk3MSw1Mzk3Myw1Mzk3NCw1Mzk3NSw1Mzk3Nyw1Mzk3OCw1Mzk3OSw1Mzk4MSw1Mzk4Miw1Mzk4Myw1Mzk4NCw1Mzk4NSw1Mzk4Niw1Mzk4Nyw1Mzk5MCw1Mzk5MSw1Mzk5Miw1Mzk5Myw1Mzk5NCw1Mzk5NSw1Mzk5Niw1Mzk5Nyw1Mzk5OCw1Mzk5OSw1NDAwMiw1NDAwMyw1NDAwNSw1NDAwNiw1NDAwNyw1NDAwOSw1NDAxMCw0ODI4MSw0ODI4Miw0ODI4OCw0ODI4OSw0ODI5Miw0ODI5NSw0ODI5Niw0ODMwNCw0ODMwNSw0ODMwNyw0ODMwOCw0ODMwOSw0ODMxNiw0ODMxNyw0ODMyMCw0ODMyNCw0ODMzMyw0ODMzNSw0ODMzNiw0ODMzNyw0ODM0MSw0ODM0NCw0ODM0OCw0ODM3Miw0ODM3Myw0ODM3NCw0ODM3Niw0ODM4MCw0ODM4OCw0ODM4OSw0ODM5MSw0ODM5Myw0ODQwMCw0ODQwNCw0ODQyMCw0ODQyOCw0ODQ0OCw0ODQ1Niw0ODQ1Nyw0ODQ2MCw0ODQ2NCw0ODQ3Miw0ODQ3Myw0ODQ4NCw0ODQ4OCw0ODUxMiw0ODUxMyw0ODUxNiw0ODUxOSw0ODUyMCw0ODUyMSw0ODUyMiw0ODUyOCw0ODUyOSw0ODUzMSw0ODUzMyw0ODUzNyw0ODUzOCw0ODU0MCw0ODU0OCw0ODU2MCw0ODU2OCw0ODU5Niw0ODU5Nyw0ODYwMCw0ODYwNCw0ODYxNyw0ODYyNCw0ODYyOCw0ODYzMiw0ODY0MCw0ODY0Myw0ODY0NSw0ODY1Miw0ODY1Myw0ODY1Niw0ODY2MCw0ODY2OCw0ODY2OSw0ODY3MSw0ODcwOCw0ODcwOSw0ODcxMiw0ODcxNiw0ODcxOCw0ODcyNCw0ODcyNSw0ODcyNyw0ODcyOSw0ODczMCw0ODczMSw0ODczNiw0ODczNyw0ODc0MCw1NDAxMSw1NDAxMiw1NDAxMyw1NDAxNCw1NDAxNSw1NDAxOCw1NDAyMCw1NDAyMiw1NDAyMyw1NDAyNCw1NDAyNSw1NDAyNiw1NDAyNyw1NDAzMSw1NDAzMyw1NDAzNCw1NDAzNSw1NDAzNyw1NDAzOSw1NDA0MCw1NDA0MSw1NDA0Miw1NDA0Myw1NDA0Niw1NDA1MCw1NDA1MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDA1Miw1NDA1NCw1NDA1NSw1NDA1OCw1NDA1OSw1NDA2MSw1NDA2Miw1NDA2Myw1NDA2NSw1NDA2Niw1NDA2Nyw1NDA2OCw1NDA2OSw1NDA3MCw1NDA3MSw1NDA3NCw1NDA3OCw1NDA3OSw1NDA4MCw1NDA4MSw1NDA4Miw1NDA4Myw1NDA4Niw1NDA4Nyw1NDA4OCw1NDA4OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDA5MCw1NDA5MSw1NDA5Miw1NDA5Myw1NDA5NCw1NDA5NSw1NDA5Niw1NDA5Nyw1NDA5OCw1NDA5OSw1NDEwMCw1NDEwMSw1NDEwMiw1NDEwMyw1NDEwNCw1NDEwNSw1NDEwNiw1NDEwNyw1NDEwOCw1NDEwOSw1NDExMCw1NDExMSw1NDExMiw1NDExMyw1NDExNCw1NDExNSw1NDExNiw1NDExNyw1NDExOCw1NDExOSw1NDEyMCw1NDEyMSw0ODc0NCw0ODc0Niw0ODc1Miw0ODc1Myw0ODc1NSw0ODc1Niw0ODc1Nyw0ODc2Myw0ODc2NCw0ODc2NSw0ODc2OCw0ODc3Miw0ODc4MCw0ODc4MSw0ODc4Myw0ODc4NCw0ODc4NSw0ODc5Miw0ODc5Myw0ODgwOCw0ODg0OCw0ODg0OSw0ODg1Miw0ODg1NSw0ODg1Niw0ODg2NCw0ODg2Nyw0ODg2OCw0ODg2OSw0ODg3Niw0ODg5Nyw0ODkwNCw0ODkwNSw0ODkyMCw0ODkyMSw0ODkyMyw0ODkyNCw0ODkyNSw0ODk2MCw0ODk2MSw0ODk2NCw0ODk2OCw0ODk3Niw0ODk3Nyw0ODk4MSw0OTA0NCw0OTA3Miw0OTA5Myw0OTEwMCw0OTEwMSw0OTEwNCw0OTEwOCw0OTExNiw0OTExOSw0OTEyMSw0OTIxMiw0OTIzMyw0OTI0MCw0OTI0NCw0OTI0OCw0OTI1Niw0OTI1Nyw0OTI5Niw0OTI5Nyw0OTMwMCw0OTMwNCw0OTMxMiw0OTMxMyw0OTMxNSw0OTMxNyw0OTMyNCw0OTMyNSw0OTMyNyw0OTMyOCw0OTMzMSw0OTMzMiw0OTMzMyw0OTMzNCw0OTM0MCw0OTM0MSw0OTM0Myw0OTM0NCw0OTM0NSw0OTM0OSw0OTM1Miw0OTM1Myw0OTM1Niw0OTM2MCw0OTM2OCw0OTM2OSw0OTM3MSw0OTM3Miw0OTM3Myw0OTM4MCw1NDEyMiw1NDEyMyw1NDEyNCw1NDEyNSw1NDEyNiw1NDEyNyw1NDEyOCw1NDEyOSw1NDEzMCw1NDEzMSw1NDEzMiw1NDEzMyw1NDEzNCw1NDEzNSw1NDEzNiw1NDEzNyw1NDEzOCw1NDEzOSw1NDE0Miw1NDE0Myw1NDE0NSw1NDE0Niw1NDE0Nyw1NDE0OSw1NDE1MCw1NDE1MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDE1Miw1NDE1Myw1NDE1NCw1NDE1NSw1NDE1OCw1NDE2Miw1NDE2Myw1NDE2NCw1NDE2NSw1NDE2Niw1NDE2Nyw1NDE3MCw1NDE3MSw1NDE3Myw1NDE3NCw1NDE3NSw1NDE3Nyw1NDE3OCw1NDE3OSw1NDE4MCw1NDE4MSw1NDE4Miw1NDE4Myw1NDE4Niw1NDE4OCw1NDE5MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDE5MSw1NDE5Miw1NDE5Myw1NDE5NCw1NDE5NSw1NDE5Nyw1NDE5OCw1NDE5OSw1NDIwMSw1NDIwMiw1NDIwMyw1NDIwNSw1NDIwNiw1NDIwNyw1NDIwOCw1NDIwOSw1NDIxMCw1NDIxMSw1NDIxNCw1NDIxNSw1NDIxOCw1NDIxOSw1NDIyMCw1NDIyMSw1NDIyMiw1NDIyMyw1NDIyNSw1NDIyNiw1NDIyNyw1NDIyOCw1NDIyOSw1NDIzMCw0OTM4MSw0OTM4NCw0OTM4OCw0OTM5Niw0OTM5Nyw0OTM5OSw0OTQwMSw0OTQwOCw0OTQxMiw0OTQxNiw0OTQyNCw0OTQyOSw0OTQzNiw0OTQzNyw0OTQzOCw0OTQzOSw0OTQ0MCw0OTQ0Myw0OTQ0NCw0OTQ0Niw0OTQ0Nyw0OTQ1Miw0OTQ1Myw0OTQ1NSw0OTQ1Niw0OTQ1Nyw0OTQ2Miw0OTQ2NCw0OTQ2NSw0OTQ2OCw0OTQ3Miw0OTQ4MCw0OTQ4MSw0OTQ4Myw0OTQ4NCw0OTQ4NSw0OTQ5Miw0OTQ5Myw0OTQ5Niw0OTUwMCw0OTUwOCw0OTUwOSw0OTUxMSw0OTUxMiw0OTUxMyw0OTUyMCw0OTUyNCw0OTUyOCw0OTU0MSw0OTU0OCw0OTU0OSw0OTU1MCw0OTU1Miw0OTU1Niw0OTU1OCw0OTU2NCw0OTU2NSw0OTU2Nyw0OTU2OSw0OTU3Myw0OTU3Niw0OTU3Nyw0OTU4MCw0OTU4NCw0OTU5Nyw0OTYwNCw0OTYwOCw0OTYxMiw0OTYyMCw0OTYyMyw0OTYyNCw0OTYzMiw0OTYzNiw0OTY0MCw0OTY0OCw0OTY0OSw0OTY1MSw0OTY2MCw0OTY2MSw0OTY2NCw0OTY2OCw0OTY3Niw0OTY3Nyw0OTY3OSw0OTY4MSw0OTY4OCw0OTY4OSw0OTY5Miw0OTY5NSw0OTY5Niw0OTcwNCw0OTcwNSw0OTcwNyw0OTcwOSw1NDIzMSw1NDIzMyw1NDIzNCw1NDIzNSw1NDIzNiw1NDIzNyw1NDIzOCw1NDIzOSw1NDI0MCw1NDI0Miw1NDI0NCw1NDI0NSw1NDI0Niw1NDI0Nyw1NDI0OCw1NDI0OSw1NDI1MCw1NDI1MSw1NDI1NCw1NDI1NSw1NDI1Nyw1NDI1OCw1NDI1OSw1NDI2MSw1NDI2Miw1NDI2MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDI2NCw1NDI2NSw1NDI2Niw1NDI2Nyw1NDI3MCw1NDI3Miw1NDI3NCw1NDI3NSw1NDI3Niw1NDI3Nyw1NDI3OCw1NDI3OSw1NDI4MSw1NDI4Miw1NDI4Myw1NDI4NCw1NDI4NSw1NDI4Niw1NDI4Nyw1NDI4OCw1NDI4OSw1NDI5MCw1NDI5MSw1NDI5Miw1NDI5Myw1NDI5NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDI5NSw1NDI5Niw1NDI5Nyw1NDI5OCw1NDI5OSw1NDMwMCw1NDMwMiw1NDMwMyw1NDMwNCw1NDMwNSw1NDMwNiw1NDMwNyw1NDMwOCw1NDMwOSw1NDMxMCw1NDMxMSw1NDMxMiw1NDMxMyw1NDMxNCw1NDMxNSw1NDMxNiw1NDMxNyw1NDMxOCw1NDMxOSw1NDMyMCw1NDMyMSw1NDMyMiw1NDMyMyw1NDMyNCw1NDMyNSw1NDMyNiw1NDMyNyw0OTcxMSw0OTcxMyw0OTcxNCw0OTcxNiw0OTczNiw0OTc0NCw0OTc0NSw0OTc0OCw0OTc1Miw0OTc2MCw0OTc2NSw0OTc3Miw0OTc3Myw0OTc3Niw0OTc4MCw0OTc4OCw0OTc4OSw0OTc5MSw0OTc5Myw0OTgwMCw0OTgwMSw0OTgwOCw0OTgxNiw0OTgxOSw0OTgyMSw0OTgyOCw0OTgyOSw0OTgzMiw0OTgzNiw0OTgzNyw0OTg0NCw0OTg0NSw0OTg0Nyw0OTg0OSw0OTg4NCw0OTg4NSw0OTg4OCw0OTg5MSw0OTg5Miw0OTg5OSw0OTkwMCw0OTkwMSw0OTkwMyw0OTkwNSw0OTkxMCw0OTkxMiw0OTkxMyw0OTkxNSw0OTkxNiw0OTkyMCw0OTkyOCw0OTkyOSw0OTkzMiw0OTkzMyw0OTkzOSw0OTk0MCw0OTk0MSw0OTk0NCw0OTk0OCw0OTk1Niw0OTk1Nyw0OTk2MCw0OTk2MSw0OTk4OSw1MDAyNCw1MDAyNSw1MDAyOCw1MDAzMiw1MDAzNCw1MDA0MCw1MDA0MSw1MDA0NCw1MDA0NSw1MDA1Miw1MDA1Niw1MDA2MCw1MDExMiw1MDEzNiw1MDEzNyw1MDE0MCw1MDE0Myw1MDE0NCw1MDE0Niw1MDE1Miw1MDE1Myw1MDE1Nyw1MDE2NCw1MDE2NSw1MDE2OCw1MDE4NCw1MDE5Miw1MDIxMiw1MDIyMCw1MDIyNCw1NDMyOCw1NDMyOSw1NDMzMCw1NDMzMSw1NDMzMiw1NDMzMyw1NDMzNCw1NDMzNSw1NDMzNyw1NDMzOCw1NDMzOSw1NDM0MSw1NDM0Miw1NDM0Myw1NDM0NCw1NDM0NSw1NDM0Niw1NDM0Nyw1NDM0OCw1NDM0OSw1NDM1MCw1NDM1MSw1NDM1Miw1NDM1Myw1NDM1NCw1NDM1NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDM1Niw1NDM1Nyw1NDM1OCw1NDM1OSw1NDM2MCw1NDM2MSw1NDM2Miw1NDM2Myw1NDM2NSw1NDM2Niw1NDM2Nyw1NDM2OSw1NDM3MCw1NDM3MSw1NDM3Myw1NDM3NCw1NDM3NSw1NDM3Niw1NDM3Nyw1NDM3OCw1NDM3OSw1NDM4MCw1NDM4Miw1NDM4NCw1NDM4NSw1NDM4NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDM4Nyw1NDM4OCw1NDM4OSw1NDM5MCw1NDM5MSw1NDM5NCw1NDM5NSw1NDM5Nyw1NDM5OCw1NDQwMSw1NDQwMyw1NDQwNCw1NDQwNSw1NDQwNiw1NDQwNyw1NDQxMCw1NDQxMiw1NDQxNCw1NDQxNSw1NDQxNiw1NDQxNyw1NDQxOCw1NDQxOSw1NDQyMSw1NDQyMiw1NDQyMyw1NDQyNCw1NDQyNSw1NDQyNiw1NDQyNyw1NDQyOCw1NDQyOSw1MDIyOCw1MDIzNiw1MDIzNyw1MDI0OCw1MDI3Niw1MDI3Nyw1MDI4MCw1MDI4NCw1MDI5Miw1MDI5Myw1MDI5Nyw1MDMwNCw1MDMyNCw1MDMzMiw1MDM2MCw1MDM2NCw1MDQwOSw1MDQxNiw1MDQxNyw1MDQyMCw1MDQyNCw1MDQyNiw1MDQzMSw1MDQzMiw1MDQzMyw1MDQ0NCw1MDQ0OCw1MDQ1Miw1MDQ2MCw1MDQ3Miw1MDQ3Myw1MDQ3Niw1MDQ4MCw1MDQ4OCw1MDQ4OSw1MDQ5MSw1MDQ5Myw1MDUwMCw1MDUwMSw1MDUwNCw1MDUwNSw1MDUwNiw1MDUwOCw1MDUwOSw1MDUxMCw1MDUxNSw1MDUxNiw1MDUxNyw1MDUxOSw1MDUyMCw1MDUyMSw1MDUyNSw1MDUyNiw1MDUyOCw1MDUyOSw1MDUzMiw1MDUzNiw1MDU0NCw1MDU0NSw1MDU0Nyw1MDU0OCw1MDU0OSw1MDU1Niw1MDU1Nyw1MDU2MCw1MDU2NCw1MDU2Nyw1MDU3Miw1MDU3Myw1MDU3NSw1MDU3Nyw1MDU4MSw1MDU4Myw1MDU4NCw1MDU4OCw1MDU5Miw1MDYwMSw1MDYxMiw1MDYxMyw1MDYxNiw1MDYxNyw1MDYxOSw1MDYyMCw1MDYyMSw1MDYyMiw1MDYyOCw1MDYyOSw1MDYzMCw1MDYzMSw1MDYzMiw1MDYzMyw1MDYzNCw1MDYzNiw1MDYzOCw1NDQzMCw1NDQzMSw1NDQzMiw1NDQzMyw1NDQzNCw1NDQzNSw1NDQzNiw1NDQzNyw1NDQzOCw1NDQzOSw1NDQ0MCw1NDQ0Miw1NDQ0Myw1NDQ0NCw1NDQ0NSw1NDQ0Niw1NDQ0Nyw1NDQ0OCw1NDQ0OSw1NDQ1MCw1NDQ1MSw1NDQ1Miw1NDQ1Myw1NDQ1NCw1NDQ1NSw1NDQ1NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDQ1Nyw1NDQ1OCw1NDQ1OSw1NDQ2MCw1NDQ2MSw1NDQ2Miw1NDQ2Myw1NDQ2NCw1NDQ2NSw1NDQ2Niw1NDQ2Nyw1NDQ2OCw1NDQ2OSw1NDQ3MCw1NDQ3MSw1NDQ3Miw1NDQ3Myw1NDQ3NCw1NDQ3NSw1NDQ3Nyw1NDQ3OCw1NDQ3OSw1NDQ4MSw1NDQ4Miw1NDQ4Myw1NDQ4NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDQ4Niw1NDQ4Nyw1NDQ4OCw1NDQ4OSw1NDQ5MCw1NDQ5MSw1NDQ5Myw1NDQ5NCw1NDQ5Niw1NDQ5Nyw1NDQ5OCw1NDQ5OSw1NDUwMCw1NDUwMSw1NDUwMiw1NDUwMyw1NDUwNSw1NDUwNiw1NDUwNyw1NDUwOSw1NDUxMCw1NDUxMSw1NDUxMyw1NDUxNCw1NDUxNSw1NDUxNiw1NDUxNyw1NDUxOCw1NDUxOSw1NDUyMSw1NDUyMiw1NDUyNCw1MDY0MCw1MDY0MSw1MDY0NCw1MDY0OCw1MDY1Niw1MDY1Nyw1MDY1OSw1MDY2MSw1MDY2OCw1MDY2OSw1MDY3MCw1MDY3Miw1MDY3Niw1MDY3OCw1MDY3OSw1MDY4NCw1MDY4NSw1MDY4Niw1MDY4Nyw1MDY4OCw1MDY4OSw1MDY5Myw1MDY5NCw1MDY5NSw1MDY5Niw1MDcwMCw1MDcwNCw1MDcxMiw1MDcxMyw1MDcxNSw1MDcxNiw1MDcyNCw1MDcyNSw1MDcyOCw1MDczMiw1MDczMyw1MDczNCw1MDczNiw1MDczOSw1MDc0MCw1MDc0MSw1MDc0Myw1MDc0NSw1MDc0Nyw1MDc1Miw1MDc1Myw1MDc1Niw1MDc2MCw1MDc2OCw1MDc2OSw1MDc3MSw1MDc3Miw1MDc3Myw1MDc4MCw1MDc4MSw1MDc4NCw1MDc5Niw1MDc5OSw1MDgwMSw1MDgwOCw1MDgwOSw1MDgxMiw1MDgxNiw1MDgyNCw1MDgyNSw1MDgyNyw1MDgyOSw1MDgzNiw1MDgzNyw1MDg0MCw1MDg0NCw1MDg1Miw1MDg1Myw1MDg1NSw1MDg1Nyw1MDg2NCw1MDg2NSw1MDg2OCw1MDg3Miw1MDg3Myw1MDg3NCw1MDg4MCw1MDg4MSw1MDg4Myw1MDg4NSw1MDg5Miw1MDg5Myw1MDg5Niw1MDkwMCw1MDkwOCw1MDkwOSw1MDkxMiw1MDkxMyw1MDkyMCw1NDUyNiw1NDUyNyw1NDUyOCw1NDUyOSw1NDUzMCw1NDUzMSw1NDUzMyw1NDUzNCw1NDUzNSw1NDUzNyw1NDUzOCw1NDUzOSw1NDU0MSw1NDU0Miw1NDU0Myw1NDU0NCw1NDU0NSw1NDU0Niw1NDU0Nyw1NDU1MCw1NDU1Miw1NDU1Myw1NDU1NCw1NDU1NSw1NDU1Niw1NDU1NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDU1OCw1NDU1OSw1NDU2MCw1NDU2MSw1NDU2Miw1NDU2Myw1NDU2NCw1NDU2NSw1NDU2Niw1NDU2Nyw1NDU2OCw1NDU2OSw1NDU3MCw1NDU3MSw1NDU3Miw1NDU3Myw1NDU3NCw1NDU3NSw1NDU3Niw1NDU3Nyw1NDU3OCw1NDU3OSw1NDU4MCw1NDU4MSw1NDU4Miw1NDU4MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDU4NCw1NDU4NSw1NDU4Niw1NDU4Nyw1NDU5MCw1NDU5MSw1NDU5Myw1NDU5NCw1NDU5NSw1NDU5Nyw1NDU5OCw1NDU5OSw1NDYwMCw1NDYwMSw1NDYwMiw1NDYwMyw1NDYwNiw1NDYwOCw1NDYxMCw1NDYxMSw1NDYxMiw1NDYxMyw1NDYxNCw1NDYxNSw1NDYxOCw1NDYxOSw1NDYyMSw1NDYyMiw1NDYyMyw1NDYyNSw1NDYyNiw1NDYyNyw1MDkyMSw1MDkyNCw1MDkyOCw1MDkzNiw1MDkzNyw1MDk0MSw1MDk0OCw1MDk0OSw1MDk1Miw1MDk1Niw1MDk2NCw1MDk2NSw1MDk2Nyw1MDk2OSw1MDk3Niw1MDk3Nyw1MDk4MCw1MDk4NCw1MDk5Miw1MDk5Myw1MDk5NSw1MDk5Nyw1MDk5OSw1MTAwNCw1MTAwNSw1MTAwOCw1MTAxMiw1MTAxOCw1MTAyMCw1MTAyMSw1MTAyMyw1MTAyNSw1MTAyNiw1MTAyNyw1MTAyOCw1MTAyOSw1MTAzMCw1MTAzMSw1MTAzMiw1MTAzNiw1MTA0MCw1MTA0OCw1MTA1MSw1MTA2MCw1MTA2MSw1MTA2NCw1MTA2OCw1MTA2OSw1MTA3MCw1MTA3NSw1MTA3Niw1MTA3Nyw1MTA3OSw1MTA4MCw1MTA4MSw1MTA4Miw1MTA4Niw1MTA4OCw1MTA4OSw1MTA5Miw1MTA5NCw1MTA5NSw1MTA5Niw1MTA5OCw1MTEwNCw1MTEwNSw1MTEwNyw1MTEwOCw1MTEwOSw1MTExMCw1MTExNiw1MTExNyw1MTEyMCw1MTEyNCw1MTEzMiw1MTEzMyw1MTEzNSw1MTEzNiw1MTEzNyw1MTE0NCw1MTE0NSw1MTE0OCw1MTE1MCw1MTE1Miw1MTE2MCw1MTE2NSw1MTE3Miw1MTE3Niw1MTE4MCw1MTIwMCw1MTIwMSw1MTIwNCw1MTIwOCw1MTIxMCw1NDYyOCw1NDYzMCw1NDYzMSw1NDYzNCw1NDYzNiw1NDYzOCw1NDYzOSw1NDY0MCw1NDY0MSw1NDY0Miw1NDY0Myw1NDY0Niw1NDY0Nyw1NDY0OSw1NDY1MCw1NDY1MSw1NDY1Myw1NDY1NCw1NDY1NSw1NDY1Niw1NDY1Nyw1NDY1OCw1NDY1OSw1NDY2Miw1NDY2Niw1NDY2NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDY2OCw1NDY2OSw1NDY3MCw1NDY3MSw1NDY3Myw1NDY3NCw1NDY3NSw1NDY3Niw1NDY3Nyw1NDY3OCw1NDY3OSw1NDY4MCw1NDY4MSw1NDY4Miw1NDY4Myw1NDY4NCw1NDY4NSw1NDY4Niw1NDY4Nyw1NDY4OCw1NDY4OSw1NDY5MCw1NDY5MSw1NDY5Miw1NDY5NCw1NDY5NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDY5Niw1NDY5Nyw1NDY5OCw1NDY5OSw1NDcwMCw1NDcwMSw1NDcwMiw1NDcwMyw1NDcwNCw1NDcwNSw1NDcwNiw1NDcwNyw1NDcwOCw1NDcwOSw1NDcxMCw1NDcxMSw1NDcxMiw1NDcxMyw1NDcxNCw1NDcxNSw1NDcxNiw1NDcxNyw1NDcxOCw1NDcxOSw1NDcyMCw1NDcyMSw1NDcyMiw1NDcyMyw1NDcyNCw1NDcyNSw1NDcyNiw1NDcyNyw1MTIxNiw1MTIxNyw1MTIxOSw1MTIyMSw1MTIyMiw1MTIyOCw1MTIyOSw1MTIzMiw1MTIzNiw1MTI0NCw1MTI0NSw1MTI0Nyw1MTI0OSw1MTI1Niw1MTI2MCw1MTI2NCw1MTI3Miw1MTI3Myw1MTI3Niw1MTI3Nyw1MTI4NCw1MTMxMiw1MTMxMyw1MTMxNiw1MTMyMCw1MTMyMiw1MTMyOCw1MTMyOSw1MTMzMSw1MTMzMyw1MTMzNCw1MTMzNSw1MTMzOSw1MTM0MCw1MTM0MSw1MTM0OCw1MTM1Nyw1MTM1OSw1MTM2MSw1MTM2OCw1MTM4OCw1MTM4OSw1MTM5Niw1MTQwMCw1MTQwNCw1MTQxMiw1MTQxMyw1MTQxNSw1MTQxNyw1MTQyNCw1MTQyNSw1MTQyOCw1MTQ0NSw1MTQ1Miw1MTQ1Myw1MTQ1Niw1MTQ2MCw1MTQ2MSw1MTQ2Miw1MTQ2OCw1MTQ2OSw1MTQ3MSw1MTQ3Myw1MTQ4MCw1MTUwMCw1MTUwOCw1MTUzNiw1MTUzNyw1MTU0MCw1MTU0NCw1MTU1Miw1MTU1Myw1MTU1NSw1MTU2NCw1MTU2OCw1MTU3Miw1MTU4MCw1MTU5Miw1MTU5Myw1MTU5Niw1MTYwMCw1MTYwOCw1MTYwOSw1MTYxMSw1MTYxMyw1MTY0OCw1MTY0OSw1MTY1Miw1MTY1NSw1MTY1Niw1MTY1OCw1MTY2NCw1MTY2NSw1MTY2Nyw1NDczMCw1NDczMSw1NDczMyw1NDczNCw1NDczNSw1NDczNyw1NDczOSw1NDc0MCw1NDc0MSw1NDc0Miw1NDc0Myw1NDc0Niw1NDc0OCw1NDc1MCw1NDc1MSw1NDc1Miw1NDc1Myw1NDc1NCw1NDc1NSw1NDc1OCw1NDc1OSw1NDc2MSw1NDc2Miw1NDc2Myw1NDc2NSw1NDc2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDc2Nyw1NDc2OCw1NDc2OSw1NDc3MCw1NDc3MSw1NDc3NCw1NDc3Niw1NDc3OCw1NDc3OSw1NDc4MCw1NDc4MSw1NDc4Miw1NDc4Myw1NDc4Niw1NDc4Nyw1NDc4OSw1NDc5MCw1NDc5MSw1NDc5Myw1NDc5NCw1NDc5NSw1NDc5Niw1NDc5Nyw1NDc5OCw1NDc5OSw1NDgwMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDgwNiw1NDgwNyw1NDgwOCw1NDgwOSw1NDgxMCw1NDgxMSw1NDgxMyw1NDgxNCw1NDgxNSw1NDgxNyw1NDgxOCw1NDgxOSw1NDgyMSw1NDgyMiw1NDgyMyw1NDgyNCw1NDgyNSw1NDgyNiw1NDgyNyw1NDgyOCw1NDgzMCw1NDgzMSw1NDgzMiw1NDgzMyw1NDgzNCw1NDgzNSw1NDgzNiw1NDgzNyw1NDgzOCw1NDgzOSw1NDg0Miw1NDg0Myw1MTY2OSw1MTY3MCw1MTY3Myw1MTY3NCw1MTY3Niw1MTY3Nyw1MTY4MCw1MTY4Miw1MTY4NCw1MTY4Nyw1MTY5Miw1MTY5Myw1MTY5NSw1MTY5Niw1MTY5Nyw1MTcwNCw1MTcwNSw1MTcwOCw1MTcxMiw1MTcyMCw1MTcyMSw1MTcyMyw1MTcyNCw1MTcyNSw1MTczMiw1MTczNiw1MTc1Myw1MTc4OCw1MTc4OSw1MTc5Miw1MTc5Niw1MTgwNCw1MTgwNSw1MTgwNyw1MTgwOCw1MTgwOSw1MTgxNiw1MTgzNyw1MTg0NCw1MTg2NCw1MTkwMCw1MTkwMSw1MTkwNCw1MTkwOCw1MTkxNiw1MTkxNyw1MTkxOSw1MTkyMSw1MTkyMyw1MTkyOCw1MTkyOSw1MTkzNiw1MTk0OCw1MTk1Niw1MTk3Niw1MTk4NCw1MTk4OCw1MTk5Miw1MjAwMCw1MjAwMSw1MjAzMyw1MjA0MCw1MjA0MSw1MjA0NCw1MjA0OCw1MjA1Niw1MjA1Nyw1MjA2MSw1MjA2OCw1MjA4OCw1MjA4OSw1MjEyNCw1MjE1Miw1MjE4MCw1MjE5Niw1MjE5OSw1MjIwMSw1MjIzNiw1MjIzNyw1MjI0MCw1MjI0NCw1MjI1Miw1MjI1Myw1MjI1Nyw1MjI1OCw1MjI2Myw1MjI2NCw1MjI2NSw1MjI2OCw1MjI3MCw1MjI3Miw1MjI4MCw1MjI4MSw1MjI4Myw1NDg0NSw1NDg0Niw1NDg0Nyw1NDg0OSw1NDg1MCw1NDg1MSw1NDg1Miw1NDg1NCw1NDg1NSw1NDg1OCw1NDg2MCw1NDg2Miw1NDg2Myw1NDg2NCw1NDg2Niw1NDg2Nyw1NDg3MCw1NDg3MSw1NDg3Myw1NDg3NCw1NDg3NSw1NDg3Nyw1NDg3OCw1NDg3OSw1NDg4MCw1NDg4MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDg4Miw1NDg4Myw1NDg4NCw1NDg4NSw1NDg4Niw1NDg4OCw1NDg5MCw1NDg5MSw1NDg5Miw1NDg5Myw1NDg5NCw1NDg5NSw1NDg5OCw1NDg5OSw1NDkwMSw1NDkwMiw1NDkwMyw1NDkwNCw1NDkwNSw1NDkwNiw1NDkwNyw1NDkwOCw1NDkwOSw1NDkxMCw1NDkxMSw1NDkxMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDkxMyw1NDkxNCw1NDkxNiw1NDkxOCw1NDkxOSw1NDkyMCw1NDkyMSw1NDkyMiw1NDkyMyw1NDkyNiw1NDkyNyw1NDkyOSw1NDkzMCw1NDkzMSw1NDkzMyw1NDkzNCw1NDkzNSw1NDkzNiw1NDkzNyw1NDkzOCw1NDkzOSw1NDk0MCw1NDk0Miw1NDk0NCw1NDk0Niw1NDk0Nyw1NDk0OCw1NDk0OSw1NDk1MCw1NDk1MSw1NDk1Myw1NDk1NCw1MjI4NCw1MjI4NSw1MjI4Niw1MjI5Miw1MjI5Myw1MjI5Niw1MjMwMCw1MjMwOCw1MjMwOSw1MjMxMSw1MjMxMiw1MjMxMyw1MjMyMCw1MjMyNCw1MjMyNiw1MjMyOCw1MjMzNiw1MjM0MSw1MjM3Niw1MjM3Nyw1MjM4MCw1MjM4NCw1MjM5Miw1MjM5Myw1MjM5NSw1MjM5Niw1MjM5Nyw1MjQwNCw1MjQwNSw1MjQwOCw1MjQxMiw1MjQyMCw1MjQyMSw1MjQyMyw1MjQyNSw1MjQzMiw1MjQzNiw1MjQ1Miw1MjQ2MCw1MjQ2NCw1MjQ4MSw1MjQ4OCw1MjQ4OSw1MjQ5Miw1MjQ5Niw1MjUwNCw1MjUwNSw1MjUwNyw1MjUwOSw1MjUxNiw1MjUyMCw1MjUyNCw1MjUzNyw1MjU3Miw1MjU3Niw1MjU4MCw1MjU4OCw1MjU4OSw1MjU5MSw1MjU5Myw1MjYwMCw1MjYxNiw1MjYyOCw1MjYyOSw1MjYzMiw1MjYzNiw1MjY0NCw1MjY0NSw1MjY0Nyw1MjY0OSw1MjY1Niw1MjY3Niw1MjY4NCw1MjY4OCw1MjcxMiw1MjcxNiw1MjcyMCw1MjcyOCw1MjcyOSw1MjczMSw1MjczMyw1Mjc0MCw1Mjc0NCw1Mjc0OCw1Mjc1Niw1Mjc2MSw1Mjc2OCw1Mjc2OSw1Mjc3Miw1Mjc3Niw1Mjc4NCw1Mjc4NSw1Mjc4Nyw1Mjc4OSw1NDk1NSw1NDk1Nyw1NDk1OCw1NDk1OSw1NDk2MSw1NDk2Miw1NDk2Myw1NDk2NCw1NDk2NSw1NDk2Niw1NDk2Nyw1NDk2OCw1NDk3MCw1NDk3Miw1NDk3Myw1NDk3NCw1NDk3NSw1NDk3Niw1NDk3Nyw1NDk3OCw1NDk3OSw1NDk4Miw1NDk4Myw1NDk4NSw1NDk4Niw1NDk4NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDk4OSw1NDk5MCw1NDk5MSw1NDk5Miw1NDk5NCw1NDk5NSw1NDk5Nyw1NDk5OCw1NTAwMCw1NTAwMiw1NTAwMyw1NTAwNCw1NTAwNSw1NTAwNiw1NTAwNyw1NTAwOSw1NTAxMCw1NTAxMSw1NTAxMyw1NTAxNCw1NTAxNSw1NTAxNyw1NTAxOCw1NTAxOSw1NTAyMCw1NTAyMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NTAyMiw1NTAyMyw1NTAyNSw1NTAyNiw1NTAyNyw1NTAyOCw1NTAzMCw1NTAzMSw1NTAzMiw1NTAzMyw1NTAzNCw1NTAzNSw1NTAzOCw1NTAzOSw1NTA0MSw1NTA0Miw1NTA0Myw1NTA0NSw1NTA0Niw1NTA0Nyw1NTA0OCw1NTA0OSw1NTA1MCw1NTA1MSw1NTA1Miw1NTA1Myw1NTA1NCw1NTA1NSw1NTA1Niw1NTA1OCw1NTA1OSw1NTA2MCw1MjgyNCw1MjgyNSw1MjgyOCw1MjgzMSw1MjgzMiw1MjgzMyw1Mjg0MCw1Mjg0MSw1Mjg0Myw1Mjg0NSw1Mjg1Miw1Mjg1Myw1Mjg1Niw1Mjg2MCw1Mjg2OCw1Mjg2OSw1Mjg3MSw1Mjg3Myw1Mjg4MCw1Mjg4MSw1Mjg4NCw1Mjg4OCw1Mjg5Niw1Mjg5Nyw1Mjg5OSw1MjkwMCw1MjkwMSw1MjkwOCw1MjkwOSw1MjkyOSw1Mjk2NCw1Mjk2NSw1Mjk2OCw1Mjk3MSw1Mjk3Miw1Mjk4MCw1Mjk4MSw1Mjk4Myw1Mjk4NCw1Mjk4NSw1Mjk5Miw1Mjk5Myw1Mjk5Niw1MzAwMCw1MzAwOCw1MzAwOSw1MzAxMSw1MzAxMyw1MzAyMCw1MzAyNCw1MzAyOCw1MzAzNiw1MzAzNyw1MzAzOSw1MzA0MCw1MzA0MSw1MzA0OCw1MzA3Niw1MzA3Nyw1MzA4MCw1MzA4NCw1MzA5Miw1MzA5Myw1MzA5NSw1MzA5Nyw1MzEwNCw1MzEwNSw1MzEwOCw1MzExMiw1MzEyMCw1MzEyNSw1MzEzMiw1MzE1Myw1MzE2MCw1MzE2OCw1MzE4OCw1MzIxNiw1MzIxNyw1MzIyMCw1MzIyNCw1MzIzMiw1MzIzMyw1MzIzNSw1MzIzNyw1MzI0NCw1MzI0OCw1MzI1Miw1MzI2NSw1MzI3Miw1MzI5Myw1MzMwMCw1MzMwMSw1MzMwNCw1MzMwOCw1NTA2MSw1NTA2Miw1NTA2Myw1NTA2Niw1NTA2Nyw1NTA2OSw1NTA3MCw1NTA3MSw1NTA3Myw1NTA3NCw1NTA3NSw1NTA3Niw1NTA3Nyw1NTA3OCw1NTA3OSw1NTA4Miw1NTA4NCw1NTA4Niw1NTA4Nyw1NTA4OCw1NTA4OSw1NTA5MCw1NTA5MSw1NTA5NCw1NTA5NSw1NTA5NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NTA5OCw1NTA5OSw1NTEwMSw1NTEwMiw1NTEwMyw1NTEwNCw1NTEwNSw1NTEwNiw1NTEwNyw1NTEwOSw1NTExMCw1NTExMiw1NTExNCw1NTExNSw1NTExNiw1NTExNyw1NTExOCw1NTExOSw1NTEyMiw1NTEyMyw1NTEyNSw1NTEzMCw1NTEzMSw1NTEzMiw1NTEzMyw1NTEzNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NTEzNSw1NTEzOCw1NTE0MCw1NTE0Miw1NTE0Myw1NTE0NCw1NTE0Niw1NTE0Nyw1NTE0OSw1NTE1MCw1NTE1MSw1NTE1Myw1NTE1NCw1NTE1NSw1NTE1Nyw1NTE1OCw1NTE1OSw1NTE2MCw1NTE2MSw1NTE2Miw1NTE2Myw1NTE2Niw1NTE2Nyw1NTE2OCw1NTE3MCw1NTE3MSw1NTE3Miw1NTE3Myw1NTE3NCw1NTE3NSw1NTE3OCw1NTE3OSw1MzMxNiw1MzMxNyw1MzMxOSw1MzMyMSw1MzMyOCw1MzMzMiw1MzMzNiw1MzM0NCw1MzM1Niw1MzM1Nyw1MzM2MCw1MzM2NCw1MzM3Miw1MzM3Myw1MzM3Nyw1MzQxMiw1MzQxMyw1MzQxNiw1MzQyMCw1MzQyOCw1MzQyOSw1MzQzMSw1MzQzMyw1MzQ0MCw1MzQ0MSw1MzQ0NCw1MzQ0OCw1MzQ0OSw1MzQ1Niw1MzQ1Nyw1MzQ1OSw1MzQ2MCw1MzQ2MSw1MzQ2OCw1MzQ2OSw1MzQ3Miw1MzQ3Niw1MzQ4NCw1MzQ4NSw1MzQ4Nyw1MzQ4OCw1MzQ4OSw1MzQ5Niw1MzUxNyw1MzU1Miw1MzU1Myw1MzU1Niw1MzU2MCw1MzU2Miw1MzU2OCw1MzU2OSw1MzU3MSw1MzU3Miw1MzU3Myw1MzU4MCw1MzU4MSw1MzU4NCw1MzU4OCw1MzU5Niw1MzU5Nyw1MzU5OSw1MzYwMSw1MzYwOCw1MzYxMiw1MzYyOCw1MzYzNiw1MzY0MCw1MzY2NCw1MzY2NSw1MzY2OCw1MzY3Miw1MzY4MCw1MzY4MSw1MzY4Myw1MzY4NSw1MzY5MCw1MzY5Miw1MzY5Niw1MzcyMCw1Mzc0OCw1Mzc1Miw1Mzc2Nyw1Mzc2OSw1Mzc3Niw1MzgwNCw1MzgwNSw1MzgwOCw1MzgxMiw1MzgyMCw1MzgyMSw1MzgyMyw1MzgyNSw1MzgzMiw1Mzg1Miw1NTE4MSw1NTE4Miw1NTE4Myw1NTE4NSw1NTE4Niw1NTE4Nyw1NTE4OCw1NTE4OSw1NTE5MCw1NTE5MSw1NTE5NCw1NTE5Niw1NTE5OCw1NTE5OSw1NTIwMCw1NTIwMSw1NTIwMiw1NTIwMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzg2MCw1Mzg4OCw1Mzg4OSw1Mzg5Miw1Mzg5Niw1MzkwNCw1MzkwNSw1MzkwOSw1MzkxNiw1MzkyMCw1MzkyNCw1MzkzMiw1MzkzNyw1Mzk0NCw1Mzk0NSw1Mzk0OCw1Mzk1MSw1Mzk1Miw1Mzk1NCw1Mzk2MCw1Mzk2MSw1Mzk2Myw1Mzk3Miw1Mzk3Niw1Mzk4MCw1Mzk4OCw1Mzk4OSw1NDAwMCw1NDAwMSw1NDAwNCw1NDAwOCw1NDAxNiw1NDAxNyw1NDAxOSw1NDAyMSw1NDAyOCw1NDAyOSw1NDAzMCw1NDAzMiw1NDAzNiw1NDAzOCw1NDA0NCw1NDA0NSw1NDA0Nyw1NDA0OCw1NDA0OSw1NDA1Myw1NDA1Niw1NDA1Nyw1NDA2MCw1NDA2NCw1NDA3Miw1NDA3Myw1NDA3NSw1NDA3Niw1NDA3Nyw1NDA4NCw1NDA4NSw1NDE0MCw1NDE0MSw1NDE0NCw1NDE0OCw1NDE1Niw1NDE1Nyw1NDE1OSw1NDE2MCw1NDE2MSw1NDE2OCw1NDE2OSw1NDE3Miw1NDE3Niw1NDE4NCw1NDE4NSw1NDE4Nyw1NDE4OSw1NDE5Niw1NDIwMCw1NDIwNCw1NDIxMiw1NDIxMyw1NDIxNiw1NDIxNyw1NDIyNCw1NDIzMiw1NDI0MSw1NDI0Myw1NDI1Miw1NDI1Myw1NDI1Niw1NDI2MCw1NDI2OCw1NDI2OSw1NDI3MSw1NDI3MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDI4MCw1NDMwMSw1NDMzNiw1NDM0MCw1NDM2NCw1NDM2OCw1NDM3Miw1NDM4MSw1NDM4Myw1NDM5Miw1NDM5Myw1NDM5Niw1NDM5OSw1NDQwMCw1NDQwMiw1NDQwOCw1NDQwOSw1NDQxMSw1NDQxMyw1NDQyMCw1NDQ0MSw1NDQ3Niw1NDQ4MCw1NDQ4NCw1NDQ5Miw1NDQ5NSw1NDUwNCw1NDUwOCw1NDUxMiw1NDUyMCw1NDUyMyw1NDUyNSw1NDUzMiw1NDUzNiw1NDU0MCw1NDU0OCw1NDU0OSw1NDU1MSw1NDU4OCw1NDU4OSw1NDU5Miw1NDU5Niw1NDYwNCw1NDYwNSw1NDYwNyw1NDYwOSw1NDYxNiw1NDYxNyw1NDYyMCw1NDYyNCw1NDYyOSw1NDYzMiw1NDYzMyw1NDYzNSw1NDYzNyw1NDY0NCw1NDY0NSw1NDY0OCw1NDY1Miw1NDY2MCw1NDY2MSw1NDY2Myw1NDY2NCw1NDY2NSw1NDY3Miw1NDY5Myw1NDcyOCw1NDcyOSw1NDczMiw1NDczNiw1NDczOCw1NDc0NCw1NDc0NSw1NDc0Nyw1NDc0OSw1NDc1Niw1NDc1Nyw1NDc2MCw1NDc2NCw1NDc3Miw1NDc3Myw1NDc3NSw1NDc3Nyw1NDc4NCw1NDc4NSw1NDc4OCw1NDc5Miw1NDgwMCw1NDgwMSw1NDgwMyw1NDgwNCw1NDgwNSw1NDgxMiw1NDgxNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDgyMCw1NDgyOSw1NDg0MCw1NDg0MSw1NDg0NCw1NDg0OCw1NDg1Myw1NDg1Niw1NDg1Nyw1NDg1OSw1NDg2MSw1NDg2NSw1NDg2OCw1NDg2OSw1NDg3Miw1NDg3Niw1NDg4Nyw1NDg4OSw1NDg5Niw1NDg5Nyw1NDkwMCw1NDkxNSw1NDkxNyw1NDkyNCw1NDkyNSw1NDkyOCw1NDkzMiw1NDk0MSw1NDk0Myw1NDk0NSw1NDk1Miw1NDk1Niw1NDk2MCw1NDk2OSw1NDk3MSw1NDk4MCw1NDk4MSw1NDk4NCw1NDk4OCw1NDk5Myw1NDk5Niw1NDk5OSw1NTAwMSw1NTAwOCw1NTAxMiw1NTAxNiw1NTAyNCw1NTAyOSw1NTAzNiw1NTAzNyw1NTA0MCw1NTA0NCw1NTA1Nyw1NTA2NCw1NTA2NSw1NTA2OCw1NTA3Miw1NTA4MCw1NTA4MSw1NTA4Myw1NTA4NSw1NTA5Miw1NTA5Myw1NTA5Niw1NTEwMCw1NTEwOCw1NTExMSw1NTExMyw1NTEyMCw1NTEyMSw1NTEyNCw1NTEyNiw1NTEyNyw1NTEyOCw1NTEyOSw1NTEzNiw1NTEzNyw1NTEzOSw1NTE0MSw1NTE0NSw1NTE0OCw1NTE1Miw1NTE1Niw1NTE2NCw1NTE2NSw1NTE2OSw1NTE3Niw1NTE3Nyw1NTE4MCw1NTE4NCw1NTE5Miw1NTE5Myw1NTE5NSw1NTE5NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwMjg1LDIwMzM5LDIwNTUxLDIwNzI5LDIxMTUyLDIxNDg3LDIxNjIxLDIxNzMzLDIyMDI1LDIzMjMzLDIzNDc4LDI2MjQ3LDI2NTUwLDI2NTUxLDI2NjA3LDI3NDY4LDI5NjM0LDMwMTQ2LDMxMjkyLDMzNDk5LDMzNTQwLDM0OTAzLDM0OTUyLDM1MzgyLDM2MDQwLDM2MzAzLDM2NjAzLDM2ODM4LDM5MzgxLDIxMDUxLDIxMzY0LDIxNTA4LDI0NjgyLDI0OTMyLDI3NTgwLDI5NjQ3LDMzMDUwLDM1MjU4LDM1MjgyLDM4MzA3LDIwMzU1LDIxMDAyLDIyNzE4LDIyOTA0LDIzMDE0LDI0MTc4LDI0MTg1LDI1MDMxLDI1NTM2LDI2NDM4LDI2NjA0LDI2NzUxLDI4NTY3LDMwMjg2LDMwNDc1LDMwOTY1LDMxMjQwLDMxNDg3LDMxNzc3LDMyOTI1LDMzMzkwLDMzMzkzLDM1NTYzLDM4MjkxLDIwMDc1LDIxOTE3LDI2MzU5LDI4MjEyLDMwODgzLDMxNDY5LDMzODgzLDM1MDg4LDM0NjM4LDM4ODI0LDIxMjA4LDIyMzUwLDIyNTcwLDIzODg0LDI0ODYzLDI1MDIyLDI1MTIxLDI1OTU0LDI2NTc3LDI3MjA0LDI4MTg3LDI5OTc2LDMwMTMxLDMwNDM1LDMwNjQwLDMyMDU4LDM3MDM5LDM3OTY5LDM3OTcwLDQwODUzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxMjgzLDIzNzI0LDMwMDAyLDMyOTg3LDM3NDQwLDM4Mjk2LDIxMDgzLDIyNTM2LDIzMDA0LDIzNzEzLDIzODMxLDI0MjQ3LDI0Mzc4LDI0Mzk0LDI0OTUxLDI3NzQzLDMwMDc0LDMwMDg2LDMxOTY4LDMyMTE1LDMyMTc3LDMyNjUyLDMzMTA4LDMzMzEzLDM0MTkzLDM1MTM3LDM1NjExLDM3NjI4LDM4NDc3LDQwMDA3LDIwMTcxLDIwMjE1LDIwNDkxLDIwOTc3LDIyNjA3LDI0ODg3LDI0ODk0LDI0OTM2LDI1OTEzLDI3MTE0LDI4NDMzLDMwMTE3LDMwMzQyLDMwNDIyLDMxNjIzLDMzNDQ1LDMzOTk1LDYzNzQ0LDM3Nzk5LDM4MjgzLDIxODg4LDIzNDU4LDIyMzUzLDYzNzQ1LDMxOTIzLDMyNjk3LDM3MzAxLDIwNTIwLDIxNDM1LDIzNjIxLDI0MDQwLDI1Mjk4LDI1NDU0LDI1ODE4LDI1ODMxLDI4MTkyLDI4ODQ0LDMxMDY3LDM2MzE3LDM2MzgyLDYzNzQ2LDM2OTg5LDM3NDQ1LDM3NjI0LDIwMDk0LDIwMjE0LDIwNTgxLDI0MDYyLDI0MzE0LDI0ODM4LDI2OTY3LDMzMTM3LDM0Mzg4LDM2NDIzLDM3NzQ5LDM5NDY3LDIwMDYyLDIwNjI1LDI2NDgwLDI2Njg4LDIwNzQ1LDIxMTMzLDIxMTM4LDI3Mjk4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMwNjUyLDM3MzkyLDQwNjYwLDIxMTYzLDI0NjIzLDM2ODUwLDIwNTUyLDI1MDAxLDI1NTgxLDI1ODAyLDI2Njg0LDI3MjY4LDI4NjA4LDMzMTYwLDM1MjMzLDM4NTQ4LDIyNTMzLDI5MzA5LDI5MzU2LDI5OTU2LDMyMTIxLDMyMzY1LDMyOTM3LDM1MjExLDM1NzAwLDM2OTYzLDQwMjczLDI1MjI1LDI3NzcwLDI4NTAwLDMyMDgwLDMyNTcwLDM1MzYzLDIwODYwLDI0OTA2LDMxNjQ1LDM1NjA5LDM3NDYzLDM3NzcyLDIwMTQwLDIwNDM1LDIwNTEwLDIwNjcwLDIwNzQyLDIxMTg1LDIxMTk3LDIxMzc1LDIyMzg0LDIyNjU5LDI0MjE4LDI0NDY1LDI0OTUwLDI1MDA0LDI1ODA2LDI1OTY0LDI2MjIzLDI2Mjk5LDI2MzU2LDI2Nzc1LDI4MDM5LDI4ODA1LDI4OTEzLDI5ODU1LDI5ODYxLDI5ODk4LDMwMTY5LDMwODI4LDMwOTU2LDMxNDU1LDMxNDc4LDMyMDY5LDMyMTQ3LDMyNzg5LDMyODMxLDMzMDUxLDMzNjg2LDM1Njg2LDM2NjI5LDM2ODg1LDM3ODU3LDM4OTE1LDM4OTY4LDM5NTE0LDM5OTEyLDIwNDE4LDIxODQzLDIyNTg2LDIyODY1LDIzMzk1LDIzNjIyLDI0NzYwLDI1MTA2LDI2NjkwLDI2ODAwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2ODU2LDI4MzMwLDMwMDI4LDMwMzI4LDMwOTI2LDMxMjkzLDMxOTk1LDMyMzYzLDMyMzgwLDM1MzM2LDM1NDg5LDM1OTAzLDM4NTQyLDQwMzg4LDIxNDc2LDIxNDgxLDIxNTc4LDIxNjE3LDIyMjY2LDIyOTkzLDIzMzk2LDIzNjExLDI0MjM1LDI1MzM1LDI1OTExLDI1OTI1LDI1OTcwLDI2MjcyLDI2NTQzLDI3MDczLDI3ODM3LDMwMjA0LDMwMzUyLDMwNTkwLDMxMjk1LDMyNjYwLDMyNzcxLDMyOTI5LDMzMTY3LDMzNTEwLDMzNTMzLDMzNzc2LDM0MjQxLDM0ODY1LDM0OTk2LDM1NDkzLDYzNzQ3LDM2NzY0LDM3Njc4LDM4NTk5LDM5MDE1LDM5NjQwLDQwNzIzLDIxNzQxLDI2MDExLDI2MzU0LDI2NzY3LDMxMjk2LDM1ODk1LDQwMjg4LDIyMjU2LDIyMzcyLDIzODI1LDI2MTE4LDI2ODAxLDI2ODI5LDI4NDE0LDI5NzM2LDM0OTc0LDM5OTA4LDI3NzUyLDYzNzQ4LDM5NTkyLDIwMzc5LDIwODQ0LDIwODQ5LDIxMTUxLDIzMzgwLDI0MDM3LDI0NjU2LDI0Njg1LDI1MzI5LDI1NTExLDI1OTE1LDI5NjU3LDMxMzU0LDM0NDY3LDM2MDAyLDM4Nzk5LDIwMDE4LDIzNTIxLDI1MDk2LDI2NTI0LDI5OTE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxMTg1LDMzNzQ3LDM1NDYzLDM1NTA2LDM2MzI4LDM2OTQyLDM3NzA3LDM4OTgyLDI0Mjc1LDI3MTEyLDM0MzAzLDM3MTAxLDYzNzQ5LDIwODk2LDIzNDQ4LDIzNTMyLDI0OTMxLDI2ODc0LDI3NDU0LDI4NzQ4LDI5NzQzLDI5OTEyLDMxNjQ5LDMyNTkyLDMzNzMzLDM1MjY0LDM2MDExLDM4MzY0LDM5MjA4LDIxMDM4LDI0NjY5LDI1MzI0LDM2ODY2LDIwMzYyLDIwODA5LDIxMjgxLDIyNzQ1LDI0MjkxLDI2MzM2LDI3OTYwLDI4ODI2LDI5Mzc4LDI5NjU0LDMxNTY4LDMzMDA5LDM3OTc5LDIxMzUwLDI1NDk5LDMyNjE5LDIwMDU0LDIwNjA4LDIyNjAyLDIyNzUwLDI0NjE4LDI0ODcxLDI1Mjk2LDI3MDg4LDM5NzQ1LDIzNDM5LDMyMDI0LDMyOTQ1LDM2NzAzLDIwMTMyLDIwNjg5LDIxNjc2LDIxOTMyLDIzMzA4LDIzOTY4LDI0MDM5LDI1ODk4LDI1OTM0LDI2NjU3LDI3MjExLDI5NDA5LDMwMzUwLDMwNzAzLDMyMDk0LDMyNzYxLDMzMTg0LDM0MTI2LDM0NTI3LDM2NjExLDM2Njg2LDM3MDY2LDM5MTcxLDM5NTA5LDM5ODUxLDE5OTkyLDIwMDM3LDIwMDYxLDIwMTY3LDIwNDY1LDIwODU1LDIxMjQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxMzEyLDIxNDc1LDIxNDc3LDIxNjQ2LDIyMDM2LDIyMzg5LDIyNDM0LDIzNDk1LDIzOTQzLDI0MjcyLDI1MDg0LDI1MzA0LDI1OTM3LDI2NTUyLDI2NjAxLDI3MDgzLDI3NDcyLDI3NTkwLDI3NjI4LDI3NzE0LDI4MzE3LDI4NzkyLDI5Mzk5LDI5NTkwLDI5Njk5LDMwNjU1LDMwNjk3LDMxMzUwLDMyMTI3LDMyNzc3LDMzMjc2LDMzMjg1LDMzMjkwLDMzNTAzLDM0OTE0LDM1NjM1LDM2MDkyLDM2NTQ0LDM2ODgxLDM3MDQxLDM3NDc2LDM3NTU4LDM5Mzc4LDM5NDkzLDQwMTY5LDQwNDA3LDQwODYwLDIyMjgzLDIzNjE2LDMzNzM4LDM4ODE2LDM4ODI3LDQwNjI4LDIxNTMxLDMxMzg0LDMyNjc2LDM1MDMzLDM2NTU3LDM3MDg5LDIyNTI4LDIzNjI0LDI1NDk2LDMxMzkxLDIzNDcwLDI0MzM5LDMxMzUzLDMxNDA2LDMzNDIyLDM2NTI0LDIwNTE4LDIxMDQ4LDIxMjQwLDIxMzY3LDIyMjgwLDI1MzMxLDI1NDU4LDI3NDAyLDI4MDk5LDMwNTE5LDIxNDEzLDI5NTI3LDM0MTUyLDM2NDcwLDM4MzU3LDI2NDI2LDI3MzMxLDI4NTI4LDM1NDM3LDM2NTU2LDM5MjQzLDYzNzUwLDI2MjMxLDI3NTEyLDM2MDIwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM5NzQwLDYzNzUxLDIxNDgzLDIyMzE3LDIyODYyLDI1NTQyLDI3MTMxLDI5Njc0LDMwNzg5LDMxNDE4LDMxNDI5LDMxOTk4LDMzOTA5LDM1MjE1LDM2MjExLDM2OTE3LDM4MzEyLDIxMjQzLDIyMzQzLDMwMDIzLDMxNTg0LDMzNzQwLDM3NDA2LDYzNzUyLDI3MjI0LDIwODExLDIxMDY3LDIxMTI3LDI1MTE5LDI2ODQwLDI2OTk3LDM4NTUzLDIwNjc3LDIxMTU2LDIxMjIwLDI1MDI3LDI2MDIwLDI2NjgxLDI3MTM1LDI5ODIyLDMxNTYzLDMzNDY1LDMzNzcxLDM1MjUwLDM1NjQxLDM2ODE3LDM5MjQxLDYzNzUzLDIwMTcwLDIyOTM1LDI1ODEwLDI2MTI5LDI3Mjc4LDI5NzQ4LDMxMTA1LDMxMTY1LDMzNDQ5LDM0OTQyLDM0OTQzLDM1MTY3LDYzNzU0LDM3NjcwLDIwMjM1LDIxNDUwLDI0NjEzLDI1MjAxLDI3NzYyLDMyMDI2LDMyMTAyLDIwMTIwLDIwODM0LDMwNjg0LDMyOTQzLDIwMjI1LDIwMjM4LDIwODU0LDIwODY0LDIxOTgwLDIyMTIwLDIyMzMxLDIyNTIyLDIyNTI0LDIyODA0LDIyODU1LDIyOTMxLDIzNDkyLDIzNjk2LDIzODIyLDI0MDQ5LDI0MTkwLDI0NTI0LDI1MjE2LDI2MDcxLDI2MDgzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2Mzk4LDI2Mzk5LDI2NDYyLDI2ODI3LDI2ODIwLDI3MjMxLDI3NDUwLDI3NjgzLDI3NzczLDI3Nzc4LDI4MTAzLDI5NTkyLDI5NzM0LDI5NzM4LDI5ODI2LDI5ODU5LDMwMDcyLDMwMDc5LDMwODQ5LDMwOTU5LDMxMDQxLDMxMDQ3LDMxMDQ4LDMxMDk4LDMxNjM3LDMyMDAwLDMyMTg2LDMyNjQ4LDMyNzc0LDMyODEzLDMyOTA4LDM1MzUyLDM1NjYzLDM1OTEyLDM2MjE1LDM3NjY1LDM3NjY4LDM5MTM4LDM5MjQ5LDM5NDM4LDM5NDM5LDM5NTI1LDQwNTk0LDMyMjAyLDIwMzQyLDIxNTEzLDI1MzI2LDI2NzA4LDM3MzI5LDIxOTMxLDIwNzk0LDYzNzU1LDYzNzU2LDIzMDY4LDI1MDYyLDYzNzU3LDI1Mjk1LDI1MzQzLDYzNzU4LDYzNzU5LDYzNzYwLDYzNzYxLDYzNzYyLDYzNzYzLDM3MDI3LDYzNzY0LDYzNzY1LDYzNzY2LDYzNzY3LDYzNzY4LDM1NTgyLDYzNzY5LDYzNzcwLDYzNzcxLDYzNzcyLDI2MjYyLDYzNzczLDI5MDE0LDYzNzc0LDYzNzc1LDM4NjI3LDYzNzc2LDI1NDIzLDI1NDY2LDIxMzM1LDYzNzc3LDI2NTExLDI2OTc2LDI4Mjc1LDYzNzc4LDMwMDA3LDYzNzc5LDYzNzgwLDYzNzgxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyMDEzLDYzNzgyLDYzNzgzLDM0OTMwLDIyMjE4LDIzMDY0LDYzNzg0LDYzNzg1LDYzNzg2LDYzNzg3LDYzNzg4LDIwMDM1LDYzNzg5LDIwODM5LDIyODU2LDI2NjA4LDMyNzg0LDYzNzkwLDIyODk5LDI0MTgwLDI1NzU0LDMxMTc4LDI0NTY1LDI0Njg0LDI1Mjg4LDI1NDY3LDIzNTI3LDIzNTExLDIxMTYyLDYzNzkxLDIyOTAwLDI0MzYxLDI0NTk0LDYzNzkyLDYzNzkzLDYzNzk0LDI5Nzg1LDYzNzk1LDYzNzk2LDYzNzk3LDYzNzk4LDYzNzk5LDYzODAwLDM5Mzc3LDYzODAxLDYzODAyLDYzODAzLDYzODA0LDYzODA1LDYzODA2LDYzODA3LDYzODA4LDYzODA5LDYzODEwLDYzODExLDI4NjExLDYzODEyLDYzODEzLDMzMjE1LDM2Nzg2LDI0ODE3LDYzODE0LDYzODE1LDMzMTI2LDYzODE2LDYzODE3LDIzNjE1LDYzODE4LDYzODE5LDYzODIwLDYzODIxLDYzODIyLDYzODIzLDYzODI0LDYzODI1LDIzMjczLDM1MzY1LDI2NDkxLDMyMDE2LDYzODI2LDYzODI3LDYzODI4LDYzODI5LDYzODMwLDYzODMxLDMzMDIxLDYzODMyLDYzODMzLDIzNjEyLDI3ODc3LDIxMzExLDI4MzQ2LDIyODEwLDMzNTkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwMDI1LDIwMTUwLDIwMjk0LDIxOTM0LDIyMjk2LDIyNzI3LDI0NDA2LDI2MDM5LDI2MDg2LDI3MjY0LDI3NTczLDI4MjM3LDMwNzAxLDMxNDcxLDMxNzc0LDMyMjIyLDM0NTA3LDM0OTYyLDM3MTcwLDM3NzIzLDI1Nzg3LDI4NjA2LDI5NTYyLDMwMTM2LDM2OTQ4LDIxODQ2LDIyMzQ5LDI1MDE4LDI1ODEyLDI2MzExLDI4MTI5LDI4MjUxLDI4NTI1LDI4NjAxLDMwMTkyLDMyODM1LDMzMjEzLDM0MTEzLDM1MjAzLDM1NTI3LDM1Njc0LDM3NjYzLDI3Nzk1LDMwMDM1LDMxNTcyLDM2MzY3LDM2OTU3LDIxNzc2LDIyNTMwLDIyNjE2LDI0MTYyLDI1MDk1LDI1NzU4LDI2ODQ4LDMwMDcwLDMxOTU4LDM0NzM5LDQwNjgwLDIwMTk1LDIyNDA4LDIyMzgyLDIyODIzLDIzNTY1LDIzNzI5LDI0MTE4LDI0NDUzLDI1MTQwLDI1ODI1LDI5NjE5LDMzMjc0LDM0OTU1LDM2MDI0LDM4NTM4LDQwNjY3LDIzNDI5LDI0NTAzLDI0NzU1LDIwNDk4LDIwOTkyLDIxMDQwLDIyMjk0LDIyNTgxLDIyNjE1LDIzNTY2LDIzNjQ4LDIzNzk4LDIzOTQ3LDI0MjMwLDI0NDY2LDI0NzY0LDI1MzYxLDI1NDgxLDI1NjIzLDI2NjkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2ODczLDI3MzMwLDI4MTIwLDI4MTkzLDI4MzcyLDI4NjQ0LDI5MTgyLDMwNDI4LDMwNTg1LDMxMTUzLDMxMjkxLDMzNzk2LDM1MjQxLDM2MDc3LDM2MzM5LDM2NDI0LDM2ODY3LDM2ODg0LDM2OTQ3LDM3MTE3LDM3NzA5LDM4NTE4LDM4ODc2LDI3NjAyLDI4Njc4LDI5MjcyLDI5MzQ2LDI5NTQ0LDMwNTYzLDMxMTY3LDMxNzE2LDMyNDExLDM1NzEyLDIyNjk3LDI0Nzc1LDI1OTU4LDI2MTA5LDI2MzAyLDI3Nzg4LDI4OTU4LDI5MTI5LDM1OTMwLDM4OTMxLDIwMDc3LDMxMzYxLDIwMTg5LDIwOTA4LDIwOTQxLDIxMjA1LDIxNTE2LDI0OTk5LDI2NDgxLDI2NzA0LDI2ODQ3LDI3OTM0LDI4NTQwLDMwMTQwLDMwNjQzLDMxNDYxLDMzMDEyLDMzODkxLDM3NTA5LDIwODI4LDI2MDA3LDI2NDYwLDI2NTE1LDMwMTY4LDMxNDMxLDMzNjUxLDYzODM0LDM1OTEwLDM2ODg3LDM4OTU3LDIzNjYzLDMzMjE2LDMzNDM0LDM2OTI5LDM2OTc1LDM3Mzg5LDI0NDcxLDIzOTY1LDI3MjI1LDI5MTI4LDMwMzMxLDMxNTYxLDM0Mjc2LDM1NTg4LDM3MTU5LDM5NDcyLDIxODk1LDI1MDc4LDYzODM1LDMwMzEzLDMyNjQ1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM0MzY3LDM0NzQ2LDM1MDY0LDM3MDA3LDYzODM2LDI3OTMxLDI4ODg5LDI5NjYyLDMyMDk3LDMzODUzLDYzODM3LDM3MjI2LDM5NDA5LDYzODM4LDIwMDk4LDIxMzY1LDI3Mzk2LDI3NDEwLDI4NzM0LDI5MjExLDM0MzQ5LDQwNDc4LDIxMDY4LDM2NzcxLDIzODg4LDI1ODI5LDI1OTAwLDI3NDE0LDI4NjUxLDMxODExLDMyNDEyLDM0MjUzLDM1MTcyLDM1MjYxLDI1Mjg5LDMzMjQwLDM0ODQ3LDI0MjY2LDI2MzkxLDI4MDEwLDI5NDM2LDI5NzAxLDI5ODA3LDM0NjkwLDM3MDg2LDIwMzU4LDIzODIxLDI0NDgwLDMzODAyLDIwOTE5LDI1NTA0LDMwMDUzLDIwMTQyLDIwNDg2LDIwODQxLDIwOTM3LDI2NzUzLDI3MTUzLDMxOTE4LDMxOTIxLDMxOTc1LDMzMzkxLDM1NTM4LDM2NjM1LDM3MzI3LDIwNDA2LDIwNzkxLDIxMjM3LDIxNTcwLDI0MzAwLDI0OTQyLDI1MTUwLDI2MDUzLDI3MzU0LDI4NjcwLDMxMDE4LDM0MjY4LDM0ODUxLDM4MzE3LDM5NTIyLDM5NTMwLDQwNTk5LDQwNjU0LDIxMTQ3LDI2MzEwLDI3NTExLDI4NzAxLDMxMDE5LDM2NzA2LDM4NzIyLDI0OTc2LDI1MDg4LDI1ODkxLDI4NDUxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI5MDAxLDI5ODMzLDMyMjQ0LDMyODc5LDM0MDMwLDM2NjQ2LDM2ODk5LDM3NzA2LDIwOTI1LDIxMDE1LDIxMTU1LDI3OTE2LDI4ODcyLDM1MDEwLDI0MjY1LDI1OTg2LDI3NTY2LDI4NjEwLDMxODA2LDI5NTU3LDIwMTk2LDIwMjc4LDIyMjY1LDYzODM5LDIzNzM4LDIzOTk0LDI0NjA0LDI5NjE4LDMxNTMzLDMyNjY2LDMyNzE4LDMyODM4LDM2ODk0LDM3NDI4LDM4NjQ2LDM4NzI4LDM4OTM2LDQwODAxLDIwMzYzLDI4NTgzLDMxMTUwLDM3MzAwLDM4NTgzLDIxMjE0LDYzODQwLDI1NzM2LDI1Nzk2LDI3MzQ3LDI4NTEwLDI4Njk2LDI5MjAwLDMwNDM5LDMyNzY5LDM0MzEwLDM0Mzk2LDM2MzM1LDM2NjEzLDM4NzA2LDM5NzkxLDQwNDQyLDQwNTY1LDMwODYwLDMxMTAzLDMyMTYwLDMzNzM3LDM3NjM2LDQwNTc1LDQwNTk1LDM1NTQyLDIyNzUxLDI0MzI0LDI2NDA3LDI4NzExLDI5OTAzLDMxODQwLDMyODk0LDIwNzY5LDI4NzEyLDI5MjgyLDMwOTIyLDM2MDM0LDM2MDU4LDM2MDg0LDM4NjQ3LDIwMTAyLDIwNjk4LDIzNTM0LDI0Mjc4LDI2MDA5LDI5MTM0LDMwMjc0LDMwNjM3LDMyODQyLDM0MDQ0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2OTg4LDM5NzE5LDQwODQ1LDIyNzQ0LDIzMTA1LDIzNjUwLDI3MTU1LDI4MTIyLDI4NDMxLDMwMjY3LDMyMDQ3LDMyMzExLDM0MDc4LDM1MTI4LDM3ODYwLDM4NDc1LDIxMTI5LDI2MDY2LDI2NjExLDI3MDYwLDI3OTY5LDI4MzE2LDI4Njg3LDI5NzA1LDI5NzkyLDMwMDQxLDMwMjQ0LDMwODI3LDM1NjI4LDM5MDA2LDIwODQ1LDI1MTM0LDM4NTIwLDIwMzc0LDIwNTIzLDIzODMzLDI4MTM4LDMyMTg0LDM2NjUwLDI0NDU5LDI0OTAwLDI2NjQ3LDYzODQxLDM4NTM0LDIxMjAyLDMyOTA3LDIwOTU2LDIwOTQwLDI2OTc0LDMxMjYwLDMyMTkwLDMzNzc3LDM4NTE3LDIwNDQyLDIxMDMzLDIxNDAwLDIxNTE5LDIxNzc0LDIzNjUzLDI0NzQzLDI2NDQ2LDI2NzkyLDI4MDEyLDI5MzEzLDI5NDMyLDI5NzAyLDI5ODI3LDYzODQyLDMwMTc4LDMxODUyLDMyNjMzLDMyNjk2LDMzNjczLDM1MDIzLDM1MDQxLDM3MzI0LDM3MzI4LDM4NjI2LDM5ODgxLDIxNTMzLDI4NTQyLDI5MTM2LDI5ODQ4LDM0Mjk4LDM2NTIyLDM4NTYzLDQwMDIzLDQwNjA3LDI2NTE5LDI4MTA3LDI5NzQ3LDMzMjU2LDM4Njc4LDMwNzY0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxNDM1LDMxNTIwLDMxODkwLDI1NzA1LDI5ODAyLDMwMTk0LDMwOTA4LDMwOTUyLDM5MzQwLDM5NzY0LDQwNjM1LDIzNTE4LDI0MTQ5LDI4NDQ4LDMzMTgwLDMzNzA3LDM3MDAwLDE5OTc1LDIxMzI1LDIzMDgxLDI0MDE4LDI0Mzk4LDI0OTMwLDI1NDA1LDI2MjE3LDI2MzY0LDI4NDE1LDI4NDU5LDI4NzcxLDMwNjIyLDMzODM2LDM0MDY3LDM0ODc1LDM2NjI3LDM5MjM3LDM5OTk1LDIxNzg4LDI1MjczLDI2NDExLDI3ODE5LDMzNTQ1LDM1MTc4LDM4Nzc4LDIwMTI5LDIyOTE2LDI0NTM2LDI0NTM3LDI2Mzk1LDMyMTc4LDMyNTk2LDMzNDI2LDMzNTc5LDMzNzI1LDM2NjM4LDM3MDE3LDIyNDc1LDIyOTY5LDIzMTg2LDIzNTA0LDI2MTUxLDI2NTIyLDI2NzU3LDI3NTk5LDI5MDI4LDMyNjI5LDM2MDIzLDM2MDY3LDM2OTkzLDM5NzQ5LDMzMDMyLDM1OTc4LDM4NDc2LDM5NDg4LDQwNjEzLDIzMzkxLDI3NjY3LDI5NDY3LDMwNDUwLDMwNDMxLDMzODA0LDIwOTA2LDM1MjE5LDIwODEzLDIwODg1LDIxMTkzLDI2ODI1LDI3Nzk2LDMwNDY4LDMwNDk2LDMyMTkxLDMyMjM2LDM4NzU0LDQwNjI5LDI4MzU3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM0MDY1LDIwOTAxLDIxNTE3LDIxNjI5LDI2MTI2LDI2MjY5LDI2OTE5LDI4MzE5LDMwMzk5LDMwNjA5LDMzNTU5LDMzOTg2LDM0NzE5LDM3MjI1LDM3NTI4LDQwMTgwLDM0OTQ2LDIwMzk4LDIwODgyLDIxMjE1LDIyOTgyLDI0MTI1LDI0OTE3LDI1NzIwLDI1NzIxLDI2Mjg2LDI2NTc2LDI3MTY5LDI3NTk3LDI3NjExLDI5Mjc5LDI5MjgxLDI5NzYxLDMwNTIwLDMwNjgzLDMyNzkxLDMzNDY4LDMzNTQxLDM1NTg0LDM1NjI0LDM1OTgwLDI2NDA4LDI3NzkyLDI5Mjg3LDMwNDQ2LDMwNTY2LDMxMzAyLDQwMzYxLDI3NTE5LDI3Nzk0LDIyODE4LDI2NDA2LDMzOTQ1LDIxMzU5LDIyNjc1LDIyOTM3LDI0Mjg3LDI1NTUxLDI2MTY0LDI2NDgzLDI4MjE4LDI5NDgzLDMxNDQ3LDMzNDk1LDM3NjcyLDIxMjA5LDI0MDQzLDI1MDA2LDI1MDM1LDI1MDk4LDI1Mjg3LDI1NzcxLDI2MDgwLDI2OTY5LDI3NDk0LDI3NTk1LDI4OTYxLDI5Njg3LDMwMDQ1LDMyMzI2LDMzMzEwLDMzNTM4LDM0MTU0LDM1NDkxLDM2MDMxLDM4Njk1LDQwMjg5LDIyNjk2LDQwNjY0LDIwNDk3LDIxMDA2LDIxNTYzLDIxODM5LDI1OTkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI3NzY2LDMyMDEwLDMyMDExLDMyODYyLDM0NDQyLDM4MjcyLDM4NjM5LDIxMjQ3LDI3Nzk3LDI5Mjg5LDIxNjE5LDIzMTk0LDIzNjE0LDIzODgzLDI0Mzk2LDI0NDk0LDI2NDEwLDI2ODA2LDI2OTc5LDI4MjIwLDI4MjI4LDMwNDczLDMxODU5LDMyNjU0LDM0MTgzLDM1NTk4LDM2ODU1LDM4NzUzLDQwNjkyLDIzNzM1LDI0NzU4LDI0ODQ1LDI1MDAzLDI1OTM1LDI2MTA3LDI2MTA4LDI3NjY1LDI3ODg3LDI5NTk5LDI5NjQxLDMyMjI1LDM4MjkyLDIzNDk0LDM0NTg4LDM1NjAwLDIxMDg1LDIxMzM4LDI1MjkzLDI1NjE1LDI1Nzc4LDI2NDIwLDI3MTkyLDI3ODUwLDI5NjMyLDI5ODU0LDMxNjM2LDMxODkzLDMyMjgzLDMzMTYyLDMzMzM0LDM0MTgwLDM2ODQzLDM4NjQ5LDM5MzYxLDIwMjc2LDIxMzIyLDIxNDUzLDIxNDY3LDI1MjkyLDI1NjQ0LDI1ODU2LDI2MDAxLDI3MDc1LDI3ODg2LDI4NTA0LDI5Njc3LDMwMDM2LDMwMjQyLDMwNDM2LDMwNDYwLDMwOTI4LDMwOTcxLDMxMDIwLDMyMDcwLDMzMzI0LDM0Nzg0LDM2ODIwLDM4OTMwLDM5MTUxLDIxMTg3LDI1MzAwLDI1NzY1LDI4MTk2LDI4NDk3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMwMzMyLDM2Mjk5LDM3Mjk3LDM3NDc0LDM5NjYyLDM5NzQ3LDIwNTE1LDIwNjIxLDIyMzQ2LDIyOTUyLDIzNTkyLDI0MTM1LDI0NDM5LDI1MTUxLDI1OTE4LDI2MDQxLDI2MDQ5LDI2MTIxLDI2NTA3LDI3MDM2LDI4MzU0LDMwOTE3LDMyMDMzLDMyOTM4LDMzMTUyLDMzMzIzLDMzNDU5LDMzOTUzLDM0NDQ0LDM1MzcwLDM1NjA3LDM3MDMwLDM4NDUwLDQwODQ4LDIwNDkzLDIwNDY3LDYzODQzLDIyNTIxLDI0NDcyLDI1MzA4LDI1NDkwLDI2NDc5LDI4MjI3LDI4OTUzLDMwNDAzLDMyOTcyLDMyOTg2LDM1MDYwLDM1MDYxLDM1MDk3LDM2MDY0LDM2NjQ5LDM3MTk3LDM4NTA2LDIwMjcxLDIwMzM2LDI0MDkxLDI2NTc1LDI2NjU4LDMwMzMzLDMwMzM0LDM5NzQ4LDI0MTYxLDI3MTQ2LDI5MDMzLDI5MTQwLDMwMDU4LDYzODQ0LDMyMzIxLDM0MTE1LDM0MjgxLDM5MTMyLDIwMjQwLDMxNTY3LDMyNjI0LDM4MzA5LDIwOTYxLDI0MDcwLDI2ODA1LDI3NzEwLDI3NzI2LDI3ODY3LDI5MzU5LDMxNjg0LDMzNTM5LDI3ODYxLDI5NzU0LDIwNzMxLDIxMTI4LDIyNzIxLDI1ODE2LDI3Mjg3LDI5ODYzLDMwMjk0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMwODg3LDM0MzI3LDM4MzcwLDM4NzEzLDYzODQ1LDIxMzQyLDI0MzIxLDM1NzIyLDM2Nzc2LDM2NzgzLDM3MDAyLDIxMDI5LDMwNjI5LDQwMDA5LDQwNzEyLDE5OTkzLDIwNDgyLDIwODUzLDIzNjQzLDI0MTgzLDI2MTQyLDI2MTcwLDI2NTY0LDI2ODIxLDI4ODUxLDI5OTUzLDMwMTQ5LDMxMTc3LDMxNDUzLDM2NjQ3LDM5MjAwLDM5NDMyLDIwNDQ1LDIyNTYxLDIyNTc3LDIzNTQyLDI2MjIyLDI3NDkzLDI3OTIxLDI4MjgyLDI4NTQxLDI5NjY4LDI5OTk1LDMzNzY5LDM1MDM2LDM1MDkxLDM1Njc2LDM2NjI4LDIwMjM5LDIwNjkzLDIxMjY0LDIxMzQwLDIzNDQzLDI0NDg5LDI2MzgxLDMxMTE5LDMzMTQ1LDMzNTgzLDM0MDY4LDM1MDc5LDM1MjA2LDM2NjY1LDM2NjY3LDM5MzMzLDM5OTU0LDI2NDEyLDIwMDg2LDIwNDcyLDIyODU3LDIzNTUzLDIzNzkxLDIzNzkyLDI1NDQ3LDI2ODM0LDI4OTI1LDI5MDkwLDI5NzM5LDMyMjk5LDM0MDI4LDM0NTYyLDM2ODk4LDM3NTg2LDQwMTc5LDE5OTgxLDIwMTg0LDIwNDYzLDIwNjEzLDIxMDc4LDIxMTAzLDIxNTQyLDIxNjQ4LDIyNDk2LDIyODI3LDIzMTQyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIzMzg2LDIzNDEzLDIzNTAwLDI0MjIwLDYzODQ2LDI1MjA2LDI1OTc1LDI2MDIzLDI4MDE0LDI4MzI1LDI5MjM4LDMxNTI2LDMxODA3LDMyNTY2LDMzMTA0LDMzMTA1LDMzMTc4LDMzMzQ0LDMzNDMzLDMzNzA1LDM1MzMxLDM2MDAwLDM2MDcwLDM2MDkxLDM2MjEyLDM2MjgyLDM3MDk2LDM3MzQwLDM4NDI4LDM4NDY4LDM5Mzg1LDQwMTY3LDIxMjcxLDIwOTk4LDIxNTQ1LDIyMTMyLDIyNzA3LDIyODY4LDIyODk0LDI0NTc1LDI0OTk2LDI1MTk4LDI2MTI4LDI3Nzc0LDI4OTU0LDMwNDA2LDMxODgxLDMxOTY2LDMyMDI3LDMzNDUyLDM2MDMzLDM4NjQwLDYzODQ3LDIwMzE1LDI0MzQzLDI0NDQ3LDI1MjgyLDIzODQ5LDI2Mzc5LDI2ODQyLDMwODQ0LDMyMzIzLDQwMzAwLDE5OTg5LDIwNjMzLDIxMjY5LDIxMjkwLDIxMzI5LDIyOTE1LDIzMTM4LDI0MTk5LDI0NzU0LDI0OTcwLDI1MTYxLDI1MjA5LDI2MDAwLDI2NTAzLDI3MDQ3LDI3NjA0LDI3NjA2LDI3NjA3LDI3NjA4LDI3ODMyLDYzODQ4LDI5NzQ5LDMwMjAyLDMwNzM4LDMwODY1LDMxMTg5LDMxMTkyLDMxODc1LDMyMjAzLDMyNzM3LDMyOTMzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMzMDg2LDMzMjE4LDMzNzc4LDM0NTg2LDM1MDQ4LDM1NTEzLDM1NjkyLDM2MDI3LDM3MTQ1LDM4NzUwLDM5MTMxLDQwNzYzLDIyMTg4LDIzMzM4LDI0NDI4LDI1OTk2LDI3MzE1LDI3NTY3LDI3OTk2LDI4NjU3LDI4NjkzLDI5Mjc3LDI5NjEzLDM2MDA3LDM2MDUxLDM4OTcxLDI0OTc3LDI3NzAzLDMyODU2LDM5NDI1LDIwMDQ1LDIwMTA3LDIwMTIzLDIwMTgxLDIwMjgyLDIwMjg0LDIwMzUxLDIwNDQ3LDIwNzM1LDIxNDkwLDIxNDk2LDIxNzY2LDIxOTg3LDIyMjM1LDIyNzYzLDIyODgyLDIzMDU3LDIzNTMxLDIzNTQ2LDIzNTU2LDI0MDUxLDI0MTA3LDI0NDczLDI0NjA1LDI1NDQ4LDI2MDEyLDI2MDMxLDI2NjE0LDI2NjE5LDI2Nzk3LDI3NTE1LDI3ODAxLDI3ODYzLDI4MTk1LDI4NjgxLDI5NTA5LDMwNzIyLDMxMDM4LDMxMDQwLDMxMDcyLDMxMTY5LDMxNzIxLDMyMDIzLDMyMTE0LDMyOTAyLDMzMjkzLDMzNjc4LDM0MDAxLDM0NTAzLDM1MDM5LDM1NDA4LDM1NDIyLDM1NjEzLDM2MDYwLDM2MTk4LDM2NzgxLDM3MDM0LDM5MTY0LDM5MzkxLDQwNjA1LDIxMDY2LDYzODQ5LDI2Mzg4LDYzODUwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwNjMyLDIxMDM0LDIzNjY1LDI1OTU1LDI3NzMzLDI5NjQyLDI5OTg3LDMwMTA5LDMxNjM5LDMzOTQ4LDM3MjQwLDM4NzA0LDIwMDg3LDI1NzQ2LDI3NTc4LDI5MDIyLDM0MjE3LDE5OTc3LDYzODUxLDI2NDQxLDI2ODYyLDI4MTgzLDMzNDM5LDM0MDcyLDM0OTIzLDI1NTkxLDI4NTQ1LDM3Mzk0LDM5MDg3LDE5OTc4LDIwNjYzLDIwNjg3LDIwNzY3LDIxODMwLDIxOTMwLDIyMDM5LDIzMzYwLDIzNTc3LDIzNzc2LDI0MTIwLDI0MjAyLDI0MjI0LDI0MjU4LDI0ODE5LDI2NzA1LDI3MjMzLDI4MjQ4LDI5MjQ1LDI5MjQ4LDI5Mzc2LDMwNDU2LDMxMDc3LDMxNjY1LDMyNzI0LDM1MDU5LDM1MzE2LDM1NDQzLDM1OTM3LDM2MDYyLDM4Njg0LDIyNjIyLDI5ODg1LDM2MDkzLDIxOTU5LDYzODUyLDMxMzI5LDMyMDM0LDMzMzk0LDI5Mjk4LDI5OTgzLDI5OTg5LDYzODUzLDMxNTEzLDIyNjYxLDIyNzc5LDIzOTk2LDI0MjA3LDI0MjQ2LDI0NDY0LDI0NjYxLDI1MjM0LDI1NDcxLDI1OTMzLDI2MjU3LDI2MzI5LDI2MzYwLDI2NjQ2LDI2ODY2LDI5MzEyLDI5NzkwLDMxNTk4LDMyMTEwLDMyMjE0LDMyNjI2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyOTk3LDMzMjk4LDM0MjIzLDM1MTk5LDM1NDc1LDM2ODkzLDM3NjA0LDQwNjUzLDQwNzM2LDIyODA1LDIyODkzLDI0MTA5LDI0Nzk2LDI2MTMyLDI2MjI3LDI2NTEyLDI3NzI4LDI4MTAxLDI4NTExLDMwNzA3LDMwODg5LDMzOTkwLDM3MzIzLDM3Njc1LDIwMTg1LDIwNjgyLDIwODA4LDIxODkyLDIzMzA3LDIzNDU5LDI1MTU5LDI1OTgyLDI2MDU5LDI4MjEwLDI5MDUzLDI5Njk3LDI5NzY0LDI5ODMxLDI5ODg3LDMwMzE2LDMxMTQ2LDMyMjE4LDMyMzQxLDMyNjgwLDMzMTQ2LDMzMjAzLDMzMzM3LDM0MzMwLDM0Nzk2LDM1NDQ1LDM2MzIzLDM2OTg0LDM3NTIxLDM3OTI1LDM5MjQ1LDM5ODU0LDIxMzUyLDIzNjMzLDI2OTY0LDI3ODQ0LDI3OTQ1LDI4MjAzLDMzMjkyLDM0MjAzLDM1MTMxLDM1MzczLDM1NDk4LDM4NjM0LDQwODA3LDIxMDg5LDI2Mjk3LDI3NTcwLDMyNDA2LDM0ODE0LDM2MTA5LDM4Mjc1LDM4NDkzLDI1ODg1LDI4MDQxLDI5MTY2LDYzODU0LDIyNDc4LDIyOTk1LDIzNDY4LDI0NjE1LDI0ODI2LDI1MTA0LDI2MTQzLDI2MjA3LDI5NDgxLDI5Njg5LDMwNDI3LDMwNDY1LDMxNTk2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyODU0LDMyODgyLDMzMTI1LDM1NDg4LDM3MjY2LDE5OTkwLDIxMjE4LDI3NTA2LDI3OTI3LDMxMjM3LDMxNTQ1LDMyMDQ4LDYzODU1LDM2MDE2LDIxNDg0LDIyMDYzLDIyNjA5LDIzNDc3LDIzNTY3LDIzNTY5LDI0MDM0LDI1MTUyLDI1NDc1LDI1NjIwLDI2MTU3LDI2ODAzLDI3ODM2LDI4MDQwLDI4MzM1LDI4NzAzLDI4ODM2LDI5MTM4LDI5OTkwLDMwMDk1LDMwMDk0LDMwMjMzLDMxNTA1LDMxNzEyLDMxNzg3LDMyMDMyLDMyMDU3LDM0MDkyLDM0MTU3LDM0MzExLDM1MzgwLDM2ODc3LDM2OTYxLDM3MDQ1LDM3NTU5LDM4OTAyLDM5NDc5LDIwNDM5LDIzNjYwLDI2NDYzLDI4MDQ5LDMxOTAzLDMyMzk2LDM1NjA2LDM2MTE4LDM2ODk1LDIzNDAzLDI0MDYxLDI1NjEzLDMzOTg0LDM2OTU2LDM5MTM3LDI5NTc1LDIzNDM1LDI0NzMwLDI2NDk0LDI4MTI2LDM1MzU5LDM1NDk0LDM2ODY1LDM4OTI0LDIxMDQ3LDYzODU2LDI4NzUzLDMwODYyLDM3NzgyLDM0OTI4LDM3MzM1LDIwNDYyLDIxNDYzLDIyMDEzLDIyMjM0LDIyNDAyLDIyNzgxLDIzMjM0LDIzNDMyLDIzNzIzLDIzNzQ0LDI0MTAxLDI0ODMzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI1MTAxLDI1MTYzLDI1NDgwLDI1NjI4LDI1OTEwLDI1OTc2LDI3MTkzLDI3NTMwLDI3NzAwLDI3OTI5LDI4NDY1LDI5MTU5LDI5NDE3LDI5NTYwLDI5NzAzLDI5ODc0LDMwMjQ2LDMwNTYxLDMxMTY4LDMxMzE5LDMxNDY2LDMxOTI5LDMyMTQzLDMyMTcyLDMyMzUzLDMyNjcwLDMzMDY1LDMzNTg1LDMzOTM2LDM0MDEwLDM0MjgyLDM0OTY2LDM1NTA0LDM1NzI4LDM2NjY0LDM2OTMwLDM2OTk1LDM3MjI4LDM3NTI2LDM3NTYxLDM4NTM5LDM4NTY3LDM4NTY4LDM4NjE0LDM4NjU2LDM4OTIwLDM5MzE4LDM5NjM1LDM5NzA2LDIxNDYwLDIyNjU0LDIyODA5LDIzNDA4LDIzNDg3LDI4MTEzLDI4NTA2LDI5MDg3LDI5NzI5LDI5ODgxLDMyOTAxLDMzNzg5LDI0MDMzLDI0NDU1LDI0NDkwLDI0NjQyLDI2MDkyLDI2NjQyLDI2OTkxLDI3MjE5LDI3NTI5LDI3OTU3LDI4MTQ3LDI5NjY3LDMwNDYyLDMwNjM2LDMxNTY1LDMyMDIwLDMzMDU5LDMzMzA4LDMzNjAwLDM0MDM2LDM0MTQ3LDM1NDI2LDM1NTI0LDM3MjU1LDM3NjYyLDM4OTE4LDM5MzQ4LDI1MTAwLDM0ODk5LDM2ODQ4LDM3NDc3LDIzODE1LDIzODQ3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIzOTEzLDI5NzkxLDMzMTgxLDM0NjY0LDI4NjI5LDI1MzQyLDMyNzIyLDM1MTI2LDM1MTg2LDE5OTk4LDIwMDU2LDIwNzExLDIxMjEzLDIxMzE5LDI1MjE1LDI2MTE5LDMyMzYxLDM0ODIxLDM4NDk0LDIwMzY1LDIxMjczLDIyMDcwLDIyOTg3LDIzMjA0LDIzNjA4LDIzNjMwLDIzNjI5LDI0MDY2LDI0MzM3LDI0NjQzLDI2MDQ1LDI2MTU5LDI2MTc4LDI2NTU4LDI2NjEyLDI5NDY4LDMwNjkwLDMxMDM0LDMyNzA5LDMzOTQwLDMzOTk3LDM1MjIyLDM1NDMwLDM1NDMzLDM1NTUzLDM1OTI1LDM1OTYyLDIyNTE2LDIzNTA4LDI0MzM1LDI0Njg3LDI1MzI1LDI2ODkzLDI3NTQyLDI4MjUyLDI5MDYwLDMxNjk4LDM0NjQ1LDM1NjcyLDM2NjA2LDM5MTM1LDM5MTY2LDIwMjgwLDIwMzUzLDIwNDQ5LDIxNjI3LDIzMDcyLDIzNDgwLDI0ODkyLDI2MDMyLDI2MjE2LDI5MTgwLDMwMDAzLDMxMDcwLDMyMDUxLDMzMTAyLDMzMjUxLDMzNjg4LDM0MjE4LDM0MjU0LDM0NTYzLDM1MzM4LDM2NTIzLDM2NzYzLDYzODU3LDM2ODA1LDIyODMzLDIzNDYwLDIzNTI2LDI0NzEzLDIzNTI5LDIzNTYzLDI0NTE1LDI3Nzc3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzODU4LDI4MTQ1LDI4NjgzLDI5OTc4LDMzNDU1LDM1NTc0LDIwMTYwLDIxMzEzLDYzODU5LDM4NjE3LDI3NjYzLDIwMTI2LDIwNDIwLDIwODE4LDIxODU0LDIzMDc3LDIzNzg0LDI1MTA1LDI5MjczLDMzNDY5LDMzNzA2LDM0NTU4LDM0OTA1LDM1MzU3LDM4NDYzLDM4NTk3LDM5MTg3LDQwMjAxLDQwMjg1LDIyNTM4LDIzNzMxLDIzOTk3LDI0MTMyLDI0ODAxLDI0ODUzLDI1NTY5LDI3MTM4LDI4MTk3LDM3MTIyLDM3NzE2LDM4OTkwLDM5OTUyLDQwODIzLDIzNDMzLDIzNzM2LDI1MzUzLDI2MTkxLDI2Njk2LDMwNTI0LDM4NTkzLDM4Nzk3LDM4OTk2LDM5ODM5LDI2MDE3LDM1NTg1LDM2NTU1LDM4MzMyLDIxODEzLDIzNzIxLDI0MDIyLDI0MjQ1LDI2MjYzLDMwMjg0LDMzNzgwLDM4MzQzLDIyNzM5LDI1Mjc2LDI5MzkwLDQwMjMyLDIwMjA4LDIyODMwLDI0NTkxLDI2MTcxLDI3NTIzLDMxMjA3LDQwMjMwLDIxMzk1LDIxNjk2LDIyNDY3LDIzODMwLDI0ODU5LDI2MzI2LDI4MDc5LDMwODYxLDMzNDA2LDM4NTUyLDM4NzI0LDIxMzgwLDI1MjEyLDI1NDk0LDI4MDgyLDMyMjY2LDMzMDk5LDM4OTg5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI3Mzg3LDMyNTg4LDQwMzY3LDQwNDc0LDIwMDYzLDIwNTM5LDIwOTE4LDIyODEyLDI0ODI1LDI1NTkwLDI2OTI4LDI5MjQyLDMyODIyLDYzODYwLDM3MzI2LDI0MzY5LDYzODYxLDYzODYyLDMyMDA0LDMzNTA5LDMzOTAzLDMzOTc5LDM0Mjc3LDM2NDkzLDYzODYzLDIwMzM1LDYzODY0LDYzODY1LDIyNzU2LDIzMzYzLDI0NjY1LDI1NTYyLDI1ODgwLDI1OTY1LDI2MjY0LDYzODY2LDI2OTU0LDI3MTcxLDI3OTE1LDI4NjczLDI5MDM2LDMwMTYyLDMwMjIxLDMxMTU1LDMxMzQ0LDYzODY3LDMyNjUwLDYzODY4LDM1MTQwLDYzODY5LDM1NzMxLDM3MzEyLDM4NTI1LDYzODcwLDM5MTc4LDIyMjc2LDI0NDgxLDI2MDQ0LDI4NDE3LDMwMjA4LDMxMTQyLDM1NDg2LDM5MzQxLDM5NzcwLDQwODEyLDIwNzQwLDI1MDE0LDI1MjMzLDI3Mjc3LDMzMjIyLDIwNTQ3LDIyNTc2LDI0NDIyLDI4OTM3LDM1MzI4LDM1NTc4LDIzNDIwLDM0MzI2LDIwNDc0LDIwNzk2LDIyMTk2LDIyODUyLDI1NTEzLDI4MTUzLDIzOTc4LDI2OTg5LDIwODcwLDIwMTA0LDIwMzEzLDYzODcxLDYzODcyLDYzODczLDIyOTE0LDYzODc0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzODc1LDI3NDg3LDI3NzQxLDYzODc2LDI5ODc3LDMwOTk4LDYzODc3LDMzMjg3LDMzMzQ5LDMzNTkzLDM2NjcxLDM2NzAxLDYzODc4LDM5MTkyLDYzODc5LDYzODgwLDYzODgxLDIwMTM0LDYzODgyLDIyNDk1LDI0NDQxLDI2MTMxLDYzODgzLDYzODg0LDMwMTIzLDMyMzc3LDM1Njk1LDYzODg1LDM2ODcwLDM5NTE1LDIyMTgxLDIyNTY3LDIzMDMyLDIzMDcxLDIzNDc2LDYzODg2LDI0MzEwLDYzODg3LDYzODg4LDI1NDI0LDI1NDAzLDYzODg5LDI2OTQxLDI3NzgzLDI3ODM5LDI4MDQ2LDI4MDUxLDI4MTQ5LDI4NDM2LDYzODkwLDI4ODk1LDI4OTgyLDI5MDE3LDYzODkxLDI5MTIzLDI5MTQxLDYzODkyLDMwNzk5LDMwODMxLDYzODkzLDMxNjA1LDMyMjI3LDYzODk0LDMyMzAzLDYzODk1LDM0ODkzLDM2NTc1LDYzODk2LDYzODk3LDYzODk4LDM3NDY3LDYzODk5LDQwMTgyLDYzOTAwLDYzOTAxLDYzOTAyLDI0NzA5LDI4MDM3LDYzOTAzLDI5MTA1LDYzOTA0LDYzOTA1LDM4MzIxLDIxNDIxLDYzOTA2LDYzOTA3LDYzOTA4LDI2NTc5LDYzOTA5LDI4ODE0LDI4OTc2LDI5NzQ0LDMzMzk4LDMzNDkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzOTEwLDM4MzMxLDM5NjUzLDQwNTczLDI2MzA4LDYzOTExLDI5MTIxLDMzODY1LDYzOTEyLDYzOTEzLDIyNjAzLDYzOTE0LDYzOTE1LDIzOTkyLDI0NDMzLDYzOTE2LDI2MTQ0LDI2MjU0LDI3MDAxLDI3MDU0LDI3NzA0LDI3ODkxLDI4MjE0LDI4NDgxLDI4NjM0LDI4Njk5LDI4NzE5LDI5MDA4LDI5MTUxLDI5NTUyLDYzOTE3LDI5Nzg3LDYzOTE4LDI5OTA4LDMwNDA4LDMxMzEwLDMyNDAzLDYzOTE5LDYzOTIwLDMzNTIxLDM1NDI0LDM2ODE0LDYzOTIxLDM3NzA0LDYzOTIyLDM4NjgxLDYzOTIzLDYzOTI0LDIwMDM0LDIwNTIyLDYzOTI1LDIxMDAwLDIxNDczLDI2MzU1LDI3NzU3LDI4NjE4LDI5NDUwLDMwNTkxLDMxMzMwLDMzNDU0LDM0MjY5LDM0MzA2LDYzOTI2LDM1MDI4LDM1NDI3LDM1NzA5LDM1OTQ3LDYzOTI3LDM3NTU1LDYzOTI4LDM4Njc1LDM4OTI4LDIwMTE2LDIwMjM3LDIwNDI1LDIwNjU4LDIxMzIwLDIxNTY2LDIxNTU1LDIxOTc4LDIyNjI2LDIyNzE0LDIyODg3LDIzMDY3LDIzNTI0LDI0NzM1LDYzOTI5LDI1MDM0LDI1OTQyLDI2MTExLDI2MjEyLDI2NzkxLDI3NzM4LDI4NTk1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI4ODc5LDI5MTAwLDI5NTIyLDMxNjEzLDM0NTY4LDM1NDkyLDM5OTg2LDQwNzExLDIzNjI3LDI3Nzc5LDI5NTA4LDI5NTc3LDM3NDM0LDI4MzMxLDI5Nzk3LDMwMjM5LDMxMzM3LDMyMjc3LDM0MzE0LDIwODAwLDIyNzI1LDI1NzkzLDI5OTM0LDI5OTczLDMwMzIwLDMyNzA1LDM3MDEzLDM4NjA1LDM5MjUyLDI4MTk4LDI5OTI2LDMxNDAxLDMxNDAyLDMzMjUzLDM0NTIxLDM0NjgwLDM1MzU1LDIzMTEzLDIzNDM2LDIzNDUxLDI2Nzg1LDI2ODgwLDI4MDAzLDI5NjA5LDI5NzE1LDI5NzQwLDMwODcxLDMyMjMzLDMyNzQ3LDMzMDQ4LDMzMTA5LDMzNjk0LDM1OTE2LDM4NDQ2LDM4OTI5LDI2MzUyLDI0NDQ4LDI2MTA2LDI2NTA1LDI3NzU0LDI5NTc5LDIwNTI1LDIzMDQzLDI3NDk4LDMwNzAyLDIyODA2LDIzOTE2LDI0MDEzLDI5NDc3LDMwMDMxLDYzOTMwLDYzOTMxLDIwNzA5LDIwOTg1LDIyNTc1LDIyODI5LDIyOTM0LDIzMDAyLDIzNTI1LDYzOTMyLDYzOTMzLDIzOTcwLDI1MzAzLDI1NjIyLDI1NzQ3LDI1ODU0LDYzOTM0LDI2MzMyLDYzOTM1LDI3MjA4LDYzOTM2LDI5MTgzLDI5Nzk2LDYzOTM3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxMzY4LDMxNDA3LDMyMzI3LDMyMzUwLDMyNzY4LDMzMTM2LDYzOTM4LDM0Nzk5LDM1MjAxLDM1NjE2LDM2OTUzLDYzOTM5LDM2OTkyLDM5MjUwLDI0OTU4LDI3NDQyLDI4MDIwLDMyMjg3LDM1MTA5LDM2Nzg1LDIwNDMzLDIwNjUzLDIwODg3LDIxMTkxLDIyNDcxLDIyNjY1LDIzNDgxLDI0MjQ4LDI0ODk4LDI3MDI5LDI4MDQ0LDI4MjYzLDI4MzQyLDI5MDc2LDI5Nzk0LDI5OTkyLDI5OTk2LDMyODgzLDMzNTkyLDMzOTkzLDM2MzYyLDM3NzgwLDM3ODU0LDYzOTQwLDIwMTEwLDIwMzA1LDIwNTk4LDIwNzc4LDIxNDQ4LDIxNDUxLDIxNDkxLDIzNDMxLDIzNTA3LDIzNTg4LDI0ODU4LDI0OTYyLDI2MTAwLDI5Mjc1LDI5NTkxLDI5NzYwLDMwNDAyLDMxMDU2LDMxMTIxLDMxMTYxLDMyMDA2LDMyNzAxLDMzNDE5LDM0MjYxLDM0Mzk4LDM2ODAyLDM2OTM1LDM3MTA5LDM3MzU0LDM4NTMzLDM4NjMyLDM4NjMzLDIxMjA2LDI0NDIzLDI2MDkzLDI2MTYxLDI2NjcxLDI5MDIwLDMxMjg2LDM3MDU3LDM4OTIyLDIwMTEzLDYzOTQxLDI3MjE4LDI3NTUwLDI4NTYwLDI5MDY1LDMyNzkyLDMzNDY0LDM0MTMxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2OTM5LDM4NTQ5LDM4NjQyLDM4OTA3LDM0MDc0LDM5NzI5LDIwMTEyLDI5MDY2LDM4NTk2LDIwODAzLDIxNDA3LDIxNzI5LDIyMjkxLDIyMjkwLDIyNDM1LDIzMTk1LDIzMjM2LDIzNDkxLDI0NjE2LDI0ODk1LDI1NTg4LDI3NzgxLDI3OTYxLDI4Mjc0LDI4MzA0LDI5MjMyLDI5NTAzLDI5NzgzLDMzNDg5LDM0OTQ1LDM2Njc3LDM2OTYwLDYzOTQyLDM4NDk4LDM5MDAwLDQwMjE5LDI2Mzc2LDM2MjM0LDM3NDcwLDIwMzAxLDIwNTUzLDIwNzAyLDIxMzYxLDIyMjg1LDIyOTk2LDIzMDQxLDIzNTYxLDI0OTQ0LDI2MjU2LDI4MjA1LDI5MjM0LDI5NzcxLDMyMjM5LDMyOTYzLDMzODA2LDMzODk0LDM0MTExLDM0NjU1LDM0OTA3LDM1MDk2LDM1NTg2LDM2OTQ5LDM4ODU5LDM5NzU5LDIwMDgzLDIwMzY5LDIwNzU0LDIwODQyLDYzOTQzLDIxODA3LDIxOTI5LDIzNDE4LDIzNDYxLDI0MTg4LDI0MTg5LDI0MjU0LDI0NzM2LDI0Nzk5LDI0ODQwLDI0ODQxLDI1NTQwLDI1OTEyLDI2Mzc3LDYzOTQ0LDI2NTgwLDI2NTg2LDYzOTQ1LDI2OTc3LDI2OTc4LDI3ODMzLDI3OTQzLDYzOTQ2LDI4MjE2LDYzOTQ3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI4NjQxLDI5NDk0LDI5NDk1LDYzOTQ4LDI5Nzg4LDMwMDAxLDYzOTQ5LDMwMjkwLDYzOTUwLDYzOTUxLDMyMTczLDMzMjc4LDMzODQ4LDM1MDI5LDM1NDgwLDM1NTQ3LDM1NTY1LDM2NDAwLDM2NDE4LDM2OTM4LDM2OTI2LDM2OTg2LDM3MTkzLDM3MzIxLDM3NzQyLDYzOTUyLDYzOTUzLDIyNTM3LDYzOTU0LDI3NjAzLDMyOTA1LDMyOTQ2LDYzOTU1LDYzOTU2LDIwODAxLDIyODkxLDIzNjA5LDYzOTU3LDYzOTU4LDI4NTE2LDI5NjA3LDMyOTk2LDM2MTAzLDYzOTU5LDM3Mzk5LDM4Mjg3LDYzOTYwLDYzOTYxLDYzOTYyLDYzOTYzLDMyODk1LDI1MTAyLDI4NzAwLDMyMTA0LDM0NzAxLDYzOTY0LDIyNDMyLDI0NjgxLDI0OTAzLDI3NTc1LDM1NTE4LDM3NTA0LDM4NTc3LDIwMDU3LDIxNTM1LDI4MTM5LDM0MDkzLDM4NTEyLDM4ODk5LDM5MTUwLDI1NTU4LDI3ODc1LDM3MDA5LDIwOTU3LDI1MDMzLDMzMjEwLDQwNDQxLDIwMzgxLDIwNTA2LDIwNzM2LDIzNDUyLDI0ODQ3LDI1MDg3LDI1ODM2LDI2ODg1LDI3NTg5LDMwMDk3LDMwNjkxLDMyNjgxLDMzMzgwLDM0MTkxLDM0ODExLDM0OTE1LDM1NTE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM1Njk2LDM3MjkxLDIwMTA4LDIwMTk3LDIwMjM0LDYzOTY1LDYzOTY2LDIyODM5LDIzMDE2LDYzOTY3LDI0MDUwLDI0MzQ3LDI0NDExLDI0NjA5LDYzOTY4LDYzOTY5LDYzOTcwLDYzOTcxLDI5MjQ2LDI5NjY5LDYzOTcyLDMwMDY0LDMwMTU3LDYzOTczLDMxMjI3LDYzOTc0LDMyNzgwLDMyODE5LDMyOTAwLDMzNTA1LDMzNjE3LDYzOTc1LDYzOTc2LDM2MDI5LDM2MDE5LDM2OTk5LDYzOTc3LDYzOTc4LDM5MTU2LDM5MTgwLDYzOTc5LDYzOTgwLDI4NzI3LDMwNDEwLDMyNzE0LDMyNzE2LDMyNzY0LDM1NjEwLDIwMTU0LDIwMTYxLDIwOTk1LDIxMzYwLDYzOTgxLDIxNjkzLDIyMjQwLDIzMDM1LDIzNDkzLDI0MzQxLDI0NTI1LDI4MjcwLDYzOTgyLDYzOTgzLDMyMTA2LDMzNTg5LDYzOTg0LDM0NDUxLDM1NDY5LDYzOTg1LDM4NzY1LDM4Nzc1LDYzOTg2LDYzOTg3LDE5OTY4LDIwMzE0LDIwMzUwLDIyNzc3LDI2MDg1LDI4MzIyLDM2OTIwLDM3ODA4LDM5MzUzLDIwMjE5LDIyNzY0LDIyOTIyLDIzMDAxLDI0NjQxLDYzOTg4LDYzOTg5LDMxMjUyLDYzOTkwLDMzNjE1LDM2MDM1LDIwODM3LDIxMzE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzOTkxLDYzOTkyLDYzOTkzLDIwMTczLDIxMDk3LDIzMzgxLDMzNDcxLDIwMTgwLDIxMDUwLDIxNjcyLDIyOTg1LDIzMDM5LDIzMzc2LDIzMzgzLDIzMzg4LDI0Njc1LDI0OTA0LDI4MzYzLDI4ODI1LDI5MDM4LDI5NTc0LDI5OTQzLDMwMTMzLDMwOTEzLDMyMDQzLDMyNzczLDMzMjU4LDMzNTc2LDM0MDcxLDM0MjQ5LDM1NTY2LDM2MDM5LDM4NjA0LDIwMzE2LDIxMjQyLDIyMjA0LDI2MDI3LDI2MTUyLDI4Nzk2LDI4ODU2LDI5MjM3LDMyMTg5LDMzNDIxLDM3MTk2LDM4NTkyLDQwMzA2LDIzNDA5LDI2ODU1LDI3NTQ0LDI4NTM4LDMwNDMwLDIzNjk3LDI2MjgzLDI4NTA3LDMxNjY4LDMxNzg2LDM0ODcwLDM4NjIwLDE5OTc2LDIwMTgzLDIxMjgwLDIyNTgwLDIyNzE1LDIyNzY3LDIyODkyLDIzNTU5LDI0MTE1LDI0MTk2LDI0MzczLDI1NDg0LDI2MjkwLDI2NDU0LDI3MTY3LDI3Mjk5LDI3NDA0LDI4NDc5LDI5MjU0LDYzOTk0LDI5NTIwLDI5ODM1LDMxNDU2LDMxOTExLDMzMTQ0LDMzMjQ3LDMzMjU1LDMzNjc0LDMzOTAwLDM0MDgzLDM0MTk2LDM0MjU1LDM1MDM3LDM2MTE1LDM3MjkyLDM4MjYzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM4NTU2LDIwODc3LDIxNzA1LDIyMzEyLDIzNDcyLDI1MTY1LDI2NDQ4LDI2Njg1LDI2NzcxLDI4MjIxLDI4MzcxLDI4Nzk3LDMyMjg5LDM1MDA5LDM2MDAxLDM2NjE3LDQwNzc5LDQwNzgyLDI5MjI5LDMxNjMxLDM1NTMzLDM3NjU4LDIwMjk1LDIwMzAyLDIwNzg2LDIxNjMyLDIyOTkyLDI0MjEzLDI1MjY5LDI2NDg1LDI2OTkwLDI3MTU5LDI3ODIyLDI4MTg2LDI5NDAxLDI5NDgyLDMwMTQxLDMxNjcyLDMyMDUzLDMzNTExLDMzNzg1LDMzODc5LDM0Mjk1LDM1NDE5LDM2MDE1LDM2NDg3LDM2ODg5LDM3MDQ4LDM4NjA2LDQwNzk5LDIxMjE5LDIxNTE0LDIzMjY1LDIzNDkwLDI1Njg4LDI1OTczLDI4NDA0LDI5MzgwLDYzOTk1LDMwMzQwLDMxMzA5LDMxNTE1LDMxODIxLDMyMzE4LDMyNzM1LDMzNjU5LDM1NjI3LDM2MDQyLDM2MTk2LDM2MzIxLDM2NDQ3LDM2ODQyLDM2ODU3LDM2OTY5LDM3ODQxLDIwMjkxLDIwMzQ2LDIwNjU5LDIwODQwLDIwODU2LDIxMDY5LDIxMDk4LDIyNjI1LDIyNjUyLDIyODgwLDIzNTYwLDIzNjM3LDI0MjgzLDI0NzMxLDI1MTM2LDI2NjQzLDI3NTgzLDI3NjU2LDI4NTkzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI5MDA2LDI5NzI4LDMwMDAwLDMwMDA4LDMwMDMzLDMwMzIyLDMxNTY0LDMxNjI3LDMxNjYxLDMxNjg2LDMyMzk5LDM1NDM4LDM2NjcwLDM2NjgxLDM3NDM5LDM3NTIzLDM3NjY2LDM3OTMxLDM4NjUxLDM5MDAyLDM5MDE5LDM5MTk4LDIwOTk5LDI1MTMwLDI1MjQwLDI3OTkzLDMwMzA4LDMxNDM0LDMxNjgwLDMyMTE4LDIxMzQ0LDIzNzQyLDI0MjE1LDI4NDcyLDI4ODU3LDMxODk2LDM4NjczLDM5ODIyLDQwNjcwLDI1NTA5LDI1NzIyLDM0Njc4LDE5OTY5LDIwMTE3LDIwMTQxLDIwNTcyLDIwNTk3LDIxNTc2LDIyOTc5LDIzNDUwLDI0MTI4LDI0MjM3LDI0MzExLDI0NDQ5LDI0NzczLDI1NDAyLDI1OTE5LDI1OTcyLDI2MDYwLDI2MjMwLDI2MjMyLDI2NjIyLDI2OTg0LDI3MjczLDI3NDkxLDI3NzEyLDI4MDk2LDI4MTM2LDI4MTkxLDI4MjU0LDI4NzAyLDI4ODMzLDI5NTgyLDI5NjkzLDMwMDEwLDMwNTU1LDMwODU1LDMxMTE4LDMxMjQzLDMxMzU3LDMxOTM0LDMyMTQyLDMzMzUxLDM1MzMwLDM1NTYyLDM1OTk4LDM3MTY1LDM3MTk0LDM3MzM2LDM3NDc4LDM3NTgwLDM3NjY0LDM4NjYyLDM4NzQyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM4NzQ4LDM4OTE0LDQwNzE4LDIxMDQ2LDIxMTM3LDIxODg0LDIyNTY0LDI0MDkzLDI0MzUxLDI0NzE2LDI1NTUyLDI2Nzk5LDI4NjM5LDMxMDg1LDMxNTMyLDMzMjI5LDM0MjM0LDM1MDY5LDM1NTc2LDM2NDIwLDM3MjYxLDM4NTAwLDM4NTU1LDM4NzE3LDM4OTg4LDQwNzc4LDIwNDMwLDIwODA2LDIwOTM5LDIxMTYxLDIyMDY2LDI0MzQwLDI0NDI3LDI1NTE0LDI1ODA1LDI2MDg5LDI2MTc3LDI2MzYyLDI2MzYxLDI2Mzk3LDI2NzgxLDI2ODM5LDI3MTMzLDI4NDM3LDI4NTI2LDI5MDMxLDI5MTU3LDI5MjI2LDI5ODY2LDMwNTIyLDMxMDYyLDMxMDY2LDMxMTk5LDMxMjY0LDMxMzgxLDMxODk1LDMxOTY3LDMyMDY4LDMyMzY4LDMyOTAzLDM0Mjk5LDM0NDY4LDM1NDEyLDM1NTE5LDM2MjQ5LDM2NDgxLDM2ODk2LDM2OTczLDM3MzQ3LDM4NDU5LDM4NjEzLDQwMTY1LDI2MDYzLDMxNzUxLDM2Mjc1LDM3ODI3LDIzMzg0LDIzNTYyLDIxMzMwLDI1MzA1LDI5NDY5LDIwNTE5LDIzNDQ3LDI0NDc4LDI0NzUyLDI0OTM5LDI2ODM3LDI4MTIxLDI5NzQyLDMxMjc4LDMyMDY2LDMyMTU2LDMyMzA1LDMzMTMxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2Mzk0LDM2NDA1LDM3NzU4LDM3OTEyLDIwMzA0LDIyMzUyLDI0MDM4LDI0MjMxLDI1Mzg3LDMyNjE4LDIwMDI3LDIwMzAzLDIwMzY3LDIwNTcwLDIzMDA1LDMyOTY0LDIxNjEwLDIxNjA4LDIyMDE0LDIyODYzLDIzNDQ5LDI0MDMwLDI0MjgyLDI2MjA1LDI2NDE3LDI2NjA5LDI2NjY2LDI3ODgwLDI3OTU0LDI4MjM0LDI4NTU3LDI4ODU1LDI5NjY0LDMwMDg3LDMxODIwLDMyMDAyLDMyMDQ0LDMyMTYyLDMzMzExLDM0NTIzLDM1Mzg3LDM1NDYxLDM2MjA4LDM2NDkwLDM2NjU5LDM2OTEzLDM3MTk4LDM3MjAyLDM3OTU2LDM5Mzc2LDMxNDgxLDMxOTA5LDIwNDI2LDIwNzM3LDIwOTM0LDIyNDcyLDIzNTM1LDIzODAzLDI2MjAxLDI3MTk3LDI3OTk0LDI4MzEwLDI4NjUyLDI4OTQwLDMwMDYzLDMxNDU5LDM0ODUwLDM2ODk3LDM2OTgxLDM4NjAzLDM5NDIzLDMzNTM3LDIwMDEzLDIwMjEwLDM0ODg2LDM3MzI1LDIxMzczLDI3MzU1LDI2OTg3LDI3NzEzLDMzOTE0LDIyNjg2LDI0OTc0LDI2MzY2LDI1MzI3LDI4ODkzLDI5OTY5LDMwMTUxLDMyMzM4LDMzOTc2LDM1NjU3LDM2MTA0LDIwMDQzLDIxNDgyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxNjc1LDIyMzIwLDIyMzM2LDI0NTM1LDI1MzQ1LDI1MzUxLDI1NzExLDI1OTAzLDI2MDg4LDI2MjM0LDI2NTI1LDI2NTQ3LDI3NDkwLDI3NzQ0LDI3ODAyLDI4NDYwLDMwNjkzLDMwNzU3LDMxMDQ5LDMxMDYzLDMyMDI1LDMyOTMwLDMzMDI2LDMzMjY3LDMzNDM3LDMzNDYzLDM0NTg0LDM1NDY4LDYzOTk2LDM2MTAwLDM2Mjg2LDM2OTc4LDMwNDUyLDMxMjU3LDMxMjg3LDMyMzQwLDMyODg3LDIxNzY3LDIxOTcyLDIyNjQ1LDI1MzkxLDI1NjM0LDI2MTg1LDI2MTg3LDI2NzMzLDI3MDM1LDI3NTI0LDI3OTQxLDI4MzM3LDI5NjQ1LDI5ODAwLDI5ODU3LDMwMDQzLDMwMTM3LDMwNDMzLDMwNDk0LDMwNjAzLDMxMjA2LDMyMjY1LDMyMjg1LDMzMjc1LDM0MDk1LDM0OTY3LDM1Mzg2LDM2MDQ5LDM2NTg3LDM2Nzg0LDM2OTE0LDM3ODA1LDM4NDk5LDM4NTE1LDM4NjYzLDIwMzU2LDIxNDg5LDIzMDE4LDIzMjQxLDI0MDg5LDI2NzAyLDI5ODk0LDMwMTQyLDMxMjA5LDMxMzc4LDMzMTg3LDM0NTQxLDM2MDc0LDM2MzAwLDM2ODQ1LDI2MDE1LDI2Mzg5LDYzOTk3LDIyNTE5LDI4NTAzLDMyMjIxLDM2NjU1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM3ODc4LDM4NTk4LDI0NTAxLDI1MDc0LDI4NTQ4LDE5OTg4LDIwMzc2LDIwNTExLDIxNDQ5LDIxOTgzLDIzOTE5LDI0MDQ2LDI3NDI1LDI3NDkyLDMwOTIzLDMxNjQyLDYzOTk4LDM2NDI1LDM2NTU0LDM2OTc0LDI1NDE3LDI1NjYyLDMwNTI4LDMxMzY0LDM3Njc5LDM4MDE1LDQwODEwLDI1Nzc2LDI4NTkxLDI5MTU4LDI5ODY0LDI5OTE0LDMxNDI4LDMxNzYyLDMyMzg2LDMxOTIyLDMyNDA4LDM1NzM4LDM2MTA2LDM4MDEzLDM5MTg0LDM5MjQ0LDIxMDQ5LDIzNTE5LDI1ODMwLDI2NDEzLDMyMDQ2LDIwNzE3LDIxNDQzLDIyNjQ5LDI0OTIwLDI0OTIxLDI1MDgyLDI2MDI4LDMxNDQ5LDM1NzMwLDM1NzM0LDIwNDg5LDIwNTEzLDIxMTA5LDIxODA5LDIzMTAwLDI0Mjg4LDI0NDMyLDI0ODg0LDI1OTUwLDI2MTI0LDI2MTY2LDI2Mjc0LDI3MDg1LDI4MzU2LDI4NDY2LDI5NDYyLDMwMjQxLDMxMzc5LDMzMDgxLDMzMzY5LDMzNzUwLDMzOTgwLDIwNjYxLDIyNTEyLDIzNDg4LDIzNTI4LDI0NDI1LDI1NTA1LDMwNzU4LDMyMTgxLDMzNzU2LDM0MDgxLDM3MzE5LDM3MzY1LDIwODc0LDI2NjEzLDMxNTc0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2MDEyLDIwOTMyLDIyOTcxLDI0NzY1LDM0Mzg5LDIwNTA4LDYzOTk5LDIxMDc2LDIzNjEwLDI0OTU3LDI1MTE0LDI1Mjk5LDI1ODQyLDI2MDIxLDI4MzY0LDMwMjQwLDMzMDM0LDM2NDQ4LDM4NDk1LDM4NTg3LDIwMTkxLDIxMzE1LDIxOTEyLDIyODI1LDI0MDI5LDI1Nzk3LDI3ODQ5LDI4MTU0LDI5NTg4LDMxMzU5LDMzMzA3LDM0MjE0LDM2MDY4LDM2MzY4LDM2OTgzLDM3MzUxLDM4MzY5LDM4NDMzLDM4ODU0LDIwOTg0LDIxNzQ2LDIxODk0LDI0NTA1LDI1NzY0LDI4NTUyLDMyMTgwLDM2NjM5LDM2Njg1LDM3OTQxLDIwNjgxLDIzNTc0LDI3ODM4LDI4MTU1LDI5OTc5LDMwNjUxLDMxODA1LDMxODQ0LDM1NDQ5LDM1NTIyLDIyNTU4LDIyOTc0LDI0MDg2LDI1NDYzLDI5MjY2LDMwMDkwLDMwNTcxLDM1NTQ4LDM2MDI4LDM2NjI2LDI0MzA3LDI2MjI4LDI4MTUyLDMyODkzLDMzNzI5LDM1NTMxLDM4NzM3LDM5ODk0LDY0MDAwLDIxMDU5LDI2MzY3LDI4MDUzLDI4Mzk5LDMyMjI0LDM1NTU4LDM2OTEwLDM2OTU4LDM5NjM2LDIxMDIxLDIxMTE5LDIxNzM2LDI0OTgwLDI1MjIwLDI1MzA3LDI2Nzg2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2ODk4LDI2OTcwLDI3MTg5LDI4ODE4LDI4OTY2LDMwODEzLDMwOTc3LDMwOTkwLDMxMTg2LDMxMjQ1LDMyOTE4LDMzNDAwLDMzNDkzLDMzNjA5LDM0MTIxLDM1OTcwLDM2MjI5LDM3MjE4LDM3MjU5LDM3Mjk0LDIwNDE5LDIyMjI1LDI5MTY1LDMwNjc5LDM0NTYwLDM1MzIwLDIzNTQ0LDI0NTM0LDI2NDQ5LDM3MDMyLDIxNDc0LDIyNjE4LDIzNTQxLDI0NzQwLDI0OTYxLDI1Njk2LDMyMzE3LDMyODgwLDM0MDg1LDM3NTA3LDI1Nzc0LDIwNjUyLDIzODI4LDI2MzY4LDIyNjg0LDI1Mjc3LDI1NTEyLDI2ODk0LDI3MDAwLDI3MTY2LDI4MjY3LDMwMzk0LDMxMTc5LDMzNDY3LDMzODMzLDM1NTM1LDM2MjY0LDM2ODYxLDM3MTM4LDM3MTk1LDM3Mjc2LDM3NjQ4LDM3NjU2LDM3Nzg2LDM4NjE5LDM5NDc4LDM5OTQ5LDE5OTg1LDMwMDQ0LDMxMDY5LDMxNDgyLDMxNTY5LDMxNjg5LDMyMzAyLDMzOTg4LDM2NDQxLDM2NDY4LDM2NjAwLDM2ODgwLDI2MTQ5LDI2OTQzLDI5NzYzLDIwOTg2LDI2NDE0LDQwNjY4LDIwODA1LDI0NTQ0LDI3Nzk4LDM0ODAyLDM0OTA5LDM0OTM1LDI0NzU2LDMzMjA1LDMzNzk1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2MTAxLDIxNDYyLDIxNTYxLDIyMDY4LDIzMDk0LDIzNjAxLDI4ODEwLDMyNzM2LDMyODU4LDMzMDMwLDMzMjYxLDM2MjU5LDM3MjU3LDM5NTE5LDQwNDM0LDIwNTk2LDIwMTY0LDIxNDA4LDI0ODI3LDI4MjA0LDIzNjUyLDIwMzYwLDIwNTE2LDIxOTg4LDIzNzY5LDI0MTU5LDI0Njc3LDI2NzcyLDI3ODM1LDI4MTAwLDI5MTE4LDMwMTY0LDMwMTk2LDMwMzA1LDMxMjU4LDMxMzA1LDMyMTk5LDMyMjUxLDMyNjIyLDMzMjY4LDM0NDczLDM2NjM2LDM4NjAxLDM5MzQ3LDQwNzg2LDIxMDYzLDIxMTg5LDM5MTQ5LDM1MjQyLDE5OTcxLDI2NTc4LDI4NDIyLDIwNDA1LDIzNTIyLDI2NTE3LDI3Nzg0LDI4MDI0LDI5NzIzLDMwNzU5LDM3MzQxLDM3NzU2LDM0NzU2LDMxMjA0LDMxMjgxLDI0NTU1LDIwMTgyLDIxNjY4LDIxODIyLDIyNzAyLDIyOTQ5LDI0ODE2LDI1MTcxLDI1MzAyLDI2NDIyLDI2OTY1LDMzMzMzLDM4NDY0LDM5MzQ1LDM5Mzg5LDIwNTI0LDIxMzMxLDIxODI4LDIyMzk2LDY0MDAxLDI1MTc2LDY0MDAyLDI1ODI2LDI2MjE5LDI2NTg5LDI4NjA5LDI4NjU1LDI5NzMwLDI5NzUyLDM1MzUxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM3OTQ0LDIxNTg1LDIyMDIyLDIyMzc0LDI0MzkyLDI0OTg2LDI3NDcwLDI4NzYwLDI4ODQ1LDMyMTg3LDM1NDc3LDIyODkwLDMzMDY3LDI1NTA2LDMwNDcyLDMyODI5LDM2MDEwLDIyNjEyLDI1NjQ1LDI3MDY3LDIzNDQ1LDI0MDgxLDI4MjcxLDY0MDAzLDM0MTUzLDIwODEyLDIxNDg4LDIyODI2LDI0NjA4LDI0OTA3LDI3NTI2LDI3NzYwLDI3ODg4LDMxNTE4LDMyOTc0LDMzNDkyLDM2Mjk0LDM3MDQwLDM5MDg5LDY0MDA0LDI1Nzk5LDI4NTgwLDI1NzQ1LDI1ODYwLDIwODE0LDIxNTIwLDIyMzAzLDM1MzQyLDI0OTI3LDI2NzQyLDY0MDA1LDMwMTcxLDMxNTcwLDMyMTEzLDM2ODkwLDIyNTM0LDI3MDg0LDMzMTUxLDM1MTE0LDM2ODY0LDM4OTY5LDIwNjAwLDIyODcxLDIyOTU2LDI1MjM3LDM2ODc5LDM5NzIyLDI0OTI1LDI5MzA1LDM4MzU4LDIyMzY5LDIzMTEwLDI0MDUyLDI1MjI2LDI1NzczLDI1ODUwLDI2NDg3LDI3ODc0LDI3OTY2LDI5MjI4LDI5NzUwLDMwNzcyLDMyNjMxLDMzNDUzLDM2MzE1LDM4OTM1LDIxMDI4LDIyMzM4LDI2NDk1LDI5MjU2LDI5OTIzLDM2MDA5LDM2Nzc0LDM3MzkzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM4NDQyLDIwODQzLDIxNDg1LDI1NDIwLDIwMzI5LDIxNzY0LDI0NzI2LDI1OTQzLDI3ODAzLDI4MDMxLDI5MjYwLDI5NDM3LDMxMjU1LDM1MjA3LDM1OTk3LDI0NDI5LDI4NTU4LDI4OTIxLDMzMTkyLDI0ODQ2LDIwNDE1LDIwNTU5LDI1MTUzLDI5MjU1LDMxNjg3LDMyMjMyLDMyNzQ1LDM2OTQxLDM4ODI5LDM5NDQ5LDM2MDIyLDIyMzc4LDI0MTc5LDI2NTQ0LDMzODA1LDM1NDEzLDIxNTM2LDIzMzE4LDI0MTYzLDI0MjkwLDI0MzMwLDI1OTg3LDMyOTU0LDM0MTA5LDM4MjgxLDM4NDkxLDIwMjk2LDIxMjUzLDIxMjYxLDIxMjYzLDIxNjM4LDIxNzU0LDIyMjc1LDI0MDY3LDI0NTk4LDI1MjQzLDI1MjY1LDI1NDI5LDY0MDA2LDI3ODczLDI4MDA2LDMwMTI5LDMwNzcwLDMyOTkwLDMzMDcxLDMzNTAyLDMzODg5LDMzOTcwLDM0OTU3LDM1MDkwLDM2ODc1LDM3NjEwLDM5MTY1LDM5ODI1LDI0MTMzLDI2MjkyLDI2MzMzLDI4Njg5LDI5MTkwLDY0MDA3LDIwNDY5LDIxMTE3LDI0NDI2LDI0OTE1LDI2NDUxLDI3MTYxLDI4NDE4LDI5OTIyLDMxMDgwLDM0OTIwLDM1OTYxLDM5MTExLDM5MTA4LDM5NDkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxNjk3LDMxMjYzLDI2OTYzLDM1NTc1LDM1OTE0LDM5MDgwLDM5MzQyLDI0NDQ0LDI1MjU5LDMwMTMwLDMwMzgyLDM0OTg3LDM2OTkxLDM4NDY2LDIxMzA1LDI0MzgwLDI0NTE3LDI3ODUyLDI5NjQ0LDMwMDUwLDMwMDkxLDMxNTU4LDMzNTM0LDM5MzI1LDIwMDQ3LDM2OTI0LDE5OTc5LDIwMzA5LDIxNDE0LDIyNzk5LDI0MjY0LDI2MTYwLDI3ODI3LDI5NzgxLDMzNjU1LDM0NjYyLDM2MDMyLDM2OTQ0LDM4Njg2LDM5OTU3LDIyNzM3LDIzNDE2LDM0Mzg0LDM1NjA0LDQwMzcyLDIzNTA2LDI0NjgwLDI0NzE3LDI2MDk3LDI3NzM1LDI4NDUwLDI4NTc5LDI4Njk4LDMyNTk3LDMyNzUyLDM4Mjg5LDM4MjkwLDM4NDgwLDM4ODY3LDIxMTA2LDM2Njc2LDIwOTg5LDIxNTQ3LDIxNjg4LDIxODU5LDIxODk4LDI3MzIzLDI4MDg1LDMyMjE2LDMzMzgyLDM3NTMyLDM4NTE5LDQwNTY5LDIxNTEyLDIxNzA0LDMwNDE4LDM0NTMyLDM4MzA4LDM4MzU2LDM4NDkyLDIwMTMwLDIwMjMzLDIzMDIyLDIzMjcwLDI0MDU1LDI0NjU4LDI1MjM5LDI2NDc3LDI2Njg5LDI3NzgyLDI4MjA3LDMyNTY4LDMyOTIzLDMzMzIyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDY0MDA4LDY0MDA5LDM4OTE3LDIwMTMzLDIwNTY1LDIxNjgzLDIyNDE5LDIyODc0LDIzNDAxLDIzNDc1LDI1MDMyLDI2OTk5LDI4MDIzLDI4NzA3LDM0ODA5LDM1Mjk5LDM1NDQyLDM1NTU5LDM2OTk0LDM5NDA1LDM5NjA4LDIxMTgyLDI2NjgwLDIwNTAyLDI0MTg0LDI2NDQ3LDMzNjA3LDM0ODkyLDIwMTM5LDIxNTIxLDIyMTkwLDI5NjcwLDM3MTQxLDM4OTExLDM5MTc3LDM5MjU1LDM5MzIxLDIyMDk5LDIyNjg3LDM0Mzk1LDM1Mzc3LDI1MDEwLDI3MzgyLDI5NTYzLDM2NTYyLDI3NDYzLDM4NTcwLDM5NTExLDIyODY5LDI5MTg0LDM2MjAzLDM4NzYxLDIwNDM2LDIzNzk2LDI0MzU4LDI1MDgwLDI2MjAzLDI3ODgzLDI4ODQzLDI5NTcyLDI5NjI1LDI5Njk0LDMwNTA1LDMwNTQxLDMyMDY3LDMyMDk4LDMyMjkxLDMzMzM1LDM0ODk4LDY0MDEwLDM2MDY2LDM3NDQ5LDM5MDIzLDIzMzc3LDMxMzQ4LDM0ODgwLDM4OTEzLDIzMjQ0LDIwNDQ4LDIxMzMyLDIyODQ2LDIzODA1LDI1NDA2LDI4MDI1LDI5NDMzLDMzMDI5LDMzMDMxLDMzNjk4LDM3NTgzLDM4OTYwLDIwMTM2LDIwODA0LDIxMDA5LDIyNDExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI0NDE4LDI3ODQyLDI4MzY2LDI4Njc3LDI4NzUyLDI4ODQ3LDI5MDc0LDI5NjczLDI5ODAxLDMzNjEwLDM0NzIyLDM0OTEzLDM2ODcyLDM3MDI2LDM3Nzk1LDM5MzM2LDIwODQ2LDI0NDA3LDI0ODAwLDI0OTM1LDI2MjkxLDM0MTM3LDM2NDI2LDM3Mjk1LDM4Nzk1LDIwMDQ2LDIwMTE0LDIxNjI4LDIyNzQxLDIyNzc4LDIyOTA5LDIzNzMzLDI0MzU5LDI1MTQyLDI1MTYwLDI2MTIyLDI2MjE1LDI3NjI3LDI4MDA5LDI4MTExLDI4MjQ2LDI4NDA4LDI4NTY0LDI4NjQwLDI4NjQ5LDI4NzY1LDI5MzkyLDI5NzMzLDI5Nzg2LDI5OTIwLDMwMzU1LDMxMDY4LDMxOTQ2LDMyMjg2LDMyOTkzLDMzNDQ2LDMzODk5LDMzOTgzLDM0MzgyLDM0Mzk5LDM0Njc2LDM1NzAzLDM1OTQ2LDM3ODA0LDM4OTEyLDM5MDEzLDI0Nzg1LDI1MTEwLDM3MjM5LDIzMTMwLDI2MTI3LDI4MTUxLDI4MjIyLDI5NzU5LDM5NzQ2LDI0NTczLDI0Nzk0LDMxNTAzLDIxNzAwLDI0MzQ0LDI3NzQyLDI3ODU5LDI3OTQ2LDI4ODg4LDMyMDA1LDM0NDI1LDM1MzQwLDQwMjUxLDIxMjcwLDIxNjQ0LDIzMzAxLDI3MTk0LDI4Nzc5LDMwMDY5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxMTE3LDMxMTY2LDMzNDU3LDMzNzc1LDM1NDQxLDM1NjQ5LDM2MDA4LDM4NzcyLDY0MDExLDI1ODQ0LDI1ODk5LDMwOTA2LDMwOTA3LDMxMzM5LDIwMDI0LDIxOTE0LDIyODY0LDIzNDYyLDI0MTg3LDI0NzM5LDI1NTYzLDI3NDg5LDI2MjEzLDI2NzA3LDI4MTg1LDI5MDI5LDI5ODcyLDMyMDA4LDM2OTk2LDM5NTI5LDM5OTczLDI3OTYzLDI4MzY5LDI5NTAyLDM1OTA1LDM4MzQ2LDIwOTc2LDI0MTQwLDI0NDg4LDI0NjUzLDI0ODIyLDI0ODgwLDI0OTA4LDI2MTc5LDI2MTgwLDI3MDQ1LDI3ODQxLDI4MjU1LDI4MzYxLDI4NTE0LDI5MDA0LDI5ODUyLDMwMzQzLDMxNjgxLDMxNzgzLDMzNjE4LDM0NjQ3LDM2OTQ1LDM4NTQxLDQwNjQzLDIxMjk1LDIyMjM4LDI0MzE1LDI0NDU4LDI0Njc0LDI0NzI0LDI1MDc5LDI2MjE0LDI2MzcxLDI3MjkyLDI4MTQyLDI4NTkwLDI4Nzg0LDI5NTQ2LDMyMzYyLDMzMjE0LDMzNTg4LDM0NTE2LDM1NDk2LDM2MDM2LDIxMTIzLDI5NTU0LDIzNDQ2LDI3MjQzLDM3ODkyLDIxNzQyLDIyMTUwLDIzMzg5LDI1OTI4LDI1OTg5LDI2MzEzLDI2NzgzLDI4MDQ1LDI4MTAyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI5MjQzLDMyOTQ4LDM3MjM3LDM5NTAxLDIwMzk5LDIwNTA1LDIxNDAyLDIxNTE4LDIxNTY0LDIxODk3LDIxOTU3LDI0MTI3LDI0NDYwLDI2NDI5LDI5MDMwLDI5NjYxLDM2ODY5LDIxMjExLDIxMjM1LDIyNjI4LDIyNzM0LDI4OTMyLDI5MDcxLDI5MTc5LDM0MjI0LDM1MzQ3LDI2MjQ4LDM0MjE2LDIxOTI3LDI2MjQ0LDI5MDAyLDMzODQxLDIxMzIxLDIxOTEzLDI3NTg1LDI0NDA5LDI0NTA5LDI1NTgyLDI2MjQ5LDI4OTk5LDM1NTY5LDM2NjM3LDQwNjM4LDIwMjQxLDI1NjU4LDI4ODc1LDMwMDU0LDM0NDA3LDI0Njc2LDM1NjYyLDQwNDQwLDIwODA3LDIwOTgyLDIxMjU2LDI3OTU4LDMzMDE2LDQwNjU3LDI2MTMzLDI3NDI3LDI4ODI0LDMwMTY1LDIxNTA3LDIzNjczLDMyMDA3LDM1MzUwLDI3NDI0LDI3NDUzLDI3NDYyLDIxNTYwLDI0Njg4LDI3OTY1LDMyNzI1LDMzMjg4LDIwNjk0LDIwOTU4LDIxOTE2LDIyMTIzLDIyMjIxLDIzMDIwLDIzMzA1LDI0MDc2LDI0OTg1LDI0OTg0LDI1MTM3LDI2MjA2LDI2MzQyLDI5MDgxLDI5MTEzLDI5MTE0LDI5MzUxLDMxMTQzLDMxMjMyLDMyNjkwLDM1NDQwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFxuICBcImdiMTgwMzBcIjpbMTk5NzAsMTk5NzIsMTk5NzMsMTk5NzQsMTk5ODMsMTk5ODYsMTk5OTEsMTk5OTksMjAwMDAsMjAwMDEsMjAwMDMsMjAwMDYsMjAwMDksMjAwMTQsMjAwMTUsMjAwMTcsMjAwMTksMjAwMjEsMjAwMjMsMjAwMjgsMjAwMzIsMjAwMzMsMjAwMzQsMjAwMzYsMjAwMzgsMjAwNDIsMjAwNDksMjAwNTMsMjAwNTUsMjAwNTgsMjAwNTksMjAwNjYsMjAwNjcsMjAwNjgsMjAwNjksMjAwNzEsMjAwNzIsMjAwNzQsMjAwNzUsMjAwNzYsMjAwNzcsMjAwNzgsMjAwNzksMjAwODIsMjAwODQsMjAwODUsMjAwODYsMjAwODcsMjAwODgsMjAwODksMjAwOTAsMjAwOTEsMjAwOTIsMjAwOTMsMjAwOTUsMjAwOTYsMjAwOTcsMjAwOTgsMjAwOTksMjAxMDAsMjAxMDEsMjAxMDMsMjAxMDYsMjAxMTIsMjAxMTgsMjAxMTksMjAxMjEsMjAxMjQsMjAxMjUsMjAxMjYsMjAxMzEsMjAxMzgsMjAxNDMsMjAxNDQsMjAxNDUsMjAxNDgsMjAxNTAsMjAxNTEsMjAxNTIsMjAxNTMsMjAxNTYsMjAxNTcsMjAxNTgsMjAxNjgsMjAxNzIsMjAxNzUsMjAxNzYsMjAxNzgsMjAxODYsMjAxODcsMjAxODgsMjAxOTIsMjAxOTQsMjAxOTgsMjAxOTksMjAyMDEsMjAyMDUsMjAyMDYsMjAyMDcsMjAyMDksMjAyMTIsMjAyMTYsMjAyMTcsMjAyMTgsMjAyMjAsMjAyMjIsMjAyMjQsMjAyMjYsMjAyMjcsMjAyMjgsMjAyMjksMjAyMzAsMjAyMzEsMjAyMzIsMjAyMzUsMjAyMzYsMjAyNDIsMjAyNDMsMjAyNDQsMjAyNDUsMjAyNDYsMjAyNTIsMjAyNTMsMjAyNTcsMjAyNTksMjAyNjQsMjAyNjUsMjAyNjgsMjAyNjksMjAyNzAsMjAyNzMsMjAyNzUsMjAyNzcsMjAyNzksMjAyODEsMjAyODMsMjAyODYsMjAyODcsMjAyODgsMjAyODksMjAyOTAsMjAyOTIsMjAyOTMsMjAyOTUsMjAyOTYsMjAyOTcsMjAyOTgsMjAyOTksMjAzMDAsMjAzMDYsMjAzMDgsMjAzMTAsMjAzMjEsMjAzMjIsMjAzMjYsMjAzMjgsMjAzMzAsMjAzMzEsMjAzMzMsMjAzMzQsMjAzMzcsMjAzMzgsMjAzNDEsMjAzNDMsMjAzNDQsMjAzNDUsMjAzNDYsMjAzNDksMjAzNTIsMjAzNTMsMjAzNTQsMjAzNTcsMjAzNTgsMjAzNTksMjAzNjIsMjAzNjQsMjAzNjYsMjAzNjgsMjAzNzAsMjAzNzEsMjAzNzMsMjAzNzQsMjAzNzYsMjAzNzcsMjAzNzgsMjAzODAsMjAzODIsMjAzODMsMjAzODUsMjAzODYsMjAzODgsMjAzOTUsMjAzOTcsMjA0MDAsMjA0MDEsMjA0MDIsMjA0MDMsMjA0MDQsMjA0MDYsMjA0MDcsMjA0MDgsMjA0MDksMjA0MTAsMjA0MTEsMjA0MTIsMjA0MTMsMjA0MTQsMjA0MTYsMjA0MTcsMjA0MTgsMjA0MjIsMjA0MjMsMjA0MjQsMjA0MjUsMjA0MjcsMjA0MjgsMjA0MjksMjA0MzQsMjA0MzUsMjA0MzYsMjA0MzcsMjA0MzgsMjA0NDEsMjA0NDMsMjA0NDgsMjA0NTAsMjA0NTIsMjA0NTMsMjA0NTUsMjA0NTksMjA0NjAsMjA0NjQsMjA0NjYsMjA0NjgsMjA0NjksMjA0NzAsMjA0NzEsMjA0NzMsMjA0NzUsMjA0NzYsMjA0NzcsMjA0NzksMjA0ODAsMjA0ODEsMjA0ODIsMjA0ODMsMjA0ODQsMjA0ODUsMjA0ODYsMjA0ODcsMjA0ODgsMjA0ODksMjA0OTAsMjA0OTEsMjA0OTQsMjA0OTYsMjA0OTcsMjA0OTksMjA1MDEsMjA1MDIsMjA1MDMsMjA1MDcsMjA1MDksMjA1MTAsMjA1MTIsMjA1MTQsMjA1MTUsMjA1MTYsMjA1MTksMjA1MjMsMjA1MjcsMjA1MjgsMjA1MjksMjA1MzAsMjA1MzEsMjA1MzIsMjA1MzMsMjA1MzQsMjA1MzUsMjA1MzYsMjA1MzcsMjA1MzksMjA1NDEsMjA1NDMsMjA1NDQsMjA1NDUsMjA1NDYsMjA1NDgsMjA1NDksMjA1NTAsMjA1NTMsMjA1NTQsMjA1NTUsMjA1NTcsMjA1NjAsMjA1NjEsMjA1NjIsMjA1NjMsMjA1NjQsMjA1NjYsMjA1NjcsMjA1NjgsMjA1NjksMjA1NzEsMjA1NzMsMjA1NzQsMjA1NzUsMjA1NzYsMjA1NzcsMjA1NzgsMjA1NzksMjA1ODAsMjA1ODIsMjA1ODMsMjA1ODQsMjA1ODUsMjA1ODYsMjA1ODcsMjA1ODksMjA1OTAsMjA1OTEsMjA1OTIsMjA1OTMsMjA1OTQsMjA1OTUsMjA1OTYsMjA1OTcsMjA2MDAsMjA2MDEsMjA2MDIsMjA2MDQsMjA2MDUsMjA2MDksMjA2MTAsMjA2MTEsMjA2MTIsMjA2MTQsMjA2MTUsMjA2MTcsMjA2MTgsMjA2MTksMjA2MjAsMjA2MjIsMjA2MjMsMjA2MjQsMjA2MjUsMjA2MjYsMjA2MjcsMjA2MjgsMjA2MjksMjA2MzAsMjA2MzEsMjA2MzIsMjA2MzMsMjA2MzQsMjA2MzUsMjA2MzYsMjA2MzcsMjA2MzgsMjA2MzksMjA2NDAsMjA2NDEsMjA2NDIsMjA2NDQsMjA2NDYsMjA2NTAsMjA2NTEsMjA2NTMsMjA2NTQsMjA2NTUsMjA2NTYsMjA2NTcsMjA2NTksMjA2NjAsMjA2NjEsMjA2NjIsMjA2NjMsMjA2NjQsMjA2NjUsMjA2NjgsMjA2NjksMjA2NzAsMjA2NzEsMjA2NzIsMjA2NzMsMjA2NzQsMjA2NzUsMjA2NzYsMjA2NzcsMjA2NzgsMjA2NzksMjA2ODAsMjA2ODEsMjA2ODIsMjA2ODMsMjA2ODQsMjA2ODUsMjA2ODYsMjA2ODgsMjA2ODksMjA2OTAsMjA2OTEsMjA2OTIsMjA2OTMsMjA2OTUsMjA2OTYsMjA2OTcsMjA2OTksMjA3MDAsMjA3MDEsMjA3MDIsMjA3MDMsMjA3MDQsMjA3MDUsMjA3MDYsMjA3MDcsMjA3MDgsMjA3MDksMjA3MTIsMjA3MTMsMjA3MTQsMjA3MTUsMjA3MTksMjA3MjAsMjA3MjEsMjA3MjIsMjA3MjQsMjA3MjYsMjA3MjcsMjA3MjgsMjA3MjksMjA3MzAsMjA3MzIsMjA3MzMsMjA3MzQsMjA3MzUsMjA3MzYsMjA3MzcsMjA3MzgsMjA3MzksMjA3NDAsMjA3NDEsMjA3NDQsMjA3NDUsMjA3NDYsMjA3NDgsMjA3NDksMjA3NTAsMjA3NTEsMjA3NTIsMjA3NTMsMjA3NTUsMjA3NTYsMjA3NTcsMjA3NTgsMjA3NTksMjA3NjAsMjA3NjEsMjA3NjIsMjA3NjMsMjA3NjQsMjA3NjUsMjA3NjYsMjA3NjcsMjA3NjgsMjA3NzAsMjA3NzEsMjA3NzIsMjA3NzMsMjA3NzQsMjA3NzUsMjA3NzYsMjA3NzcsMjA3NzgsMjA3NzksMjA3ODAsMjA3ODEsMjA3ODIsMjA3ODMsMjA3ODQsMjA3ODUsMjA3ODYsMjA3ODcsMjA3ODgsMjA3ODksMjA3OTAsMjA3OTEsMjA3OTIsMjA3OTMsMjA3OTQsMjA3OTUsMjA3OTYsMjA3OTcsMjA3OTgsMjA4MDIsMjA4MDcsMjA4MTAsMjA4MTIsMjA4MTQsMjA4MTUsMjA4MTYsMjA4MTgsMjA4MTksMjA4MjMsMjA4MjQsMjA4MjUsMjA4MjcsMjA4MjksMjA4MzAsMjA4MzEsMjA4MzIsMjA4MzMsMjA4MzUsMjA4MzYsMjA4MzgsMjA4MzksMjA4NDEsMjA4NDIsMjA4NDcsMjA4NTAsMjA4NTgsMjA4NjIsMjA4NjMsMjA4NjcsMjA4NjgsMjA4NzAsMjA4NzEsMjA4NzQsMjA4NzUsMjA4NzgsMjA4NzksMjA4ODAsMjA4ODEsMjA4ODMsMjA4ODQsMjA4ODgsMjA4OTAsMjA4OTMsMjA4OTQsMjA4OTUsMjA4OTcsMjA4OTksMjA5MDIsMjA5MDMsMjA5MDQsMjA5MDUsMjA5MDYsMjA5MDksMjA5MTAsMjA5MTYsMjA5MjAsMjA5MjEsMjA5MjIsMjA5MjYsMjA5MjcsMjA5MjksMjA5MzAsMjA5MzEsMjA5MzMsMjA5MzYsMjA5MzgsMjA5NDEsMjA5NDIsMjA5NDQsMjA5NDYsMjA5NDcsMjA5NDgsMjA5NDksMjA5NTAsMjA5NTEsMjA5NTIsMjA5NTMsMjA5NTQsMjA5NTYsMjA5NTgsMjA5NTksMjA5NjIsMjA5NjMsMjA5NjUsMjA5NjYsMjA5NjcsMjA5NjgsMjA5NjksMjA5NzAsMjA5NzIsMjA5NzQsMjA5NzcsMjA5NzgsMjA5ODAsMjA5ODMsMjA5OTAsMjA5OTYsMjA5OTcsMjEwMDEsMjEwMDMsMjEwMDQsMjEwMDcsMjEwMDgsMjEwMTEsMjEwMTIsMjEwMTMsMjEwMjAsMjEwMjIsMjEwMjMsMjEwMjUsMjEwMjYsMjEwMjcsMjEwMjksMjEwMzAsMjEwMzEsMjEwMzQsMjEwMzYsMjEwMzksMjEwNDEsMjEwNDIsMjEwNDQsMjEwNDUsMjEwNTIsMjEwNTQsMjEwNjAsMjEwNjEsMjEwNjIsMjEwNjMsMjEwNjQsMjEwNjUsMjEwNjcsMjEwNzAsMjEwNzEsMjEwNzQsMjEwNzUsMjEwNzcsMjEwNzksMjEwODAsMjEwODEsMjEwODIsMjEwODMsMjEwODUsMjEwODcsMjEwODgsMjEwOTAsMjEwOTEsMjEwOTIsMjEwOTQsMjEwOTYsMjEwOTksMjExMDAsMjExMDEsMjExMDIsMjExMDQsMjExMDUsMjExMDcsMjExMDgsMjExMDksMjExMTAsMjExMTEsMjExMTIsMjExMTMsMjExMTQsMjExMTUsMjExMTYsMjExMTgsMjExMjAsMjExMjMsMjExMjQsMjExMjUsMjExMjYsMjExMjcsMjExMjksMjExMzAsMjExMzEsMjExMzIsMjExMzMsMjExMzQsMjExMzUsMjExMzcsMjExMzgsMjExNDAsMjExNDEsMjExNDIsMjExNDMsMjExNDQsMjExNDUsMjExNDYsMjExNDgsMjExNTYsMjExNTcsMjExNTgsMjExNTksMjExNjYsMjExNjcsMjExNjgsMjExNzIsMjExNzMsMjExNzQsMjExNzUsMjExNzYsMjExNzcsMjExNzgsMjExNzksMjExODAsMjExODEsMjExODQsMjExODUsMjExODYsMjExODgsMjExODksMjExOTAsMjExOTIsMjExOTQsMjExOTYsMjExOTcsMjExOTgsMjExOTksMjEyMDEsMjEyMDMsMjEyMDQsMjEyMDUsMjEyMDcsMjEyMDksMjEyMTAsMjEyMTEsMjEyMTIsMjEyMTMsMjEyMTQsMjEyMTYsMjEyMTcsMjEyMTgsMjEyMTksMjEyMjEsMjEyMjIsMjEyMjMsMjEyMjQsMjEyMjUsMjEyMjYsMjEyMjcsMjEyMjgsMjEyMjksMjEyMzAsMjEyMzEsMjEyMzMsMjEyMzQsMjEyMzUsMjEyMzYsMjEyMzcsMjEyMzgsMjEyMzksMjEyNDAsMjEyNDMsMjEyNDQsMjEyNDUsMjEyNDksMjEyNTAsMjEyNTEsMjEyNTIsMjEyNTUsMjEyNTcsMjEyNTgsMjEyNTksMjEyNjAsMjEyNjIsMjEyNjUsMjEyNjYsMjEyNjcsMjEyNjgsMjEyNzIsMjEyNzUsMjEyNzYsMjEyNzgsMjEyNzksMjEyODIsMjEyODQsMjEyODUsMjEyODcsMjEyODgsMjEyODksMjEyOTEsMjEyOTIsMjEyOTMsMjEyOTUsMjEyOTYsMjEyOTcsMjEyOTgsMjEyOTksMjEzMDAsMjEzMDEsMjEzMDIsMjEzMDMsMjEzMDQsMjEzMDgsMjEzMDksMjEzMTIsMjEzMTQsMjEzMTYsMjEzMTgsMjEzMjMsMjEzMjQsMjEzMjUsMjEzMjgsMjEzMzIsMjEzMzYsMjEzMzcsMjEzMzksMjEzNDEsMjEzNDksMjEzNTIsMjEzNTQsMjEzNTYsMjEzNTcsMjEzNjIsMjEzNjYsMjEzNjksMjEzNzEsMjEzNzIsMjEzNzMsMjEzNzQsMjEzNzYsMjEzNzcsMjEzNzksMjEzODMsMjEzODQsMjEzODYsMjEzOTAsMjEzOTEsMjEzOTIsMjEzOTMsMjEzOTQsMjEzOTUsMjEzOTYsMjEzOTgsMjEzOTksMjE0MDEsMjE0MDMsMjE0MDQsMjE0MDYsMjE0MDgsMjE0MDksMjE0MTIsMjE0MTUsMjE0MTgsMjE0MTksMjE0MjAsMjE0MjEsMjE0MjMsMjE0MjQsMjE0MjUsMjE0MjYsMjE0MjcsMjE0MjgsMjE0MjksMjE0MzEsMjE0MzIsMjE0MzMsMjE0MzQsMjE0MzYsMjE0MzcsMjE0MzgsMjE0NDAsMjE0NDMsMjE0NDQsMjE0NDUsMjE0NDYsMjE0NDcsMjE0NTQsMjE0NTUsMjE0NTYsMjE0NTgsMjE0NTksMjE0NjEsMjE0NjYsMjE0NjgsMjE0NjksMjE0NzAsMjE0NzMsMjE0NzQsMjE0NzksMjE0OTIsMjE0OTgsMjE1MDIsMjE1MDMsMjE1MDQsMjE1MDYsMjE1MDksMjE1MTEsMjE1MTUsMjE1MjQsMjE1MjgsMjE1MjksMjE1MzAsMjE1MzIsMjE1MzgsMjE1NDAsMjE1NDEsMjE1NDYsMjE1NTIsMjE1NTUsMjE1NTgsMjE1NTksMjE1NjIsMjE1NjUsMjE1NjcsMjE1NjksMjE1NzAsMjE1NzIsMjE1NzMsMjE1NzUsMjE1NzcsMjE1ODAsMjE1ODEsMjE1ODIsMjE1ODMsMjE1ODUsMjE1OTQsMjE1OTcsMjE1OTgsMjE1OTksMjE2MDAsMjE2MDEsMjE2MDMsMjE2MDUsMjE2MDcsMjE2MDksMjE2MTAsMjE2MTEsMjE2MTIsMjE2MTMsMjE2MTQsMjE2MTUsMjE2MTYsMjE2MjAsMjE2MjUsMjE2MjYsMjE2MzAsMjE2MzEsMjE2MzMsMjE2MzUsMjE2MzcsMjE2MzksMjE2NDAsMjE2NDEsMjE2NDIsMjE2NDUsMjE2NDksMjE2NTEsMjE2NTUsMjE2NTYsMjE2NjAsMjE2NjIsMjE2NjMsMjE2NjQsMjE2NjUsMjE2NjYsMjE2NjksMjE2NzgsMjE2ODAsMjE2ODIsMjE2ODUsMjE2ODYsMjE2ODcsMjE2ODksMjE2OTAsMjE2OTIsMjE2OTQsMjE2OTksMjE3MDEsMjE3MDYsMjE3MDcsMjE3MTgsMjE3MjAsMjE3MjMsMjE3MjgsMjE3MjksMjE3MzAsMjE3MzEsMjE3MzIsMjE3MzksMjE3NDAsMjE3NDMsMjE3NDQsMjE3NDUsMjE3NDgsMjE3NDksMjE3NTAsMjE3NTEsMjE3NTIsMjE3NTMsMjE3NTUsMjE3NTgsMjE3NjAsMjE3NjIsMjE3NjMsMjE3NjQsMjE3NjUsMjE3NjgsMjE3NzAsMjE3NzEsMjE3NzIsMjE3NzMsMjE3NzQsMjE3NzgsMjE3NzksMjE3ODEsMjE3ODIsMjE3ODMsMjE3ODQsMjE3ODUsMjE3ODYsMjE3ODgsMjE3ODksMjE3OTAsMjE3OTEsMjE3OTMsMjE3OTcsMjE3OTgsMjE4MDAsMjE4MDEsMjE4MDMsMjE4MDUsMjE4MTAsMjE4MTIsMjE4MTMsMjE4MTQsMjE4MTYsMjE4MTcsMjE4MTgsMjE4MTksMjE4MjEsMjE4MjQsMjE4MjYsMjE4MjksMjE4MzEsMjE4MzIsMjE4MzUsMjE4MzYsMjE4MzcsMjE4MzgsMjE4MzksMjE4NDEsMjE4NDIsMjE4NDMsMjE4NDQsMjE4NDcsMjE4NDgsMjE4NDksMjE4NTAsMjE4NTEsMjE4NTMsMjE4NTQsMjE4NTUsMjE4NTYsMjE4NTgsMjE4NTksMjE4NjQsMjE4NjUsMjE4NjcsMjE4NzEsMjE4NzIsMjE4NzMsMjE4NzQsMjE4NzUsMjE4NzYsMjE4ODEsMjE4ODIsMjE4ODUsMjE4ODcsMjE4OTMsMjE4OTQsMjE5MDAsMjE5MDEsMjE5MDIsMjE5MDQsMjE5MDYsMjE5MDcsMjE5MDksMjE5MTAsMjE5MTEsMjE5MTQsMjE5MTUsMjE5MTgsMjE5MjAsMjE5MjEsMjE5MjIsMjE5MjMsMjE5MjQsMjE5MjUsMjE5MjYsMjE5MjgsMjE5MjksMjE5MzAsMjE5MzEsMjE5MzIsMjE5MzMsMjE5MzQsMjE5MzUsMjE5MzYsMjE5MzgsMjE5NDAsMjE5NDIsMjE5NDQsMjE5NDYsMjE5NDgsMjE5NTEsMjE5NTIsMjE5NTMsMjE5NTQsMjE5NTUsMjE5NTgsMjE5NTksMjE5NjAsMjE5NjIsMjE5NjMsMjE5NjYsMjE5NjcsMjE5NjgsMjE5NzMsMjE5NzUsMjE5NzYsMjE5NzcsMjE5NzgsMjE5NzksMjE5ODIsMjE5ODQsMjE5ODYsMjE5OTEsMjE5OTMsMjE5OTcsMjE5OTgsMjIwMDAsMjIwMDEsMjIwMDQsMjIwMDYsMjIwMDgsMjIwMDksMjIwMTAsMjIwMTEsMjIwMTIsMjIwMTUsMjIwMTgsMjIwMTksMjIwMjAsMjIwMjEsMjIwMjIsMjIwMjMsMjIwMjYsMjIwMjcsMjIwMjksMjIwMzIsMjIwMzMsMjIwMzQsMjIwMzUsMjIwMzYsMjIwMzcsMjIwMzgsMjIwMzksMjIwNDEsMjIwNDIsMjIwNDQsMjIwNDUsMjIwNDgsMjIwNDksMjIwNTAsMjIwNTMsMjIwNTQsMjIwNTYsMjIwNTcsMjIwNTgsMjIwNTksMjIwNjIsMjIwNjMsMjIwNjQsMjIwNjcsMjIwNjksMjIwNzEsMjIwNzIsMjIwNzQsMjIwNzYsMjIwNzcsMjIwNzgsMjIwODAsMjIwODEsMjIwODIsMjIwODMsMjIwODQsMjIwODUsMjIwODYsMjIwODcsMjIwODgsMjIwODksMjIwOTAsMjIwOTEsMjIwOTUsMjIwOTYsMjIwOTcsMjIwOTgsMjIwOTksMjIxMDEsMjIxMDIsMjIxMDYsMjIxMDcsMjIxMDksMjIxMTAsMjIxMTEsMjIxMTIsMjIxMTMsMjIxMTUsMjIxMTcsMjIxMTgsMjIxMTksMjIxMjUsMjIxMjYsMjIxMjcsMjIxMjgsMjIxMzAsMjIxMzEsMjIxMzIsMjIxMzMsMjIxMzUsMjIxMzYsMjIxMzcsMjIxMzgsMjIxNDEsMjIxNDIsMjIxNDMsMjIxNDQsMjIxNDUsMjIxNDYsMjIxNDcsMjIxNDgsMjIxNTEsMjIxNTIsMjIxNTMsMjIxNTQsMjIxNTUsMjIxNTYsMjIxNTcsMjIxNjAsMjIxNjEsMjIxNjIsMjIxNjQsMjIxNjUsMjIxNjYsMjIxNjcsMjIxNjgsMjIxNjksMjIxNzAsMjIxNzEsMjIxNzIsMjIxNzMsMjIxNzQsMjIxNzUsMjIxNzYsMjIxNzcsMjIxNzgsMjIxODAsMjIxODEsMjIxODIsMjIxODMsMjIxODQsMjIxODUsMjIxODYsMjIxODcsMjIxODgsMjIxODksMjIxOTAsMjIxOTIsMjIxOTMsMjIxOTQsMjIxOTUsMjIxOTYsMjIxOTcsMjIxOTgsMjIyMDAsMjIyMDEsMjIyMDIsMjIyMDMsMjIyMDUsMjIyMDYsMjIyMDcsMjIyMDgsMjIyMDksMjIyMTAsMjIyMTEsMjIyMTIsMjIyMTMsMjIyMTQsMjIyMTUsMjIyMTYsMjIyMTcsMjIyMTksMjIyMjAsMjIyMjEsMjIyMjIsMjIyMjMsMjIyMjQsMjIyMjUsMjIyMjYsMjIyMjcsMjIyMjksMjIyMzAsMjIyMzIsMjIyMzMsMjIyMzYsMjIyNDMsMjIyNDUsMjIyNDYsMjIyNDcsMjIyNDgsMjIyNDksMjIyNTAsMjIyNTIsMjIyNTQsMjIyNTUsMjIyNTgsMjIyNTksMjIyNjIsMjIyNjMsMjIyNjQsMjIyNjcsMjIyNjgsMjIyNzIsMjIyNzMsMjIyNzQsMjIyNzcsMjIyNzksMjIyODMsMjIyODQsMjIyODUsMjIyODYsMjIyODcsMjIyODgsMjIyODksMjIyOTAsMjIyOTEsMjIyOTIsMjIyOTMsMjIyOTQsMjIyOTUsMjIyOTYsMjIyOTcsMjIyOTgsMjIyOTksMjIzMDEsMjIzMDIsMjIzMDQsMjIzMDUsMjIzMDYsMjIzMDgsMjIzMDksMjIzMTAsMjIzMTEsMjIzMTUsMjIzMjEsMjIzMjIsMjIzMjQsMjIzMjUsMjIzMjYsMjIzMjcsMjIzMjgsMjIzMzIsMjIzMzMsMjIzMzUsMjIzMzcsMjIzMzksMjIzNDAsMjIzNDEsMjIzNDIsMjIzNDQsMjIzNDUsMjIzNDcsMjIzNTQsMjIzNTUsMjIzNTYsMjIzNTcsMjIzNTgsMjIzNjAsMjIzNjEsMjIzNzAsMjIzNzEsMjIzNzMsMjIzNzUsMjIzODAsMjIzODIsMjIzODQsMjIzODUsMjIzODYsMjIzODgsMjIzODksMjIzOTIsMjIzOTMsMjIzOTQsMjIzOTcsMjIzOTgsMjIzOTksMjI0MDAsMjI0MDEsMjI0MDcsMjI0MDgsMjI0MDksMjI0MTAsMjI0MTMsMjI0MTQsMjI0MTUsMjI0MTYsMjI0MTcsMjI0MjAsMjI0MjEsMjI0MjIsMjI0MjMsMjI0MjQsMjI0MjUsMjI0MjYsMjI0MjgsMjI0MjksMjI0MzAsMjI0MzEsMjI0MzcsMjI0NDAsMjI0NDIsMjI0NDQsMjI0NDcsMjI0NDgsMjI0NDksMjI0NTEsMjI0NTMsMjI0NTQsMjI0NTUsMjI0NTcsMjI0NTgsMjI0NTksMjI0NjAsMjI0NjEsMjI0NjIsMjI0NjMsMjI0NjQsMjI0NjUsMjI0NjgsMjI0NjksMjI0NzAsMjI0NzEsMjI0NzIsMjI0NzMsMjI0NzQsMjI0NzYsMjI0NzcsMjI0ODAsMjI0ODEsMjI0ODMsMjI0ODYsMjI0ODcsMjI0OTEsMjI0OTIsMjI0OTQsMjI0OTcsMjI0OTgsMjI0OTksMjI1MDEsMjI1MDIsMjI1MDMsMjI1MDQsMjI1MDUsMjI1MDYsMjI1MDcsMjI1MDgsMjI1MTAsMjI1MTIsMjI1MTMsMjI1MTQsMjI1MTUsMjI1MTcsMjI1MTgsMjI1MTksMjI1MjMsMjI1MjQsMjI1MjYsMjI1MjcsMjI1MjksMjI1MzEsMjI1MzIsMjI1MzMsMjI1MzYsMjI1MzcsMjI1MzgsMjI1NDAsMjI1NDIsMjI1NDMsMjI1NDQsMjI1NDYsMjI1NDcsMjI1NDgsMjI1NTAsMjI1NTEsMjI1NTIsMjI1NTQsMjI1NTUsMjI1NTYsMjI1NTcsMjI1NTksMjI1NjIsMjI1NjMsMjI1NjUsMjI1NjYsMjI1NjcsMjI1NjgsMjI1NjksMjI1NzEsMjI1NzIsMjI1NzMsMjI1NzQsMjI1NzUsMjI1NzcsMjI1NzgsMjI1NzksMjI1ODAsMjI1ODIsMjI1ODMsMjI1ODQsMjI1ODUsMjI1ODYsMjI1ODcsMjI1ODgsMjI1ODksMjI1OTAsMjI1OTEsMjI1OTIsMjI1OTMsMjI1OTQsMjI1OTUsMjI1OTcsMjI1OTgsMjI1OTksMjI2MDAsMjI2MDEsMjI2MDIsMjI2MDMsMjI2MDYsMjI2MDcsMjI2MDgsMjI2MTAsMjI2MTEsMjI2MTMsMjI2MTQsMjI2MTUsMjI2MTcsMjI2MTgsMjI2MTksMjI2MjAsMjI2MjEsMjI2MjMsMjI2MjQsMjI2MjUsMjI2MjYsMjI2MjcsMjI2MjgsMjI2MzAsMjI2MzEsMjI2MzIsMjI2MzMsMjI2MzQsMjI2MzcsMjI2MzgsMjI2MzksMjI2NDAsMjI2NDEsMjI2NDIsMjI2NDMsMjI2NDQsMjI2NDUsMjI2NDYsMjI2NDcsMjI2NDgsMjI2NDksMjI2NTAsMjI2NTEsMjI2NTIsMjI2NTMsMjI2NTUsMjI2NTgsMjI2NjAsMjI2NjIsMjI2NjMsMjI2NjQsMjI2NjYsMjI2NjcsMjI2NjgsMjI2NjksMjI2NzAsMjI2NzEsMjI2NzIsMjI2NzMsMjI2NzYsMjI2NzcsMjI2NzgsMjI2NzksMjI2ODAsMjI2ODMsMjI2ODQsMjI2ODUsMjI2ODgsMjI2ODksMjI2OTAsMjI2OTEsMjI2OTIsMjI2OTMsMjI2OTQsMjI2OTUsMjI2OTgsMjI2OTksMjI3MDAsMjI3MDEsMjI3MDIsMjI3MDMsMjI3MDQsMjI3MDUsMjI3MDYsMjI3MDcsMjI3MDgsMjI3MDksMjI3MTAsMjI3MTEsMjI3MTIsMjI3MTMsMjI3MTQsMjI3MTUsMjI3MTcsMjI3MTgsMjI3MTksMjI3MjAsMjI3MjIsMjI3MjMsMjI3MjQsMjI3MjYsMjI3MjcsMjI3MjgsMjI3MjksMjI3MzAsMjI3MzEsMjI3MzIsMjI3MzMsMjI3MzQsMjI3MzUsMjI3MzYsMjI3MzgsMjI3MzksMjI3NDAsMjI3NDIsMjI3NDMsMjI3NDQsMjI3NDUsMjI3NDYsMjI3NDcsMjI3NDgsMjI3NDksMjI3NTAsMjI3NTEsMjI3NTIsMjI3NTMsMjI3NTQsMjI3NTUsMjI3NTcsMjI3NTgsMjI3NTksMjI3NjAsMjI3NjEsMjI3NjIsMjI3NjUsMjI3NjcsMjI3NjksMjI3NzAsMjI3NzIsMjI3NzMsMjI3NzUsMjI3NzYsMjI3NzgsMjI3NzksMjI3ODAsMjI3ODEsMjI3ODIsMjI3ODMsMjI3ODQsMjI3ODUsMjI3ODcsMjI3ODksMjI3OTAsMjI3OTIsMjI3OTMsMjI3OTQsMjI3OTUsMjI3OTYsMjI3OTgsMjI4MDAsMjI4MDEsMjI4MDIsMjI4MDMsMjI4MDcsMjI4MDgsMjI4MTEsMjI4MTMsMjI4MTQsMjI4MTYsMjI4MTcsMjI4MTgsMjI4MTksMjI4MjIsMjI4MjQsMjI4MjgsMjI4MzIsMjI4MzQsMjI4MzUsMjI4MzcsMjI4MzgsMjI4NDMsMjI4NDUsMjI4NDYsMjI4NDcsMjI4NDgsMjI4NTEsMjI4NTMsMjI4NTQsMjI4NTgsMjI4NjAsMjI4NjEsMjI4NjQsMjI4NjYsMjI4NjcsMjI4NzMsMjI4NzUsMjI4NzYsMjI4NzcsMjI4NzgsMjI4NzksMjI4ODEsMjI4ODMsMjI4ODQsMjI4ODYsMjI4ODcsMjI4ODgsMjI4ODksMjI4OTAsMjI4OTEsMjI4OTIsMjI4OTMsMjI4OTQsMjI4OTUsMjI4OTYsMjI4OTcsMjI4OTgsMjI5MDEsMjI5MDMsMjI5MDYsMjI5MDcsMjI5MDgsMjI5MTAsMjI5MTEsMjI5MTIsMjI5MTcsMjI5MjEsMjI5MjMsMjI5MjQsMjI5MjYsMjI5MjcsMjI5MjgsMjI5MjksMjI5MzIsMjI5MzMsMjI5MzYsMjI5MzgsMjI5MzksMjI5NDAsMjI5NDEsMjI5NDMsMjI5NDQsMjI5NDUsMjI5NDYsMjI5NTAsMjI5NTEsMjI5NTYsMjI5NTcsMjI5NjAsMjI5NjEsMjI5NjMsMjI5NjQsMjI5NjUsMjI5NjYsMjI5NjcsMjI5NjgsMjI5NzAsMjI5NzIsMjI5NzMsMjI5NzUsMjI5NzYsMjI5NzcsMjI5NzgsMjI5NzksMjI5ODAsMjI5ODEsMjI5ODMsMjI5ODQsMjI5ODUsMjI5ODgsMjI5ODksMjI5OTAsMjI5OTEsMjI5OTcsMjI5OTgsMjMwMDEsMjMwMDMsMjMwMDYsMjMwMDcsMjMwMDgsMjMwMDksMjMwMTAsMjMwMTIsMjMwMTQsMjMwMTUsMjMwMTcsMjMwMTgsMjMwMTksMjMwMjEsMjMwMjIsMjMwMjMsMjMwMjQsMjMwMjUsMjMwMjYsMjMwMjcsMjMwMjgsMjMwMjksMjMwMzAsMjMwMzEsMjMwMzIsMjMwMzQsMjMwMzYsMjMwMzcsMjMwMzgsMjMwNDAsMjMwNDIsMjMwNTAsMjMwNTEsMjMwNTMsMjMwNTQsMjMwNTUsMjMwNTYsMjMwNTgsMjMwNjAsMjMwNjEsMjMwNjIsMjMwNjMsMjMwNjUsMjMwNjYsMjMwNjcsMjMwNjksMjMwNzAsMjMwNzMsMjMwNzQsMjMwNzYsMjMwNzgsMjMwNzksMjMwODAsMjMwODIsMjMwODMsMjMwODQsMjMwODUsMjMwODYsMjMwODcsMjMwODgsMjMwOTEsMjMwOTMsMjMwOTUsMjMwOTYsMjMwOTcsMjMwOTgsMjMwOTksMjMxMDEsMjMxMDIsMjMxMDMsMjMxMDUsMjMxMDYsMjMxMDcsMjMxMDgsMjMxMDksMjMxMTEsMjMxMTIsMjMxMTUsMjMxMTYsMjMxMTcsMjMxMTgsMjMxMTksMjMxMjAsMjMxMjEsMjMxMjIsMjMxMjMsMjMxMjQsMjMxMjYsMjMxMjcsMjMxMjgsMjMxMjksMjMxMzEsMjMxMzIsMjMxMzMsMjMxMzQsMjMxMzUsMjMxMzYsMjMxMzcsMjMxMzksMjMxNDAsMjMxNDEsMjMxNDIsMjMxNDQsMjMxNDUsMjMxNDcsMjMxNDgsMjMxNDksMjMxNTAsMjMxNTEsMjMxNTIsMjMxNTMsMjMxNTQsMjMxNTUsMjMxNjAsMjMxNjEsMjMxNjMsMjMxNjQsMjMxNjUsMjMxNjYsMjMxNjgsMjMxNjksMjMxNzAsMjMxNzEsMjMxNzIsMjMxNzMsMjMxNzQsMjMxNzUsMjMxNzYsMjMxNzcsMjMxNzgsMjMxNzksMjMxODAsMjMxODEsMjMxODIsMjMxODMsMjMxODQsMjMxODUsMjMxODcsMjMxODgsMjMxODksMjMxOTAsMjMxOTEsMjMxOTIsMjMxOTMsMjMxOTYsMjMxOTcsMjMxOTgsMjMxOTksMjMyMDAsMjMyMDEsMjMyMDIsMjMyMDMsMjMyMDQsMjMyMDUsMjMyMDYsMjMyMDcsMjMyMDgsMjMyMDksMjMyMTEsMjMyMTIsMjMyMTMsMjMyMTQsMjMyMTUsMjMyMTYsMjMyMTcsMjMyMjAsMjMyMjIsMjMyMjMsMjMyMjUsMjMyMjYsMjMyMjcsMjMyMjgsMjMyMjksMjMyMzEsMjMyMzIsMjMyMzUsMjMyMzYsMjMyMzcsMjMyMzgsMjMyMzksMjMyNDAsMjMyNDIsMjMyNDMsMjMyNDUsMjMyNDYsMjMyNDcsMjMyNDgsMjMyNDksMjMyNTEsMjMyNTMsMjMyNTUsMjMyNTcsMjMyNTgsMjMyNTksMjMyNjEsMjMyNjIsMjMyNjMsMjMyNjYsMjMyNjgsMjMyNjksMjMyNzEsMjMyNzIsMjMyNzQsMjMyNzYsMjMyNzcsMjMyNzgsMjMyNzksMjMyODAsMjMyODIsMjMyODMsMjMyODQsMjMyODUsMjMyODYsMjMyODcsMjMyODgsMjMyODksMjMyOTAsMjMyOTEsMjMyOTIsMjMyOTMsMjMyOTQsMjMyOTUsMjMyOTYsMjMyOTcsMjMyOTgsMjMyOTksMjMzMDAsMjMzMDEsMjMzMDIsMjMzMDMsMjMzMDQsMjMzMDYsMjMzMDcsMjMzMDgsMjMzMDksMjMzMTAsMjMzMTEsMjMzMTIsMjMzMTMsMjMzMTQsMjMzMTUsMjMzMTYsMjMzMTcsMjMzMjAsMjMzMjEsMjMzMjIsMjMzMjMsMjMzMjQsMjMzMjUsMjMzMjYsMjMzMjcsMjMzMjgsMjMzMjksMjMzMzAsMjMzMzEsMjMzMzIsMjMzMzMsMjMzMzQsMjMzMzUsMjMzMzYsMjMzMzcsMjMzMzgsMjMzMzksMjMzNDAsMjMzNDEsMjMzNDIsMjMzNDMsMjMzNDQsMjMzNDUsMjMzNDcsMjMzNDksMjMzNTAsMjMzNTIsMjMzNTMsMjMzNTQsMjMzNTUsMjMzNTYsMjMzNTcsMjMzNTgsMjMzNTksMjMzNjEsMjMzNjIsMjMzNjMsMjMzNjQsMjMzNjUsMjMzNjYsMjMzNjcsMjMzNjgsMjMzNjksMjMzNzAsMjMzNzEsMjMzNzIsMjMzNzMsMjMzNzQsMjMzNzUsMjMzNzgsMjMzODIsMjMzOTAsMjMzOTIsMjMzOTMsMjMzOTksMjM0MDAsMjM0MDMsMjM0MDUsMjM0MDYsMjM0MDcsMjM0MTAsMjM0MTIsMjM0MTQsMjM0MTUsMjM0MTYsMjM0MTcsMjM0MTksMjM0MjAsMjM0MjIsMjM0MjMsMjM0MjYsMjM0MzAsMjM0MzQsMjM0MzcsMjM0MzgsMjM0NDAsMjM0NDEsMjM0NDIsMjM0NDQsMjM0NDYsMjM0NTUsMjM0NjMsMjM0NjQsMjM0NjUsMjM0NjgsMjM0NjksMjM0NzAsMjM0NzEsMjM0NzMsMjM0NzQsMjM0NzksMjM0ODIsMjM0ODMsMjM0ODQsMjM0ODgsMjM0ODksMjM0OTEsMjM0OTYsMjM0OTcsMjM0OTgsMjM0OTksMjM1MDEsMjM1MDIsMjM1MDMsMjM1MDUsMjM1MDgsMjM1MDksMjM1MTAsMjM1MTEsMjM1MTIsMjM1MTMsMjM1MTQsMjM1MTUsMjM1MTYsMjM1MjAsMjM1MjIsMjM1MjMsMjM1MjYsMjM1MjcsMjM1MjksMjM1MzAsMjM1MzEsMjM1MzIsMjM1MzMsMjM1MzUsMjM1MzcsMjM1MzgsMjM1MzksMjM1NDAsMjM1NDEsMjM1NDIsMjM1NDMsMjM1NDksMjM1NTAsMjM1NTIsMjM1NTQsMjM1NTUsMjM1NTcsMjM1NTksMjM1NjAsMjM1NjMsMjM1NjQsMjM1NjUsMjM1NjYsMjM1NjgsMjM1NzAsMjM1NzEsMjM1NzUsMjM1NzcsMjM1NzksMjM1ODIsMjM1ODMsMjM1ODQsMjM1ODUsMjM1ODcsMjM1OTAsMjM1OTIsMjM1OTMsMjM1OTQsMjM1OTUsMjM1OTcsMjM1OTgsMjM1OTksMjM2MDAsMjM2MDIsMjM2MDMsMjM2MDUsMjM2MDYsMjM2MDcsMjM2MTksMjM2MjAsMjM2MjIsMjM2MjMsMjM2MjgsMjM2MjksMjM2MzQsMjM2MzUsMjM2MzYsMjM2MzgsMjM2MzksMjM2NDAsMjM2NDIsMjM2NDMsMjM2NDQsMjM2NDUsMjM2NDcsMjM2NTAsMjM2NTIsMjM2NTUsMjM2NTYsMjM2NTcsMjM2NTgsMjM2NTksMjM2NjAsMjM2NjEsMjM2NjQsMjM2NjYsMjM2NjcsMjM2NjgsMjM2NjksMjM2NzAsMjM2NzEsMjM2NzIsMjM2NzUsMjM2NzYsMjM2NzcsMjM2NzgsMjM2ODAsMjM2ODMsMjM2ODQsMjM2ODUsMjM2ODYsMjM2ODcsMjM2ODksMjM2OTAsMjM2OTEsMjM2OTQsMjM2OTUsMjM2OTgsMjM2OTksMjM3MDEsMjM3MDksMjM3MTAsMjM3MTEsMjM3MTIsMjM3MTMsMjM3MTYsMjM3MTcsMjM3MTgsMjM3MTksMjM3MjAsMjM3MjIsMjM3MjYsMjM3MjcsMjM3MjgsMjM3MzAsMjM3MzIsMjM3MzQsMjM3MzcsMjM3MzgsMjM3MzksMjM3NDAsMjM3NDIsMjM3NDQsMjM3NDYsMjM3NDcsMjM3NDksMjM3NTAsMjM3NTEsMjM3NTIsMjM3NTMsMjM3NTQsMjM3NTYsMjM3NTcsMjM3NTgsMjM3NTksMjM3NjAsMjM3NjEsMjM3NjMsMjM3NjQsMjM3NjUsMjM3NjYsMjM3NjcsMjM3NjgsMjM3NzAsMjM3NzEsMjM3NzIsMjM3NzMsMjM3NzQsMjM3NzUsMjM3NzYsMjM3NzgsMjM3NzksMjM3ODMsMjM3ODUsMjM3ODcsMjM3ODgsMjM3OTAsMjM3OTEsMjM3OTMsMjM3OTQsMjM3OTUsMjM3OTYsMjM3OTcsMjM3OTgsMjM3OTksMjM4MDAsMjM4MDEsMjM4MDIsMjM4MDQsMjM4MDUsMjM4MDYsMjM4MDcsMjM4MDgsMjM4MDksMjM4MTIsMjM4MTMsMjM4MTYsMjM4MTcsMjM4MTgsMjM4MTksMjM4MjAsMjM4MjEsMjM4MjMsMjM4MjQsMjM4MjUsMjM4MjYsMjM4MjcsMjM4MjksMjM4MzEsMjM4MzIsMjM4MzMsMjM4MzQsMjM4MzYsMjM4MzcsMjM4MzksMjM4NDAsMjM4NDEsMjM4NDIsMjM4NDMsMjM4NDUsMjM4NDgsMjM4NTAsMjM4NTEsMjM4NTIsMjM4NTUsMjM4NTYsMjM4NTcsMjM4NTgsMjM4NTksMjM4NjEsMjM4NjIsMjM4NjMsMjM4NjQsMjM4NjUsMjM4NjYsMjM4NjcsMjM4NjgsMjM4NzEsMjM4NzIsMjM4NzMsMjM4NzQsMjM4NzUsMjM4NzYsMjM4NzcsMjM4NzgsMjM4ODAsMjM4ODEsMjM4ODUsMjM4ODYsMjM4ODcsMjM4ODgsMjM4ODksMjM4OTAsMjM4OTEsMjM4OTIsMjM4OTMsMjM4OTQsMjM4OTUsMjM4OTcsMjM4OTgsMjM5MDAsMjM5MDIsMjM5MDMsMjM5MDQsMjM5MDUsMjM5MDYsMjM5MDcsMjM5MDgsMjM5MDksMjM5MTAsMjM5MTEsMjM5MTIsMjM5MTQsMjM5MTcsMjM5MTgsMjM5MjAsMjM5MjEsMjM5MjIsMjM5MjMsMjM5MjUsMjM5MjYsMjM5MjcsMjM5MjgsMjM5MjksMjM5MzAsMjM5MzEsMjM5MzIsMjM5MzMsMjM5MzQsMjM5MzUsMjM5MzYsMjM5MzcsMjM5MzksMjM5NDAsMjM5NDEsMjM5NDIsMjM5NDMsMjM5NDQsMjM5NDUsMjM5NDYsMjM5NDcsMjM5NDgsMjM5NDksMjM5NTAsMjM5NTEsMjM5NTIsMjM5NTMsMjM5NTQsMjM5NTUsMjM5NTYsMjM5NTcsMjM5NTgsMjM5NTksMjM5NjAsMjM5NjIsMjM5NjMsMjM5NjQsMjM5NjYsMjM5NjcsMjM5NjgsMjM5NjksMjM5NzAsMjM5NzEsMjM5NzIsMjM5NzMsMjM5NzQsMjM5NzUsMjM5NzYsMjM5NzcsMjM5NzgsMjM5NzksMjM5ODAsMjM5ODEsMjM5ODIsMjM5ODMsMjM5ODQsMjM5ODUsMjM5ODYsMjM5ODcsMjM5ODgsMjM5ODksMjM5OTAsMjM5OTIsMjM5OTMsMjM5OTQsMjM5OTUsMjM5OTYsMjM5OTcsMjM5OTgsMjM5OTksMjQwMDAsMjQwMDEsMjQwMDIsMjQwMDMsMjQwMDQsMjQwMDYsMjQwMDcsMjQwMDgsMjQwMDksMjQwMTAsMjQwMTEsMjQwMTIsMjQwMTQsMjQwMTUsMjQwMTYsMjQwMTcsMjQwMTgsMjQwMTksMjQwMjAsMjQwMjEsMjQwMjIsMjQwMjMsMjQwMjQsMjQwMjUsMjQwMjYsMjQwMjgsMjQwMzEsMjQwMzIsMjQwMzUsMjQwMzYsMjQwNDIsMjQwNDQsMjQwNDUsMjQwNDgsMjQwNTMsMjQwNTQsMjQwNTYsMjQwNTcsMjQwNTgsMjQwNTksMjQwNjAsMjQwNjMsMjQwNjQsMjQwNjgsMjQwNzEsMjQwNzMsMjQwNzQsMjQwNzUsMjQwNzcsMjQwNzgsMjQwODIsMjQwODMsMjQwODcsMjQwOTQsMjQwOTUsMjQwOTYsMjQwOTcsMjQwOTgsMjQwOTksMjQxMDAsMjQxMDEsMjQxMDQsMjQxMDUsMjQxMDYsMjQxMDcsMjQxMDgsMjQxMTEsMjQxMTIsMjQxMTQsMjQxMTUsMjQxMTYsMjQxMTcsMjQxMTgsMjQxMjEsMjQxMjIsMjQxMjYsMjQxMjcsMjQxMjgsMjQxMjksMjQxMzEsMjQxMzQsMjQxMzUsMjQxMzYsMjQxMzcsMjQxMzgsMjQxMzksMjQxNDEsMjQxNDIsMjQxNDMsMjQxNDQsMjQxNDUsMjQxNDYsMjQxNDcsMjQxNTAsMjQxNTEsMjQxNTIsMjQxNTMsMjQxNTQsMjQxNTYsMjQxNTcsMjQxNTksMjQxNjAsMjQxNjMsMjQxNjQsMjQxNjUsMjQxNjYsMjQxNjcsMjQxNjgsMjQxNjksMjQxNzAsMjQxNzEsMjQxNzIsMjQxNzMsMjQxNzQsMjQxNzUsMjQxNzYsMjQxNzcsMjQxODEsMjQxODMsMjQxODUsMjQxOTAsMjQxOTMsMjQxOTQsMjQxOTUsMjQxOTcsMjQyMDAsMjQyMDEsMjQyMDQsMjQyMDUsMjQyMDYsMjQyMTAsMjQyMTYsMjQyMTksMjQyMjEsMjQyMjUsMjQyMjYsMjQyMjcsMjQyMjgsMjQyMzIsMjQyMzMsMjQyMzQsMjQyMzUsMjQyMzYsMjQyMzgsMjQyMzksMjQyNDAsMjQyNDEsMjQyNDIsMjQyNDQsMjQyNTAsMjQyNTEsMjQyNTIsMjQyNTMsMjQyNTUsMjQyNTYsMjQyNTcsMjQyNTgsMjQyNTksMjQyNjAsMjQyNjEsMjQyNjIsMjQyNjMsMjQyNjQsMjQyNjcsMjQyNjgsMjQyNjksMjQyNzAsMjQyNzEsMjQyNzIsMjQyNzYsMjQyNzcsMjQyNzksMjQyODAsMjQyODEsMjQyODIsMjQyODQsMjQyODUsMjQyODYsMjQyODcsMjQyODgsMjQyODksMjQyOTAsMjQyOTEsMjQyOTIsMjQyOTMsMjQyOTQsMjQyOTUsMjQyOTcsMjQyOTksMjQzMDAsMjQzMDEsMjQzMDIsMjQzMDMsMjQzMDQsMjQzMDUsMjQzMDYsMjQzMDcsMjQzMDksMjQzMTIsMjQzMTMsMjQzMTUsMjQzMTYsMjQzMTcsMjQzMjUsMjQzMjYsMjQzMjcsMjQzMjksMjQzMzIsMjQzMzMsMjQzMzQsMjQzMzYsMjQzMzgsMjQzNDAsMjQzNDIsMjQzNDUsMjQzNDYsMjQzNDgsMjQzNDksMjQzNTAsMjQzNTMsMjQzNTQsMjQzNTUsMjQzNTYsMjQzNjAsMjQzNjMsMjQzNjQsMjQzNjYsMjQzNjgsMjQzNzAsMjQzNzEsMjQzNzIsMjQzNzMsMjQzNzQsMjQzNzUsMjQzNzYsMjQzNzksMjQzODEsMjQzODIsMjQzODMsMjQzODUsMjQzODYsMjQzODcsMjQzODgsMjQzODksMjQzOTAsMjQzOTEsMjQzOTIsMjQzOTMsMjQzOTQsMjQzOTUsMjQzOTYsMjQzOTcsMjQzOTgsMjQzOTksMjQ0MDEsMjQ0MDQsMjQ0MDksMjQ0MTAsMjQ0MTEsMjQ0MTIsMjQ0MTQsMjQ0MTUsMjQ0MTYsMjQ0MTksMjQ0MjEsMjQ0MjMsMjQ0MjQsMjQ0MjcsMjQ0MzAsMjQ0MzEsMjQ0MzQsMjQ0MzYsMjQ0MzcsMjQ0MzgsMjQ0NDAsMjQ0NDIsMjQ0NDUsMjQ0NDYsMjQ0NDcsMjQ0NTEsMjQ0NTQsMjQ0NjEsMjQ0NjIsMjQ0NjMsMjQ0NjUsMjQ0NjcsMjQ0NjgsMjQ0NzAsMjQ0NzQsMjQ0NzUsMjQ0NzcsMjQ0NzgsMjQ0NzksMjQ0ODAsMjQ0ODIsMjQ0ODMsMjQ0ODQsMjQ0ODUsMjQ0ODYsMjQ0ODcsMjQ0ODksMjQ0OTEsMjQ0OTIsMjQ0OTUsMjQ0OTYsMjQ0OTcsMjQ0OTgsMjQ0OTksMjQ1MDAsMjQ1MDIsMjQ1MDQsMjQ1MDUsMjQ1MDYsMjQ1MDcsMjQ1MTAsMjQ1MTEsMjQ1MTIsMjQ1MTMsMjQ1MTQsMjQ1MTksMjQ1MjAsMjQ1MjIsMjQ1MjMsMjQ1MjYsMjQ1MzEsMjQ1MzIsMjQ1MzMsMjQ1MzgsMjQ1MzksMjQ1NDAsMjQ1NDIsMjQ1NDMsMjQ1NDYsMjQ1NDcsMjQ1NDksMjQ1NTAsMjQ1NTIsMjQ1NTMsMjQ1NTYsMjQ1NTksMjQ1NjAsMjQ1NjIsMjQ1NjMsMjQ1NjQsMjQ1NjYsMjQ1NjcsMjQ1NjksMjQ1NzAsMjQ1NzIsMjQ1ODMsMjQ1ODQsMjQ1ODUsMjQ1ODcsMjQ1ODgsMjQ1OTIsMjQ1OTMsMjQ1OTUsMjQ1OTksMjQ2MDAsMjQ2MDIsMjQ2MDYsMjQ2MDcsMjQ2MTAsMjQ2MTEsMjQ2MTIsMjQ2MjAsMjQ2MjEsMjQ2MjIsMjQ2MjQsMjQ2MjUsMjQ2MjYsMjQ2MjcsMjQ2MjgsMjQ2MzAsMjQ2MzEsMjQ2MzIsMjQ2MzMsMjQ2MzQsMjQ2MzcsMjQ2MzgsMjQ2NDAsMjQ2NDQsMjQ2NDUsMjQ2NDYsMjQ2NDcsMjQ2NDgsMjQ2NDksMjQ2NTAsMjQ2NTIsMjQ2NTQsMjQ2NTUsMjQ2NTcsMjQ2NTksMjQ2NjAsMjQ2NjIsMjQ2NjMsMjQ2NjQsMjQ2NjcsMjQ2NjgsMjQ2NzAsMjQ2NzEsMjQ2NzIsMjQ2NzMsMjQ2NzcsMjQ2NzgsMjQ2ODYsMjQ2ODksMjQ2OTAsMjQ2OTIsMjQ2OTMsMjQ2OTUsMjQ3MDIsMjQ3MDQsMjQ3MDUsMjQ3MDYsMjQ3MDksMjQ3MTAsMjQ3MTEsMjQ3MTIsMjQ3MTQsMjQ3MTUsMjQ3MTgsMjQ3MTksMjQ3MjAsMjQ3MjEsMjQ3MjMsMjQ3MjUsMjQ3MjcsMjQ3MjgsMjQ3MjksMjQ3MzIsMjQ3MzQsMjQ3MzcsMjQ3MzgsMjQ3NDAsMjQ3NDEsMjQ3NDMsMjQ3NDUsMjQ3NDYsMjQ3NTAsMjQ3NTIsMjQ3NTUsMjQ3NTcsMjQ3NTgsMjQ3NTksMjQ3NjEsMjQ3NjIsMjQ3NjUsMjQ3NjYsMjQ3NjcsMjQ3NjgsMjQ3NjksMjQ3NzAsMjQ3NzEsMjQ3NzIsMjQ3NzUsMjQ3NzYsMjQ3NzcsMjQ3ODAsMjQ3ODEsMjQ3ODIsMjQ3ODMsMjQ3ODQsMjQ3ODYsMjQ3ODcsMjQ3ODgsMjQ3OTAsMjQ3OTEsMjQ3OTMsMjQ3OTUsMjQ3OTgsMjQ4MDEsMjQ4MDIsMjQ4MDMsMjQ4MDQsMjQ4MDUsMjQ4MTAsMjQ4MTcsMjQ4MTgsMjQ4MjEsMjQ4MjMsMjQ4MjQsMjQ4MjcsMjQ4MjgsMjQ4MjksMjQ4MzAsMjQ4MzEsMjQ4MzQsMjQ4MzUsMjQ4MzYsMjQ4MzcsMjQ4MzksMjQ4NDIsMjQ4NDMsMjQ4NDQsMjQ4NDgsMjQ4NDksMjQ4NTAsMjQ4NTEsMjQ4NTIsMjQ4NTQsMjQ4NTUsMjQ4NTYsMjQ4NTcsMjQ4NTksMjQ4NjAsMjQ4NjEsMjQ4NjIsMjQ4NjUsMjQ4NjYsMjQ4NjksMjQ4NzIsMjQ4NzMsMjQ4NzQsMjQ4NzYsMjQ4NzcsMjQ4NzgsMjQ4NzksMjQ4ODAsMjQ4ODEsMjQ4ODIsMjQ4ODMsMjQ4ODQsMjQ4ODUsMjQ4ODYsMjQ4ODcsMjQ4ODgsMjQ4ODksMjQ4OTAsMjQ4OTEsMjQ4OTIsMjQ4OTMsMjQ4OTQsMjQ4OTYsMjQ4OTcsMjQ4OTgsMjQ4OTksMjQ5MDAsMjQ5MDEsMjQ5MDIsMjQ5MDMsMjQ5MDUsMjQ5MDcsMjQ5MDksMjQ5MTEsMjQ5MTIsMjQ5MTQsMjQ5MTUsMjQ5MTYsMjQ5MTgsMjQ5MTksMjQ5MjAsMjQ5MjEsMjQ5MjIsMjQ5MjMsMjQ5MjQsMjQ5MjYsMjQ5MjcsMjQ5MjgsMjQ5MjksMjQ5MzEsMjQ5MzIsMjQ5MzMsMjQ5MzQsMjQ5MzcsMjQ5MzgsMjQ5MzksMjQ5NDAsMjQ5NDEsMjQ5NDIsMjQ5NDMsMjQ5NDUsMjQ5NDYsMjQ5NDcsMjQ5NDgsMjQ5NTAsMjQ5NTIsMjQ5NTMsMjQ5NTQsMjQ5NTUsMjQ5NTYsMjQ5NTcsMjQ5NTgsMjQ5NTksMjQ5NjAsMjQ5NjEsMjQ5NjIsMjQ5NjMsMjQ5NjQsMjQ5NjUsMjQ5NjYsMjQ5NjcsMjQ5NjgsMjQ5NjksMjQ5NzAsMjQ5NzIsMjQ5NzMsMjQ5NzUsMjQ5NzYsMjQ5NzcsMjQ5NzgsMjQ5NzksMjQ5ODEsMjQ5ODIsMjQ5ODMsMjQ5ODQsMjQ5ODUsMjQ5ODYsMjQ5ODcsMjQ5ODgsMjQ5OTAsMjQ5OTEsMjQ5OTIsMjQ5OTMsMjQ5OTQsMjQ5OTUsMjQ5OTYsMjQ5OTcsMjQ5OTgsMjUwMDIsMjUwMDMsMjUwMDUsMjUwMDYsMjUwMDcsMjUwMDgsMjUwMDksMjUwMTAsMjUwMTEsMjUwMTIsMjUwMTMsMjUwMTQsMjUwMTYsMjUwMTcsMjUwMTgsMjUwMTksMjUwMjAsMjUwMjEsMjUwMjMsMjUwMjQsMjUwMjUsMjUwMjcsMjUwMjgsMjUwMjksMjUwMzAsMjUwMzEsMjUwMzMsMjUwMzYsMjUwMzcsMjUwMzgsMjUwMzksMjUwNDAsMjUwNDMsMjUwNDUsMjUwNDYsMjUwNDcsMjUwNDgsMjUwNDksMjUwNTAsMjUwNTEsMjUwNTIsMjUwNTMsMjUwNTQsMjUwNTUsMjUwNTYsMjUwNTcsMjUwNTgsMjUwNTksMjUwNjAsMjUwNjEsMjUwNjMsMjUwNjQsMjUwNjUsMjUwNjYsMjUwNjcsMjUwNjgsMjUwNjksMjUwNzAsMjUwNzEsMjUwNzIsMjUwNzMsMjUwNzQsMjUwNzUsMjUwNzYsMjUwNzgsMjUwNzksMjUwODAsMjUwODEsMjUwODIsMjUwODMsMjUwODQsMjUwODUsMjUwODYsMjUwODgsMjUwODksMjUwOTAsMjUwOTEsMjUwOTIsMjUwOTMsMjUwOTUsMjUwOTcsMjUxMDcsMjUxMDgsMjUxMTMsMjUxMTYsMjUxMTcsMjUxMTgsMjUxMjAsMjUxMjMsMjUxMjYsMjUxMjcsMjUxMjgsMjUxMjksMjUxMzEsMjUxMzMsMjUxMzUsMjUxMzYsMjUxMzcsMjUxMzgsMjUxNDEsMjUxNDIsMjUxNDQsMjUxNDUsMjUxNDYsMjUxNDcsMjUxNDgsMjUxNTQsMjUxNTYsMjUxNTcsMjUxNTgsMjUxNjIsMjUxNjcsMjUxNjgsMjUxNzMsMjUxNzQsMjUxNzUsMjUxNzcsMjUxNzgsMjUxODAsMjUxODEsMjUxODIsMjUxODMsMjUxODQsMjUxODUsMjUxODYsMjUxODgsMjUxODksMjUxOTIsMjUyMDEsMjUyMDIsMjUyMDQsMjUyMDUsMjUyMDcsMjUyMDgsMjUyMTAsMjUyMTEsMjUyMTMsMjUyMTcsMjUyMTgsMjUyMTksMjUyMjEsMjUyMjIsMjUyMjMsMjUyMjQsMjUyMjcsMjUyMjgsMjUyMjksMjUyMzAsMjUyMzEsMjUyMzIsMjUyMzYsMjUyNDEsMjUyNDQsMjUyNDUsMjUyNDYsMjUyNTEsMjUyNTQsMjUyNTUsMjUyNTcsMjUyNTgsMjUyNjEsMjUyNjIsMjUyNjMsMjUyNjQsMjUyNjYsMjUyNjcsMjUyNjgsMjUyNzAsMjUyNzEsMjUyNzIsMjUyNzQsMjUyNzgsMjUyODAsMjUyODEsMjUyODMsMjUyOTEsMjUyOTUsMjUyOTcsMjUzMDEsMjUzMDksMjUzMTAsMjUzMTIsMjUzMTMsMjUzMTYsMjUzMjIsMjUzMjMsMjUzMjgsMjUzMzAsMjUzMzMsMjUzMzYsMjUzMzcsMjUzMzgsMjUzMzksMjUzNDQsMjUzNDcsMjUzNDgsMjUzNDksMjUzNTAsMjUzNTQsMjUzNTUsMjUzNTYsMjUzNTcsMjUzNTksMjUzNjAsMjUzNjIsMjUzNjMsMjUzNjQsMjUzNjUsMjUzNjcsMjUzNjgsMjUzNjksMjUzNzIsMjUzODIsMjUzODMsMjUzODUsMjUzODgsMjUzODksMjUzOTAsMjUzOTIsMjUzOTMsMjUzOTUsMjUzOTYsMjUzOTcsMjUzOTgsMjUzOTksMjU0MDAsMjU0MDMsMjU0MDQsMjU0MDYsMjU0MDcsMjU0MDgsMjU0MDksMjU0MTIsMjU0MTUsMjU0MTYsMjU0MTgsMjU0MjUsMjU0MjYsMjU0MjcsMjU0MjgsMjU0MzAsMjU0MzEsMjU0MzIsMjU0MzMsMjU0MzQsMjU0MzUsMjU0MzYsMjU0MzcsMjU0NDAsMjU0NDQsMjU0NDUsMjU0NDYsMjU0NDgsMjU0NTAsMjU0NTEsMjU0NTIsMjU0NTUsMjU0NTYsMjU0NTgsMjU0NTksMjU0NjAsMjU0NjEsMjU0NjQsMjU0NjUsMjU0NjgsMjU0NjksMjU0NzAsMjU0NzEsMjU0NzMsMjU0NzUsMjU0NzYsMjU0NzcsMjU0NzgsMjU0ODMsMjU0ODUsMjU0ODksMjU0OTEsMjU0OTIsMjU0OTMsMjU0OTUsMjU0OTcsMjU0OTgsMjU0OTksMjU1MDAsMjU1MDEsMjU1MDIsMjU1MDMsMjU1MDUsMjU1MDgsMjU1MTAsMjU1MTUsMjU1MTksMjU1MjEsMjU1MjIsMjU1MjUsMjU1MjYsMjU1MjksMjU1MzEsMjU1MzMsMjU1MzUsMjU1MzYsMjU1MzcsMjU1MzgsMjU1MzksMjU1NDEsMjU1NDMsMjU1NDQsMjU1NDYsMjU1NDcsMjU1NDgsMjU1NTMsMjU1NTUsMjU1NTYsMjU1NTcsMjU1NTksMjU1NjAsMjU1NjEsMjU1NjIsMjU1NjMsMjU1NjQsMjU1NjUsMjU1NjcsMjU1NzAsMjU1NzIsMjU1NzMsMjU1NzQsMjU1NzUsMjU1NzYsMjU1NzksMjU1ODAsMjU1ODIsMjU1ODMsMjU1ODQsMjU1ODUsMjU1ODcsMjU1ODksMjU1OTEsMjU1OTMsMjU1OTQsMjU1OTUsMjU1OTYsMjU1OTgsMjU2MDMsMjU2MDQsMjU2MDYsMjU2MDcsMjU2MDgsMjU2MDksMjU2MTAsMjU2MTMsMjU2MTQsMjU2MTcsMjU2MTgsMjU2MjEsMjU2MjIsMjU2MjMsMjU2MjQsMjU2MjUsMjU2MjYsMjU2MjksMjU2MzEsMjU2MzQsMjU2MzUsMjU2MzYsMjU2MzcsMjU2MzksMjU2NDAsMjU2NDEsMjU2NDMsMjU2NDYsMjU2NDcsMjU2NDgsMjU2NDksMjU2NTAsMjU2NTEsMjU2NTMsMjU2NTQsMjU2NTUsMjU2NTYsMjU2NTcsMjU2NTksMjU2NjAsMjU2NjIsMjU2NjQsMjU2NjYsMjU2NjcsMjU2NzMsMjU2NzUsMjU2NzYsMjU2NzcsMjU2NzgsMjU2NzksMjU2ODAsMjU2ODEsMjU2ODMsMjU2ODUsMjU2ODYsMjU2ODcsMjU2ODksMjU2OTAsMjU2OTEsMjU2OTIsMjU2OTMsMjU2OTUsMjU2OTYsMjU2OTcsMjU2OTgsMjU2OTksMjU3MDAsMjU3MDEsMjU3MDIsMjU3MDQsMjU3MDYsMjU3MDcsMjU3MDgsMjU3MTAsMjU3MTEsMjU3MTIsMjU3MTMsMjU3MTQsMjU3MTUsMjU3MTYsMjU3MTcsMjU3MTgsMjU3MTksMjU3MjMsMjU3MjQsMjU3MjUsMjU3MjYsMjU3MjcsMjU3MjgsMjU3MjksMjU3MzEsMjU3MzQsMjU3MzYsMjU3MzcsMjU3MzgsMjU3MzksMjU3NDAsMjU3NDEsMjU3NDIsMjU3NDMsMjU3NDQsMjU3NDcsMjU3NDgsMjU3NTEsMjU3NTIsMjU3NTQsMjU3NTUsMjU3NTYsMjU3NTcsMjU3NTksMjU3NjAsMjU3NjEsMjU3NjIsMjU3NjMsMjU3NjUsMjU3NjYsMjU3NjcsMjU3NjgsMjU3NzAsMjU3NzEsMjU3NzUsMjU3NzcsMjU3NzgsMjU3NzksMjU3ODAsMjU3ODIsMjU3ODUsMjU3ODcsMjU3ODksMjU3OTAsMjU3OTEsMjU3OTMsMjU3OTUsMjU3OTYsMjU3OTgsMjU3OTksMjU4MDAsMjU4MDEsMjU4MDIsMjU4MDMsMjU4MDQsMjU4MDcsMjU4MDksMjU4MTEsMjU4MTIsMjU4MTMsMjU4MTQsMjU4MTcsMjU4MTgsMjU4MTksMjU4MjAsMjU4MjEsMjU4MjMsMjU4MjQsMjU4MjUsMjU4MjcsMjU4MjksMjU4MzEsMjU4MzIsMjU4MzMsMjU4MzQsMjU4MzUsMjU4MzYsMjU4MzcsMjU4MzgsMjU4MzksMjU4NDAsMjU4NDEsMjU4NDIsMjU4NDMsMjU4NDQsMjU4NDUsMjU4NDYsMjU4NDcsMjU4NDgsMjU4NDksMjU4NTAsMjU4NTEsMjU4NTIsMjU4NTMsMjU4NTQsMjU4NTUsMjU4NTcsMjU4NTgsMjU4NTksMjU4NjAsMjU4NjEsMjU4NjIsMjU4NjMsMjU4NjQsMjU4NjYsMjU4NjcsMjU4NjgsMjU4NjksMjU4NzAsMjU4NzEsMjU4NzIsMjU4NzMsMjU4NzUsMjU4NzYsMjU4NzcsMjU4NzgsMjU4NzksMjU4ODEsMjU4ODIsMjU4ODMsMjU4ODQsMjU4ODUsMjU4ODYsMjU4ODcsMjU4ODgsMjU4ODksMjU4OTAsMjU4OTEsMjU4OTIsMjU4OTQsMjU4OTUsMjU4OTYsMjU4OTcsMjU4OTgsMjU5MDAsMjU5MDEsMjU5MDQsMjU5MDUsMjU5MDYsMjU5MDcsMjU5MTEsMjU5MTQsMjU5MTYsMjU5MTcsMjU5MjAsMjU5MjEsMjU5MjIsMjU5MjMsMjU5MjQsMjU5MjYsMjU5MjcsMjU5MzAsMjU5MzEsMjU5MzMsMjU5MzQsMjU5MzYsMjU5MzgsMjU5MzksMjU5NDAsMjU5NDMsMjU5NDQsMjU5NDYsMjU5NDgsMjU5NTEsMjU5NTIsMjU5NTMsMjU5NTYsMjU5NTcsMjU5NTksMjU5NjAsMjU5NjEsMjU5NjIsMjU5NjUsMjU5NjYsMjU5NjcsMjU5NjksMjU5NzEsMjU5NzMsMjU5NzQsMjU5NzYsMjU5NzcsMjU5NzgsMjU5NzksMjU5ODAsMjU5ODEsMjU5ODIsMjU5ODMsMjU5ODQsMjU5ODUsMjU5ODYsMjU5ODcsMjU5ODgsMjU5ODksMjU5OTAsMjU5OTIsMjU5OTMsMjU5OTQsMjU5OTcsMjU5OTgsMjU5OTksMjYwMDIsMjYwMDQsMjYwMDUsMjYwMDYsMjYwMDgsMjYwMTAsMjYwMTMsMjYwMTQsMjYwMTYsMjYwMTgsMjYwMTksMjYwMjIsMjYwMjQsMjYwMjYsMjYwMjgsMjYwMzAsMjYwMzMsMjYwMzQsMjYwMzUsMjYwMzYsMjYwMzcsMjYwMzgsMjYwMzksMjYwNDAsMjYwNDIsMjYwNDMsMjYwNDYsMjYwNDcsMjYwNDgsMjYwNTAsMjYwNTUsMjYwNTYsMjYwNTcsMjYwNTgsMjYwNjEsMjYwNjQsMjYwNjUsMjYwNjcsMjYwNjgsMjYwNjksMjYwNzIsMjYwNzMsMjYwNzQsMjYwNzUsMjYwNzYsMjYwNzcsMjYwNzgsMjYwNzksMjYwODEsMjYwODMsMjYwODQsMjYwOTAsMjYwOTEsMjYwOTgsMjYwOTksMjYxMDAsMjYxMDEsMjYxMDQsMjYxMDUsMjYxMDcsMjYxMDgsMjYxMDksMjYxMTAsMjYxMTEsMjYxMTMsMjYxMTYsMjYxMTcsMjYxMTksMjYxMjAsMjYxMjEsMjYxMjMsMjYxMjUsMjYxMjgsMjYxMjksMjYxMzAsMjYxMzQsMjYxMzUsMjYxMzYsMjYxMzgsMjYxMzksMjYxNDAsMjYxNDIsMjYxNDUsMjYxNDYsMjYxNDcsMjYxNDgsMjYxNTAsMjYxNTMsMjYxNTQsMjYxNTUsMjYxNTYsMjYxNTgsMjYxNjAsMjYxNjIsMjYxNjMsMjYxNjcsMjYxNjgsMjYxNjksMjYxNzAsMjYxNzEsMjYxNzMsMjYxNzUsMjYxNzYsMjYxNzgsMjYxODAsMjYxODEsMjYxODIsMjYxODMsMjYxODQsMjYxODUsMjYxODYsMjYxODksMjYxOTAsMjYxOTIsMjYxOTMsMjYyMDAsMjYyMDEsMjYyMDMsMjYyMDQsMjYyMDUsMjYyMDYsMjYyMDgsMjYyMTAsMjYyMTEsMjYyMTMsMjYyMTUsMjYyMTcsMjYyMTgsMjYyMTksMjYyMjAsMjYyMjEsMjYyMjUsMjYyMjYsMjYyMjcsMjYyMjksMjYyMzIsMjYyMzMsMjYyMzUsMjYyMzYsMjYyMzcsMjYyMzksMjYyNDAsMjYyNDEsMjYyNDMsMjYyNDUsMjYyNDYsMjYyNDgsMjYyNDksMjYyNTAsMjYyNTEsMjYyNTMsMjYyNTQsMjYyNTUsMjYyNTYsMjYyNTgsMjYyNTksMjYyNjAsMjYyNjEsMjYyNjQsMjYyNjUsMjYyNjYsMjYyNjcsMjYyNjgsMjYyNzAsMjYyNzEsMjYyNzIsMjYyNzMsMjYyNzQsMjYyNzUsMjYyNzYsMjYyNzcsMjYyNzgsMjYyODEsMjYyODIsMjYyODMsMjYyODQsMjYyODUsMjYyODcsMjYyODgsMjYyODksMjYyOTAsMjYyOTEsMjYyOTMsMjYyOTQsMjYyOTUsMjYyOTYsMjYyOTgsMjYyOTksMjYzMDAsMjYzMDEsMjYzMDMsMjYzMDQsMjYzMDUsMjYzMDYsMjYzMDcsMjYzMDgsMjYzMDksMjYzMTAsMjYzMTEsMjYzMTIsMjYzMTMsMjYzMTQsMjYzMTUsMjYzMTYsMjYzMTcsMjYzMTgsMjYzMTksMjYzMjAsMjYzMjEsMjYzMjIsMjYzMjMsMjYzMjQsMjYzMjUsMjYzMjYsMjYzMjcsMjYzMjgsMjYzMzAsMjYzMzQsMjYzMzUsMjYzMzYsMjYzMzcsMjYzMzgsMjYzMzksMjYzNDAsMjYzNDEsMjYzNDMsMjYzNDQsMjYzNDYsMjYzNDcsMjYzNDgsMjYzNDksMjYzNTAsMjYzNTEsMjYzNTMsMjYzNTcsMjYzNTgsMjYzNjAsMjYzNjIsMjYzNjMsMjYzNjUsMjYzNjksMjYzNzAsMjYzNzEsMjYzNzIsMjYzNzMsMjYzNzQsMjYzNzUsMjYzODAsMjYzODIsMjYzODMsMjYzODUsMjYzODYsMjYzODcsMjYzOTAsMjYzOTIsMjYzOTMsMjYzOTQsMjYzOTYsMjYzOTgsMjY0MDAsMjY0MDEsMjY0MDIsMjY0MDMsMjY0MDQsMjY0MDUsMjY0MDcsMjY0MDksMjY0MTQsMjY0MTYsMjY0MTgsMjY0MTksMjY0MjIsMjY0MjMsMjY0MjQsMjY0MjUsMjY0MjcsMjY0MjgsMjY0MzAsMjY0MzEsMjY0MzMsMjY0MzYsMjY0MzcsMjY0MzksMjY0NDIsMjY0NDMsMjY0NDUsMjY0NTAsMjY0NTIsMjY0NTMsMjY0NTUsMjY0NTYsMjY0NTcsMjY0NTgsMjY0NTksMjY0NjEsMjY0NjYsMjY0NjcsMjY0NjgsMjY0NzAsMjY0NzEsMjY0NzUsMjY0NzYsMjY0NzgsMjY0ODEsMjY0ODQsMjY0ODYsMjY0ODgsMjY0ODksMjY0OTAsMjY0OTEsMjY0OTMsMjY0OTYsMjY0OTgsMjY0OTksMjY1MDEsMjY1MDIsMjY1MDQsMjY1MDYsMjY1MDgsMjY1MDksMjY1MTAsMjY1MTEsMjY1MTMsMjY1MTQsMjY1MTUsMjY1MTYsMjY1MTgsMjY1MjEsMjY1MjMsMjY1MjcsMjY1MjgsMjY1MjksMjY1MzIsMjY1MzQsMjY1MzcsMjY1NDAsMjY1NDIsMjY1NDUsMjY1NDYsMjY1NDgsMjY1NTMsMjY1NTQsMjY1NTUsMjY1NTYsMjY1NTcsMjY1NTgsMjY1NTksMjY1NjAsMjY1NjIsMjY1NjUsMjY1NjYsMjY1NjcsMjY1NjgsMjY1NjksMjY1NzAsMjY1NzEsMjY1NzIsMjY1NzMsMjY1NzQsMjY1ODEsMjY1ODIsMjY1ODMsMjY1ODcsMjY1OTEsMjY1OTMsMjY1OTUsMjY1OTYsMjY1OTgsMjY1OTksMjY2MDAsMjY2MDIsMjY2MDMsMjY2MDUsMjY2MDYsMjY2MTAsMjY2MTMsMjY2MTQsMjY2MTUsMjY2MTYsMjY2MTcsMjY2MTgsMjY2MTksMjY2MjAsMjY2MjIsMjY2MjUsMjY2MjYsMjY2MjcsMjY2MjgsMjY2MzAsMjY2MzcsMjY2NDAsMjY2NDIsMjY2NDQsMjY2NDUsMjY2NDgsMjY2NDksMjY2NTAsMjY2NTEsMjY2NTIsMjY2NTQsMjY2NTUsMjY2NTYsMjY2NTgsMjY2NTksMjY2NjAsMjY2NjEsMjY2NjIsMjY2NjMsMjY2NjQsMjY2NjcsMjY2NjgsMjY2NjksMjY2NzAsMjY2NzEsMjY2NzIsMjY2NzMsMjY2NzYsMjY2NzcsMjY2NzgsMjY2ODIsMjY2ODMsMjY2ODcsMjY2OTUsMjY2OTksMjY3MDEsMjY3MDMsMjY3MDYsMjY3MTAsMjY3MTEsMjY3MTIsMjY3MTMsMjY3MTQsMjY3MTUsMjY3MTYsMjY3MTcsMjY3MTgsMjY3MTksMjY3MzAsMjY3MzIsMjY3MzMsMjY3MzQsMjY3MzUsMjY3MzYsMjY3MzcsMjY3MzgsMjY3MzksMjY3NDEsMjY3NDQsMjY3NDUsMjY3NDYsMjY3NDcsMjY3NDgsMjY3NDksMjY3NTAsMjY3NTEsMjY3NTIsMjY3NTQsMjY3NTYsMjY3NTksMjY3NjAsMjY3NjEsMjY3NjIsMjY3NjMsMjY3NjQsMjY3NjUsMjY3NjYsMjY3NjgsMjY3NjksMjY3NzAsMjY3NzIsMjY3NzMsMjY3NzQsMjY3NzYsMjY3NzcsMjY3NzgsMjY3NzksMjY3ODAsMjY3ODEsMjY3ODIsMjY3ODMsMjY3ODQsMjY3ODUsMjY3ODcsMjY3ODgsMjY3ODksMjY3OTMsMjY3OTQsMjY3OTUsMjY3OTYsMjY3OTgsMjY4MDEsMjY4MDIsMjY4MDQsMjY4MDYsMjY4MDcsMjY4MDgsMjY4MDksMjY4MTAsMjY4MTEsMjY4MTIsMjY4MTMsMjY4MTQsMjY4MTUsMjY4MTcsMjY4MTksMjY4MjAsMjY4MjEsMjY4MjIsMjY4MjMsMjY4MjQsMjY4MjYsMjY4MjgsMjY4MzAsMjY4MzEsMjY4MzIsMjY4MzMsMjY4MzUsMjY4MzYsMjY4MzgsMjY4MzksMjY4NDEsMjY4NDMsMjY4NDQsMjY4NDUsMjY4NDYsMjY4NDcsMjY4NDksMjY4NTAsMjY4NTIsMjY4NTMsMjY4NTQsMjY4NTUsMjY4NTYsMjY4NTcsMjY4NTgsMjY4NTksMjY4NjAsMjY4NjEsMjY4NjMsMjY4NjYsMjY4NjcsMjY4NjgsMjY4NzAsMjY4NzEsMjY4NzIsMjY4NzUsMjY4NzcsMjY4NzgsMjY4NzksMjY4ODAsMjY4ODIsMjY4ODMsMjY4ODQsMjY4ODYsMjY4ODcsMjY4ODgsMjY4ODksMjY4OTAsMjY4OTIsMjY4OTUsMjY4OTcsMjY4OTksMjY5MDAsMjY5MDEsMjY5MDIsMjY5MDMsMjY5MDQsMjY5MDUsMjY5MDYsMjY5MDcsMjY5MDgsMjY5MDksMjY5MTAsMjY5MTMsMjY5MTQsMjY5MTUsMjY5MTcsMjY5MTgsMjY5MTksMjY5MjAsMjY5MjEsMjY5MjIsMjY5MjMsMjY5MjQsMjY5MjYsMjY5MjcsMjY5MjksMjY5MzAsMjY5MzEsMjY5MzMsMjY5MzQsMjY5MzUsMjY5MzYsMjY5MzgsMjY5MzksMjY5NDAsMjY5NDIsMjY5NDQsMjY5NDUsMjY5NDcsMjY5NDgsMjY5NDksMjY5NTAsMjY5NTEsMjY5NTIsMjY5NTMsMjY5NTQsMjY5NTUsMjY5NTYsMjY5NTcsMjY5NTgsMjY5NTksMjY5NjAsMjY5NjEsMjY5NjIsMjY5NjMsMjY5NjUsMjY5NjYsMjY5NjgsMjY5NjksMjY5NzEsMjY5NzIsMjY5NzUsMjY5NzcsMjY5NzgsMjY5ODAsMjY5ODEsMjY5ODMsMjY5ODQsMjY5ODUsMjY5ODYsMjY5ODgsMjY5ODksMjY5OTEsMjY5OTIsMjY5OTQsMjY5OTUsMjY5OTYsMjY5OTcsMjY5OTgsMjcwMDIsMjcwMDMsMjcwMDUsMjcwMDYsMjcwMDcsMjcwMDksMjcwMTEsMjcwMTMsMjcwMTgsMjcwMTksMjcwMjAsMjcwMjIsMjcwMjMsMjcwMjQsMjcwMjUsMjcwMjYsMjcwMjcsMjcwMzAsMjcwMzEsMjcwMzMsMjcwMzQsMjcwMzcsMjcwMzgsMjcwMzksMjcwNDAsMjcwNDEsMjcwNDIsMjcwNDMsMjcwNDQsMjcwNDUsMjcwNDYsMjcwNDksMjcwNTAsMjcwNTIsMjcwNTQsMjcwNTUsMjcwNTYsMjcwNTgsMjcwNTksMjcwNjEsMjcwNjIsMjcwNjQsMjcwNjUsMjcwNjYsMjcwNjgsMjcwNjksMjcwNzAsMjcwNzEsMjcwNzIsMjcwNzQsMjcwNzUsMjcwNzYsMjcwNzcsMjcwNzgsMjcwNzksMjcwODAsMjcwODEsMjcwODMsMjcwODUsMjcwODcsMjcwODksMjcwOTAsMjcwOTEsMjcwOTMsMjcwOTQsMjcwOTUsMjcwOTYsMjcwOTcsMjcwOTgsMjcxMDAsMjcxMDEsMjcxMDIsMjcxMDUsMjcxMDYsMjcxMDcsMjcxMDgsMjcxMDksMjcxMTAsMjcxMTEsMjcxMTIsMjcxMTMsMjcxMTQsMjcxMTUsMjcxMTYsMjcxMTgsMjcxMTksMjcxMjAsMjcxMjEsMjcxMjMsMjcxMjQsMjcxMjUsMjcxMjYsMjcxMjcsMjcxMjgsMjcxMjksMjcxMzAsMjcxMzEsMjcxMzIsMjcxMzQsMjcxMzYsMjcxMzcsMjcxMzgsMjcxMzksMjcxNDAsMjcxNDEsMjcxNDIsMjcxNDMsMjcxNDQsMjcxNDUsMjcxNDcsMjcxNDgsMjcxNDksMjcxNTAsMjcxNTEsMjcxNTIsMjcxNTMsMjcxNTQsMjcxNTUsMjcxNTYsMjcxNTcsMjcxNTgsMjcxNjEsMjcxNjIsMjcxNjMsMjcxNjQsMjcxNjUsMjcxNjYsMjcxNjgsMjcxNzAsMjcxNzEsMjcxNzIsMjcxNzMsMjcxNzQsMjcxNzUsMjcxNzcsMjcxNzksMjcxODAsMjcxODEsMjcxODIsMjcxODQsMjcxODYsMjcxODcsMjcxODgsMjcxOTAsMjcxOTEsMjcxOTIsMjcxOTMsMjcxOTQsMjcxOTUsMjcxOTYsMjcxOTksMjcyMDAsMjcyMDEsMjcyMDIsMjcyMDMsMjcyMDUsMjcyMDYsMjcyMDgsMjcyMDksMjcyMTAsMjcyMTEsMjcyMTIsMjcyMTMsMjcyMTQsMjcyMTUsMjcyMTcsMjcyMTgsMjcyMTksMjcyMjAsMjcyMjEsMjcyMjIsMjcyMjMsMjcyMjYsMjcyMjgsMjcyMjksMjcyMzAsMjcyMzEsMjcyMzIsMjcyMzQsMjcyMzUsMjcyMzYsMjcyMzgsMjcyMzksMjcyNDAsMjcyNDEsMjcyNDIsMjcyNDMsMjcyNDQsMjcyNDUsMjcyNDYsMjcyNDcsMjcyNDgsMjcyNTAsMjcyNTEsMjcyNTIsMjcyNTMsMjcyNTQsMjcyNTUsMjcyNTYsMjcyNTgsMjcyNTksMjcyNjEsMjcyNjIsMjcyNjMsMjcyNjUsMjcyNjYsMjcyNjcsMjcyNjksMjcyNzAsMjcyNzEsMjcyNzIsMjcyNzMsMjcyNzQsMjcyNzUsMjcyNzYsMjcyNzcsMjcyNzksMjcyODIsMjcyODMsMjcyODQsMjcyODUsMjcyODYsMjcyODgsMjcyODksMjcyOTAsMjcyOTEsMjcyOTIsMjcyOTMsMjcyOTQsMjcyOTUsMjcyOTcsMjcyOTgsMjcyOTksMjczMDAsMjczMDEsMjczMDIsMjczMDMsMjczMDQsMjczMDYsMjczMDksMjczMTAsMjczMTEsMjczMTIsMjczMTMsMjczMTQsMjczMTUsMjczMTYsMjczMTcsMjczMTgsMjczMTksMjczMjAsMjczMjEsMjczMjIsMjczMjMsMjczMjQsMjczMjUsMjczMjYsMjczMjcsMjczMjgsMjczMjksMjczMzAsMjczMzEsMjczMzIsMjczMzMsMjczMzQsMjczMzUsMjczMzYsMjczMzcsMjczMzgsMjczMzksMjczNDAsMjczNDEsMjczNDIsMjczNDMsMjczNDQsMjczNDUsMjczNDYsMjczNDcsMjczNDgsMjczNDksMjczNTAsMjczNTEsMjczNTIsMjczNTMsMjczNTQsMjczNTUsMjczNTYsMjczNTcsMjczNTgsMjczNTksMjczNjAsMjczNjEsMjczNjIsMjczNjMsMjczNjQsMjczNjUsMjczNjYsMjczNjcsMjczNjgsMjczNjksMjczNzAsMjczNzEsMjczNzIsMjczNzMsMjczNzQsMjczNzUsMjczNzYsMjczNzcsMjczNzgsMjczNzksMjczODAsMjczODEsMjczODIsMjczODMsMjczODQsMjczODUsMjczODYsMjczODcsMjczODgsMjczODksMjczOTAsMjczOTEsMjczOTIsMjczOTMsMjczOTQsMjczOTUsMjczOTYsMjczOTcsMjczOTgsMjczOTksMjc0MDAsMjc0MDEsMjc0MDIsMjc0MDMsMjc0MDQsMjc0MDUsMjc0MDYsMjc0MDcsMjc0MDgsMjc0MDksMjc0MTAsMjc0MTEsMjc0MTIsMjc0MTMsMjc0MTQsMjc0MTUsMjc0MTYsMjc0MTcsMjc0MTgsMjc0MTksMjc0MjAsMjc0MjEsMjc0MjIsMjc0MjMsMjc0MjksMjc0MzAsMjc0MzIsMjc0MzMsMjc0MzQsMjc0MzUsMjc0MzYsMjc0MzcsMjc0MzgsMjc0MzksMjc0NDAsMjc0NDEsMjc0NDMsMjc0NDQsMjc0NDUsMjc0NDYsMjc0NDgsMjc0NTEsMjc0NTIsMjc0NTMsMjc0NTUsMjc0NTYsMjc0NTcsMjc0NTgsMjc0NjAsMjc0NjEsMjc0NjQsMjc0NjYsMjc0NjcsMjc0NjksMjc0NzAsMjc0NzEsMjc0NzIsMjc0NzMsMjc0NzQsMjc0NzUsMjc0NzYsMjc0NzcsMjc0NzgsMjc0NzksMjc0ODAsMjc0ODIsMjc0ODMsMjc0ODQsMjc0ODUsMjc0ODYsMjc0ODcsMjc0ODgsMjc0ODksMjc0OTYsMjc0OTcsMjc0OTksMjc1MDAsMjc1MDEsMjc1MDIsMjc1MDMsMjc1MDQsMjc1MDUsMjc1MDYsMjc1MDcsMjc1MDgsMjc1MDksMjc1MTAsMjc1MTEsMjc1MTIsMjc1MTQsMjc1MTcsMjc1MTgsMjc1MTksMjc1MjAsMjc1MjUsMjc1MjgsMjc1MzIsMjc1MzQsMjc1MzUsMjc1MzYsMjc1MzcsMjc1NDAsMjc1NDEsMjc1NDMsMjc1NDQsMjc1NDUsMjc1NDgsMjc1NDksMjc1NTAsMjc1NTEsMjc1NTIsMjc1NTQsMjc1NTUsMjc1NTYsMjc1NTcsMjc1NTgsMjc1NTksMjc1NjAsMjc1NjEsMjc1NjMsMjc1NjQsMjc1NjUsMjc1NjYsMjc1NjcsMjc1NjgsMjc1NjksMjc1NzAsMjc1NzQsMjc1NzYsMjc1NzcsMjc1NzgsMjc1NzksMjc1ODAsMjc1ODEsMjc1ODIsMjc1ODQsMjc1ODcsMjc1ODgsMjc1OTAsMjc1OTEsMjc1OTIsMjc1OTMsMjc1OTQsMjc1OTYsMjc1OTgsMjc2MDAsMjc2MDEsMjc2MDgsMjc2MTAsMjc2MTIsMjc2MTMsMjc2MTQsMjc2MTUsMjc2MTYsMjc2MTgsMjc2MTksMjc2MjAsMjc2MjEsMjc2MjIsMjc2MjMsMjc2MjQsMjc2MjUsMjc2MjgsMjc2MjksMjc2MzAsMjc2MzIsMjc2MzMsMjc2MzQsMjc2MzYsMjc2MzgsMjc2MzksMjc2NDAsMjc2NDIsMjc2NDMsMjc2NDQsMjc2NDYsMjc2NDcsMjc2NDgsMjc2NDksMjc2NTAsMjc2NTEsMjc2NTIsMjc2NTYsMjc2NTcsMjc2NTgsMjc2NTksMjc2NjAsMjc2NjIsMjc2NjYsMjc2NzEsMjc2NzYsMjc2NzcsMjc2NzgsMjc2ODAsMjc2ODMsMjc2ODUsMjc2OTEsMjc2OTIsMjc2OTMsMjc2OTcsMjc2OTksMjc3MDIsMjc3MDMsMjc3MDUsMjc3MDYsMjc3MDcsMjc3MDgsMjc3MTAsMjc3MTEsMjc3MTUsMjc3MTYsMjc3MTcsMjc3MjAsMjc3MjMsMjc3MjQsMjc3MjUsMjc3MjYsMjc3MjcsMjc3MjksMjc3MzAsMjc3MzEsMjc3MzQsMjc3MzYsMjc3MzcsMjc3MzgsMjc3NDYsMjc3NDcsMjc3NDksMjc3NTAsMjc3NTEsMjc3NTUsMjc3NTYsMjc3NTcsMjc3NTgsMjc3NTksMjc3NjEsMjc3NjMsMjc3NjUsMjc3NjcsMjc3NjgsMjc3NzAsMjc3NzEsMjc3NzIsMjc3NzUsMjc3NzYsMjc3ODAsMjc3ODMsMjc3ODYsMjc3ODcsMjc3ODksMjc3OTAsMjc3OTMsMjc3OTQsMjc3OTcsMjc3OTgsMjc3OTksMjc4MDAsMjc4MDIsMjc4MDQsMjc4MDUsMjc4MDYsMjc4MDgsMjc4MTAsMjc4MTYsMjc4MjAsMjc4MjMsMjc4MjQsMjc4MjgsMjc4MjksMjc4MzAsMjc4MzEsMjc4MzQsMjc4NDAsMjc4NDEsMjc4NDIsMjc4NDMsMjc4NDYsMjc4NDcsMjc4NDgsMjc4NTEsMjc4NTMsMjc4NTQsMjc4NTUsMjc4NTcsMjc4NTgsMjc4NjQsMjc4NjUsMjc4NjYsMjc4NjgsMjc4NjksMjc4NzEsMjc4NzYsMjc4NzgsMjc4NzksMjc4ODEsMjc4ODQsMjc4ODUsMjc4OTAsMjc4OTIsMjc4OTcsMjc5MDMsMjc5MDQsMjc5MDYsMjc5MDcsMjc5MDksMjc5MTAsMjc5MTIsMjc5MTMsMjc5MTQsMjc5MTcsMjc5MTksMjc5MjAsMjc5MjEsMjc5MjMsMjc5MjQsMjc5MjUsMjc5MjYsMjc5MjgsMjc5MzIsMjc5MzMsMjc5MzUsMjc5MzYsMjc5MzcsMjc5MzgsMjc5MzksMjc5NDAsMjc5NDIsMjc5NDQsMjc5NDUsMjc5NDgsMjc5NDksMjc5NTEsMjc5NTIsMjc5NTYsMjc5NTgsMjc5NTksMjc5NjAsMjc5NjIsMjc5NjcsMjc5NjgsMjc5NzAsMjc5NzIsMjc5NzcsMjc5ODAsMjc5ODQsMjc5ODksMjc5OTAsMjc5OTEsMjc5OTIsMjc5OTUsMjc5OTcsMjc5OTksMjgwMDEsMjgwMDIsMjgwMDQsMjgwMDUsMjgwMDcsMjgwMDgsMjgwMTEsMjgwMTIsMjgwMTMsMjgwMTYsMjgwMTcsMjgwMTgsMjgwMTksMjgwMjEsMjgwMjIsMjgwMjUsMjgwMjYsMjgwMjcsMjgwMjksMjgwMzAsMjgwMzEsMjgwMzIsMjgwMzMsMjgwMzUsMjgwMzYsMjgwMzgsMjgwMzksMjgwNDIsMjgwNDMsMjgwNDUsMjgwNDcsMjgwNDgsMjgwNTAsMjgwNTQsMjgwNTUsMjgwNTYsMjgwNTcsMjgwNTgsMjgwNjAsMjgwNjYsMjgwNjksMjgwNzYsMjgwNzcsMjgwODAsMjgwODEsMjgwODMsMjgwODQsMjgwODYsMjgwODcsMjgwODksMjgwOTAsMjgwOTEsMjgwOTIsMjgwOTMsMjgwOTQsMjgwOTcsMjgwOTgsMjgwOTksMjgxMDQsMjgxMDUsMjgxMDYsMjgxMDksMjgxMTAsMjgxMTEsMjgxMTIsMjgxMTQsMjgxMTUsMjgxMTYsMjgxMTcsMjgxMTksMjgxMjIsMjgxMjMsMjgxMjQsMjgxMjcsMjgxMzAsMjgxMzEsMjgxMzMsMjgxMzUsMjgxMzYsMjgxMzcsMjgxMzgsMjgxNDEsMjgxNDMsMjgxNDQsMjgxNDYsMjgxNDgsMjgxNDksMjgxNTAsMjgxNTIsMjgxNTQsMjgxNTcsMjgxNTgsMjgxNTksMjgxNjAsMjgxNjEsMjgxNjIsMjgxNjMsMjgxNjQsMjgxNjYsMjgxNjcsMjgxNjgsMjgxNjksMjgxNzEsMjgxNzUsMjgxNzgsMjgxNzksMjgxODEsMjgxODQsMjgxODUsMjgxODcsMjgxODgsMjgxOTAsMjgxOTEsMjgxOTQsMjgxOTgsMjgxOTksMjgyMDAsMjgyMDIsMjgyMDQsMjgyMDYsMjgyMDgsMjgyMDksMjgyMTEsMjgyMTMsMjgyMTQsMjgyMTUsMjgyMTcsMjgyMTksMjgyMjAsMjgyMjEsMjgyMjIsMjgyMjMsMjgyMjQsMjgyMjUsMjgyMjYsMjgyMjksMjgyMzAsMjgyMzEsMjgyMzIsMjgyMzMsMjgyMzQsMjgyMzUsMjgyMzYsMjgyMzksMjgyNDAsMjgyNDEsMjgyNDIsMjgyNDUsMjgyNDcsMjgyNDksMjgyNTAsMjgyNTIsMjgyNTMsMjgyNTQsMjgyNTYsMjgyNTcsMjgyNTgsMjgyNTksMjgyNjAsMjgyNjEsMjgyNjIsMjgyNjMsMjgyNjQsMjgyNjUsMjgyNjYsMjgyNjgsMjgyNjksMjgyNzEsMjgyNzIsMjgyNzMsMjgyNzQsMjgyNzUsMjgyNzYsMjgyNzcsMjgyNzgsMjgyNzksMjgyODAsMjgyODEsMjgyODIsMjgyODMsMjgyODQsMjgyODUsMjgyODgsMjgyODksMjgyOTAsMjgyOTIsMjgyOTUsMjgyOTYsMjgyOTgsMjgyOTksMjgzMDAsMjgzMDEsMjgzMDIsMjgzMDUsMjgzMDYsMjgzMDcsMjgzMDgsMjgzMDksMjgzMTAsMjgzMTEsMjgzMTMsMjgzMTQsMjgzMTUsMjgzMTcsMjgzMTgsMjgzMjAsMjgzMjEsMjgzMjMsMjgzMjQsMjgzMjYsMjgzMjgsMjgzMjksMjgzMzEsMjgzMzIsMjgzMzMsMjgzMzQsMjgzMzYsMjgzMzksMjgzNDEsMjgzNDQsMjgzNDUsMjgzNDgsMjgzNTAsMjgzNTEsMjgzNTIsMjgzNTUsMjgzNTYsMjgzNTcsMjgzNTgsMjgzNjAsMjgzNjEsMjgzNjIsMjgzNjQsMjgzNjUsMjgzNjYsMjgzNjgsMjgzNzAsMjgzNzQsMjgzNzYsMjgzNzcsMjgzNzksMjgzODAsMjgzODEsMjgzODcsMjgzOTEsMjgzOTQsMjgzOTUsMjgzOTYsMjgzOTcsMjgzOTgsMjgzOTksMjg0MDAsMjg0MDEsMjg0MDIsMjg0MDMsMjg0MDUsMjg0MDYsMjg0MDcsMjg0MDgsMjg0MTAsMjg0MTEsMjg0MTIsMjg0MTMsMjg0MTQsMjg0MTUsMjg0MTYsMjg0MTcsMjg0MTksMjg0MjAsMjg0MjEsMjg0MjMsMjg0MjQsMjg0MjYsMjg0MjcsMjg0MjgsMjg0MjksMjg0MzAsMjg0MzIsMjg0MzMsMjg0MzQsMjg0MzgsMjg0MzksMjg0NDAsMjg0NDEsMjg0NDIsMjg0NDMsMjg0NDQsMjg0NDUsMjg0NDYsMjg0NDcsMjg0NDksMjg0NTAsMjg0NTEsMjg0NTMsMjg0NTQsMjg0NTUsMjg0NTYsMjg0NjAsMjg0NjIsMjg0NjQsMjg0NjYsMjg0NjgsMjg0NjksMjg0NzEsMjg0NzIsMjg0NzMsMjg0NzQsMjg0NzUsMjg0NzYsMjg0NzcsMjg0NzksMjg0ODAsMjg0ODEsMjg0ODIsMjg0ODMsMjg0ODQsMjg0ODUsMjg0ODgsMjg0ODksMjg0OTAsMjg0OTIsMjg0OTQsMjg0OTUsMjg0OTYsMjg0OTcsMjg0OTgsMjg0OTksMjg1MDAsMjg1MDEsMjg1MDIsMjg1MDMsMjg1MDUsMjg1MDYsMjg1MDcsMjg1MDksMjg1MTEsMjg1MTIsMjg1MTMsMjg1MTUsMjg1MTYsMjg1MTcsMjg1MTksMjg1MjAsMjg1MjEsMjg1MjIsMjg1MjMsMjg1MjQsMjg1MjcsMjg1MjgsMjg1MjksMjg1MzEsMjg1MzMsMjg1MzQsMjg1MzUsMjg1MzcsMjg1MzksMjg1NDEsMjg1NDIsMjg1NDMsMjg1NDQsMjg1NDUsMjg1NDYsMjg1NDcsMjg1NDksMjg1NTAsMjg1NTEsMjg1NTQsMjg1NTUsMjg1NTksMjg1NjAsMjg1NjEsMjg1NjIsMjg1NjMsMjg1NjQsMjg1NjUsMjg1NjYsMjg1NjcsMjg1NjgsMjg1NjksMjg1NzAsMjg1NzEsMjg1NzMsMjg1NzQsMjg1NzUsMjg1NzYsMjg1NzgsMjg1NzksMjg1ODAsMjg1ODEsMjg1ODIsMjg1ODQsMjg1ODUsMjg1ODYsMjg1ODcsMjg1ODgsMjg1ODksMjg1OTAsMjg1OTEsMjg1OTIsMjg1OTMsMjg1OTQsMjg1OTYsMjg1OTcsMjg1OTksMjg2MDAsMjg2MDIsMjg2MDMsMjg2MDQsMjg2MDUsMjg2MDYsMjg2MDcsMjg2MDksMjg2MTEsMjg2MTIsMjg2MTMsMjg2MTQsMjg2MTUsMjg2MTYsMjg2MTgsMjg2MTksMjg2MjAsMjg2MjEsMjg2MjIsMjg2MjMsMjg2MjQsMjg2MjcsMjg2MjgsMjg2MjksMjg2MzAsMjg2MzEsMjg2MzIsMjg2MzMsMjg2MzQsMjg2MzUsMjg2MzYsMjg2MzcsMjg2MzksMjg2NDIsMjg2NDMsMjg2NDQsMjg2NDUsMjg2NDYsMjg2NDcsMjg2NDgsMjg2NDksMjg2NTAsMjg2NTEsMjg2NTIsMjg2NTMsMjg2NTYsMjg2NTcsMjg2NTgsMjg2NTksMjg2NjAsMjg2NjEsMjg2NjIsMjg2NjMsMjg2NjQsMjg2NjUsMjg2NjYsMjg2NjcsMjg2NjgsMjg2NjksMjg2NzAsMjg2NzEsMjg2NzIsMjg2NzMsMjg2NzQsMjg2NzUsMjg2NzYsMjg2NzcsMjg2NzgsMjg2NzksMjg2ODAsMjg2ODEsMjg2ODIsMjg2ODMsMjg2ODQsMjg2ODUsMjg2ODYsMjg2ODcsMjg2ODgsMjg2OTAsMjg2OTEsMjg2OTIsMjg2OTMsMjg2OTQsMjg2OTUsMjg2OTYsMjg2OTcsMjg3MDAsMjg3MDEsMjg3MDIsMjg3MDMsMjg3MDQsMjg3MDUsMjg3MDYsMjg3MDgsMjg3MDksMjg3MTAsMjg3MTEsMjg3MTIsMjg3MTMsMjg3MTQsMjg3MTUsMjg3MTYsMjg3MTcsMjg3MTgsMjg3MTksMjg3MjAsMjg3MjEsMjg3MjIsMjg3MjMsMjg3MjQsMjg3MjYsMjg3MjcsMjg3MjgsMjg3MzAsMjg3MzEsMjg3MzIsMjg3MzMsMjg3MzQsMjg3MzUsMjg3MzYsMjg3MzcsMjg3MzgsMjg3MzksMjg3NDAsMjg3NDEsMjg3NDIsMjg3NDMsMjg3NDQsMjg3NDUsMjg3NDYsMjg3NDcsMjg3NDksMjg3NTAsMjg3NTIsMjg3NTMsMjg3NTQsMjg3NTUsMjg3NTYsMjg3NTcsMjg3NTgsMjg3NTksMjg3NjAsMjg3NjEsMjg3NjIsMjg3NjMsMjg3NjQsMjg3NjUsMjg3NjcsMjg3NjgsMjg3NjksMjg3NzAsMjg3NzEsMjg3NzIsMjg3NzMsMjg3NzQsMjg3NzUsMjg3NzYsMjg3NzcsMjg3NzgsMjg3ODIsMjg3ODUsMjg3ODYsMjg3ODcsMjg3ODgsMjg3OTEsMjg3OTMsMjg3OTQsMjg3OTUsMjg3OTcsMjg4MDEsMjg4MDIsMjg4MDMsMjg4MDQsMjg4MDYsMjg4MDcsMjg4MDgsMjg4MTEsMjg4MTIsMjg4MTMsMjg4MTUsMjg4MTYsMjg4MTcsMjg4MTksMjg4MjMsMjg4MjQsMjg4MjYsMjg4MjcsMjg4MzAsMjg4MzEsMjg4MzIsMjg4MzMsMjg4MzQsMjg4MzUsMjg4MzYsMjg4MzcsMjg4MzgsMjg4MzksMjg4NDAsMjg4NDEsMjg4NDIsMjg4NDgsMjg4NTAsMjg4NTIsMjg4NTMsMjg4NTQsMjg4NTgsMjg4NjIsMjg4NjMsMjg4NjgsMjg4NjksMjg4NzAsMjg4NzEsMjg4NzMsMjg4NzUsMjg4NzYsMjg4NzcsMjg4NzgsMjg4NzksMjg4ODAsMjg4ODEsMjg4ODIsMjg4ODMsMjg4ODQsMjg4ODUsMjg4ODYsMjg4ODcsMjg4OTAsMjg4OTIsMjg4OTMsMjg4OTQsMjg4OTYsMjg4OTcsMjg4OTgsMjg4OTksMjg5MDEsMjg5MDYsMjg5MTAsMjg5MTIsMjg5MTMsMjg5MTQsMjg5MTUsMjg5MTYsMjg5MTcsMjg5MTgsMjg5MjAsMjg5MjIsMjg5MjMsMjg5MjQsMjg5MjYsMjg5MjcsMjg5MjgsMjg5MjksMjg5MzAsMjg5MzEsMjg5MzIsMjg5MzMsMjg5MzQsMjg5MzUsMjg5MzYsMjg5MzksMjg5NDAsMjg5NDEsMjg5NDIsMjg5NDMsMjg5NDUsMjg5NDYsMjg5NDgsMjg5NTEsMjg5NTUsMjg5NTYsMjg5NTcsMjg5NTgsMjg5NTksMjg5NjAsMjg5NjEsMjg5NjIsMjg5NjMsMjg5NjQsMjg5NjUsMjg5NjcsMjg5NjgsMjg5NjksMjg5NzAsMjg5NzEsMjg5NzIsMjg5NzMsMjg5NzQsMjg5NzgsMjg5NzksMjg5ODAsMjg5ODEsMjg5ODMsMjg5ODQsMjg5ODUsMjg5ODYsMjg5ODcsMjg5ODgsMjg5ODksMjg5OTAsMjg5OTEsMjg5OTIsMjg5OTMsMjg5OTQsMjg5OTUsMjg5OTYsMjg5OTgsMjg5OTksMjkwMDAsMjkwMDEsMjkwMDMsMjkwMDUsMjkwMDcsMjkwMDgsMjkwMDksMjkwMTAsMjkwMTEsMjkwMTIsMjkwMTMsMjkwMTQsMjkwMTUsMjkwMTYsMjkwMTcsMjkwMTgsMjkwMTksMjkwMjEsMjkwMjMsMjkwMjQsMjkwMjUsMjkwMjYsMjkwMjcsMjkwMjksMjkwMzMsMjkwMzQsMjkwMzUsMjkwMzYsMjkwMzcsMjkwMzksMjkwNDAsMjkwNDEsMjkwNDQsMjkwNDUsMjkwNDYsMjkwNDcsMjkwNDksMjkwNTEsMjkwNTIsMjkwNTQsMjkwNTUsMjkwNTYsMjkwNTcsMjkwNTgsMjkwNTksMjkwNjEsMjkwNjIsMjkwNjMsMjkwNjQsMjkwNjUsMjkwNjcsMjkwNjgsMjkwNjksMjkwNzAsMjkwNzIsMjkwNzMsMjkwNzQsMjkwNzUsMjkwNzcsMjkwNzgsMjkwNzksMjkwODIsMjkwODMsMjkwODQsMjkwODUsMjkwODYsMjkwODksMjkwOTAsMjkwOTEsMjkwOTIsMjkwOTMsMjkwOTQsMjkwOTUsMjkwOTcsMjkwOTgsMjkwOTksMjkxMDEsMjkxMDIsMjkxMDMsMjkxMDQsMjkxMDUsMjkxMDYsMjkxMDgsMjkxMTAsMjkxMTEsMjkxMTIsMjkxMTQsMjkxMTUsMjkxMTYsMjkxMTcsMjkxMTgsMjkxMTksMjkxMjAsMjkxMjEsMjkxMjIsMjkxMjQsMjkxMjUsMjkxMjYsMjkxMjcsMjkxMjgsMjkxMjksMjkxMzAsMjkxMzEsMjkxMzIsMjkxMzMsMjkxMzUsMjkxMzYsMjkxMzcsMjkxMzgsMjkxMzksMjkxNDIsMjkxNDMsMjkxNDQsMjkxNDUsMjkxNDYsMjkxNDcsMjkxNDgsMjkxNDksMjkxNTAsMjkxNTEsMjkxNTMsMjkxNTQsMjkxNTUsMjkxNTYsMjkxNTgsMjkxNjAsMjkxNjEsMjkxNjIsMjkxNjMsMjkxNjQsMjkxNjUsMjkxNjcsMjkxNjgsMjkxNjksMjkxNzAsMjkxNzEsMjkxNzIsMjkxNzMsMjkxNzQsMjkxNzUsMjkxNzYsMjkxNzgsMjkxNzksMjkxODAsMjkxODEsMjkxODIsMjkxODMsMjkxODQsMjkxODUsMjkxODYsMjkxODcsMjkxODgsMjkxODksMjkxOTEsMjkxOTIsMjkxOTMsMjkxOTQsMjkxOTUsMjkxOTYsMjkxOTcsMjkxOTgsMjkxOTksMjkyMDAsMjkyMDEsMjkyMDIsMjkyMDMsMjkyMDQsMjkyMDUsMjkyMDYsMjkyMDcsMjkyMDgsMjkyMDksMjkyMTAsMjkyMTEsMjkyMTIsMjkyMTQsMjkyMTUsMjkyMTYsMjkyMTcsMjkyMTgsMjkyMTksMjkyMjAsMjkyMjEsMjkyMjIsMjkyMjMsMjkyMjUsMjkyMjcsMjkyMjksMjkyMzAsMjkyMzEsMjkyMzQsMjkyMzUsMjkyMzYsMjkyNDIsMjkyNDQsMjkyNDYsMjkyNDgsMjkyNDksMjkyNTAsMjkyNTEsMjkyNTIsMjkyNTMsMjkyNTQsMjkyNTcsMjkyNTgsMjkyNTksMjkyNjIsMjkyNjMsMjkyNjQsMjkyNjUsMjkyNjcsMjkyNjgsMjkyNjksMjkyNzEsMjkyNzIsMjkyNzQsMjkyNzYsMjkyNzgsMjkyODAsMjkyODMsMjkyODQsMjkyODUsMjkyODgsMjkyOTAsMjkyOTEsMjkyOTIsMjkyOTMsMjkyOTYsMjkyOTcsMjkyOTksMjkzMDAsMjkzMDIsMjkzMDMsMjkzMDQsMjkzMDcsMjkzMDgsMjkzMDksMjkzMTQsMjkzMTUsMjkzMTcsMjkzMTgsMjkzMTksMjkzMjAsMjkzMjEsMjkzMjQsMjkzMjYsMjkzMjgsMjkzMjksMjkzMzEsMjkzMzIsMjkzMzMsMjkzMzQsMjkzMzUsMjkzMzYsMjkzMzcsMjkzMzgsMjkzMzksMjkzNDAsMjkzNDEsMjkzNDIsMjkzNDQsMjkzNDUsMjkzNDYsMjkzNDcsMjkzNDgsMjkzNDksMjkzNTAsMjkzNTEsMjkzNTIsMjkzNTMsMjkzNTQsMjkzNTUsMjkzNTgsMjkzNjEsMjkzNjIsMjkzNjMsMjkzNjUsMjkzNzAsMjkzNzEsMjkzNzIsMjkzNzMsMjkzNzQsMjkzNzUsMjkzNzYsMjkzODEsMjkzODIsMjkzODMsMjkzODUsMjkzODYsMjkzODcsMjkzODgsMjkzOTEsMjkzOTMsMjkzOTUsMjkzOTYsMjkzOTcsMjkzOTgsMjk0MDAsMjk0MDIsMjk0MDMsNTg1NjYsNTg1NjcsNTg1NjgsNTg1NjksNTg1NzAsNTg1NzEsNTg1NzIsNTg1NzMsNTg1NzQsNTg1NzUsNTg1NzYsNTg1NzcsNTg1NzgsNTg1NzksNTg1ODAsNTg1ODEsNTg1ODIsNTg1ODMsNTg1ODQsNTg1ODUsNTg1ODYsNTg1ODcsNTg1ODgsNTg1ODksNTg1OTAsNTg1OTEsNTg1OTIsNTg1OTMsNTg1OTQsNTg1OTUsNTg1OTYsNTg1OTcsNTg1OTgsNTg1OTksNTg2MDAsNTg2MDEsNTg2MDIsNTg2MDMsNTg2MDQsNTg2MDUsNTg2MDYsNTg2MDcsNTg2MDgsNTg2MDksNTg2MTAsNTg2MTEsNTg2MTIsNTg2MTMsNTg2MTQsNTg2MTUsNTg2MTYsNTg2MTcsNTg2MTgsNTg2MTksNTg2MjAsNTg2MjEsNTg2MjIsNTg2MjMsNTg2MjQsNTg2MjUsNTg2MjYsNTg2MjcsNTg2MjgsNTg2MjksNTg2MzAsNTg2MzEsNTg2MzIsNTg2MzMsNTg2MzQsNTg2MzUsNTg2MzYsNTg2MzcsNTg2MzgsNTg2MzksNTg2NDAsNTg2NDEsNTg2NDIsNTg2NDMsNTg2NDQsNTg2NDUsNTg2NDYsNTg2NDcsNTg2NDgsNTg2NDksNTg2NTAsNTg2NTEsNTg2NTIsNTg2NTMsNTg2NTQsNTg2NTUsNTg2NTYsNTg2NTcsNTg2NTgsNTg2NTksNTg2NjAsNTg2NjEsMTIyODgsMTIyODksMTIyOTAsMTgzLDcxMyw3MTEsMTY4LDEyMjkxLDEyMjkzLDgyMTIsNjUzNzQsODIxNCw4MjMwLDgyMTYsODIxNyw4MjIwLDgyMjEsMTIzMDgsMTIzMDksMTIyOTYsMTIyOTcsMTIyOTgsMTIyOTksMTIzMDAsMTIzMDEsMTIzMDIsMTIzMDMsMTIzMTAsMTIzMTEsMTIzMDQsMTIzMDUsMTc3LDIxNSwyNDcsODc1OCw4NzQzLDg3NDQsODcyMSw4NzE5LDg3NDYsODc0NSw4NzEyLDg3NTksODczMCw4ODY5LDg3NDEsODczNiw4OTc4LDg4NTcsODc0Nyw4NzUwLDg4MDEsODc4MCw4Nzc2LDg3NjUsODczMyw4ODAwLDg4MTQsODgxNSw4ODA0LDg4MDUsODczNCw4NzU3LDg3NTYsOTc5NCw5NzkyLDE3Niw4MjQyLDgyNDMsODQ1MSw2NTI4NCwxNjQsNjU1MDQsNjU1MDUsODI0MCwxNjcsODQ3MCw5NzM0LDk3MzMsOTY3NSw5Njc5LDk2NzgsOTY3MSw5NjcwLDk2MzMsOTYzMiw5NjUxLDk2NTAsODI1MSw4NTk0LDg1OTIsODU5Myw4NTk1LDEyMzA3LDU4NjYyLDU4NjYzLDU4NjY0LDU4NjY1LDU4NjY2LDU4NjY3LDU4NjY4LDU4NjY5LDU4NjcwLDU4NjcxLDU4NjcyLDU4NjczLDU4Njc0LDU4Njc1LDU4Njc2LDU4Njc3LDU4Njc4LDU4Njc5LDU4NjgwLDU4NjgxLDU4NjgyLDU4NjgzLDU4Njg0LDU4Njg1LDU4Njg2LDU4Njg3LDU4Njg4LDU4Njg5LDU4NjkwLDU4NjkxLDU4NjkyLDU4NjkzLDU4Njk0LDU4Njk1LDU4Njk2LDU4Njk3LDU4Njk4LDU4Njk5LDU4NzAwLDU4NzAxLDU4NzAyLDU4NzAzLDU4NzA0LDU4NzA1LDU4NzA2LDU4NzA3LDU4NzA4LDU4NzA5LDU4NzEwLDU4NzExLDU4NzEyLDU4NzEzLDU4NzE0LDU4NzE1LDU4NzE2LDU4NzE3LDU4NzE4LDU4NzE5LDU4NzIwLDU4NzIxLDU4NzIyLDU4NzIzLDU4NzI0LDU4NzI1LDU4NzI2LDU4NzI3LDU4NzI4LDU4NzI5LDU4NzMwLDU4NzMxLDU4NzMyLDU4NzMzLDU4NzM0LDU4NzM1LDU4NzM2LDU4NzM3LDU4NzM4LDU4NzM5LDU4NzQwLDU4NzQxLDU4NzQyLDU4NzQzLDU4NzQ0LDU4NzQ1LDU4NzQ2LDU4NzQ3LDU4NzQ4LDU4NzQ5LDU4NzUwLDU4NzUxLDU4NzUyLDU4NzUzLDU4NzU0LDU4NzU1LDU4NzU2LDU4NzU3LDg1NjAsODU2MSw4NTYyLDg1NjMsODU2NCw4NTY1LDg1NjYsODU2Nyw4NTY4LDg1NjksNTkyMzgsNTkyMzksNTkyNDAsNTkyNDEsNTkyNDIsNTkyNDMsOTM1Miw5MzUzLDkzNTQsOTM1NSw5MzU2LDkzNTcsOTM1OCw5MzU5LDkzNjAsOTM2MSw5MzYyLDkzNjMsOTM2NCw5MzY1LDkzNjYsOTM2Nyw5MzY4LDkzNjksOTM3MCw5MzcxLDkzMzIsOTMzMyw5MzM0LDkzMzUsOTMzNiw5MzM3LDkzMzgsOTMzOSw5MzQwLDkzNDEsOTM0Miw5MzQzLDkzNDQsOTM0NSw5MzQ2LDkzNDcsOTM0OCw5MzQ5LDkzNTAsOTM1MSw5MzEyLDkzMTMsOTMxNCw5MzE1LDkzMTYsOTMxNyw5MzE4LDkzMTksOTMyMCw5MzIxLDgzNjQsNTkyNDUsMTI4MzIsMTI4MzMsMTI4MzQsMTI4MzUsMTI4MzYsMTI4MzcsMTI4MzgsMTI4MzksMTI4NDAsMTI4NDEsNTkyNDYsNTkyNDcsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1Myw4NTU0LDg1NTUsNTkyNDgsNTkyNDksNTg3NTgsNTg3NTksNTg3NjAsNTg3NjEsNTg3NjIsNTg3NjMsNTg3NjQsNTg3NjUsNTg3NjYsNTg3NjcsNTg3NjgsNTg3NjksNTg3NzAsNTg3NzEsNTg3NzIsNTg3NzMsNTg3NzQsNTg3NzUsNTg3NzYsNTg3NzcsNTg3NzgsNTg3NzksNTg3ODAsNTg3ODEsNTg3ODIsNTg3ODMsNTg3ODQsNTg3ODUsNTg3ODYsNTg3ODcsNTg3ODgsNTg3ODksNTg3OTAsNTg3OTEsNTg3OTIsNTg3OTMsNTg3OTQsNTg3OTUsNTg3OTYsNTg3OTcsNTg3OTgsNTg3OTksNTg4MDAsNTg4MDEsNTg4MDIsNTg4MDMsNTg4MDQsNTg4MDUsNTg4MDYsNTg4MDcsNTg4MDgsNTg4MDksNTg4MTAsNTg4MTEsNTg4MTIsNTg4MTMsNTg4MTQsNTg4MTUsNTg4MTYsNTg4MTcsNTg4MTgsNTg4MTksNTg4MjAsNTg4MjEsNTg4MjIsNTg4MjMsNTg4MjQsNTg4MjUsNTg4MjYsNTg4MjcsNTg4MjgsNTg4MjksNTg4MzAsNTg4MzEsNTg4MzIsNTg4MzMsNTg4MzQsNTg4MzUsNTg4MzYsNTg4MzcsNTg4MzgsNTg4MzksNTg4NDAsNTg4NDEsNTg4NDIsNTg4NDMsNTg4NDQsNTg4NDUsNTg4NDYsNTg4NDcsNTg4NDgsNTg4NDksNTg4NTAsNTg4NTEsNTg4NTIsMTIyODgsNjUyODEsNjUyODIsNjUyODMsNjU1MDksNjUyODUsNjUyODYsNjUyODcsNjUyODgsNjUyODksNjUyOTAsNjUyOTEsNjUyOTIsNjUyOTMsNjUyOTQsNjUyOTUsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsNjUzMDYsNjUzMDcsNjUzMDgsNjUzMDksNjUzMTAsNjUzMTEsNjUzMTIsNjUzMTMsNjUzMTQsNjUzMTUsNjUzMTYsNjUzMTcsNjUzMTgsNjUzMTksNjUzMjAsNjUzMjEsNjUzMjIsNjUzMjMsNjUzMjQsNjUzMjUsNjUzMjYsNjUzMjcsNjUzMjgsNjUzMjksNjUzMzAsNjUzMzEsNjUzMzIsNjUzMzMsNjUzMzQsNjUzMzUsNjUzMzYsNjUzMzcsNjUzMzgsNjUzMzksNjUzNDAsNjUzNDEsNjUzNDIsNjUzNDMsNjUzNDQsNjUzNDUsNjUzNDYsNjUzNDcsNjUzNDgsNjUzNDksNjUzNTAsNjUzNTEsNjUzNTIsNjUzNTMsNjUzNTQsNjUzNTUsNjUzNTYsNjUzNTcsNjUzNTgsNjUzNTksNjUzNjAsNjUzNjEsNjUzNjIsNjUzNjMsNjUzNjQsNjUzNjUsNjUzNjYsNjUzNjcsNjUzNjgsNjUzNjksNjUzNzAsNjUzNzEsNjUzNzIsNjUzNzMsNjU1MDcsNTg4NTQsNTg4NTUsNTg4NTYsNTg4NTcsNTg4NTgsNTg4NTksNTg4NjAsNTg4NjEsNTg4NjIsNTg4NjMsNTg4NjQsNTg4NjUsNTg4NjYsNTg4NjcsNTg4NjgsNTg4NjksNTg4NzAsNTg4NzEsNTg4NzIsNTg4NzMsNTg4NzQsNTg4NzUsNTg4NzYsNTg4NzcsNTg4NzgsNTg4NzksNTg4ODAsNTg4ODEsNTg4ODIsNTg4ODMsNTg4ODQsNTg4ODUsNTg4ODYsNTg4ODcsNTg4ODgsNTg4ODksNTg4OTAsNTg4OTEsNTg4OTIsNTg4OTMsNTg4OTQsNTg4OTUsNTg4OTYsNTg4OTcsNTg4OTgsNTg4OTksNTg5MDAsNTg5MDEsNTg5MDIsNTg5MDMsNTg5MDQsNTg5MDUsNTg5MDYsNTg5MDcsNTg5MDgsNTg5MDksNTg5MTAsNTg5MTEsNTg5MTIsNTg5MTMsNTg5MTQsNTg5MTUsNTg5MTYsNTg5MTcsNTg5MTgsNTg5MTksNTg5MjAsNTg5MjEsNTg5MjIsNTg5MjMsNTg5MjQsNTg5MjUsNTg5MjYsNTg5MjcsNTg5MjgsNTg5MjksNTg5MzAsNTg5MzEsNTg5MzIsNTg5MzMsNTg5MzQsNTg5MzUsNTg5MzYsNTg5MzcsNTg5MzgsNTg5MzksNTg5NDAsNTg5NDEsNTg5NDIsNTg5NDMsNTg5NDQsNTg5NDUsNTg5NDYsNTg5NDcsNTg5NDgsNTg5NDksMTIzNTMsMTIzNTQsMTIzNTUsMTIzNTYsMTIzNTcsMTIzNTgsMTIzNTksMTIzNjAsMTIzNjEsMTIzNjIsMTIzNjMsMTIzNjQsMTIzNjUsMTIzNjYsMTIzNjcsMTIzNjgsMTIzNjksMTIzNzAsMTIzNzEsMTIzNzIsMTIzNzMsMTIzNzQsMTIzNzUsMTIzNzYsMTIzNzcsMTIzNzgsMTIzNzksMTIzODAsMTIzODEsMTIzODIsMTIzODMsMTIzODQsMTIzODUsMTIzODYsMTIzODcsMTIzODgsMTIzODksMTIzOTAsMTIzOTEsMTIzOTIsMTIzOTMsMTIzOTQsMTIzOTUsMTIzOTYsMTIzOTcsMTIzOTgsMTIzOTksMTI0MDAsMTI0MDEsMTI0MDIsMTI0MDMsMTI0MDQsMTI0MDUsMTI0MDYsMTI0MDcsMTI0MDgsMTI0MDksMTI0MTAsMTI0MTEsMTI0MTIsMTI0MTMsMTI0MTQsMTI0MTUsMTI0MTYsMTI0MTcsMTI0MTgsMTI0MTksMTI0MjAsMTI0MjEsMTI0MjIsMTI0MjMsMTI0MjQsMTI0MjUsMTI0MjYsMTI0MjcsMTI0MjgsMTI0MjksMTI0MzAsMTI0MzEsMTI0MzIsMTI0MzMsMTI0MzQsMTI0MzUsNTkyNTAsNTkyNTEsNTkyNTIsNTkyNTMsNTkyNTQsNTkyNTUsNTkyNTYsNTkyNTcsNTkyNTgsNTkyNTksNTkyNjAsNTg5NTAsNTg5NTEsNTg5NTIsNTg5NTMsNTg5NTQsNTg5NTUsNTg5NTYsNTg5NTcsNTg5NTgsNTg5NTksNTg5NjAsNTg5NjEsNTg5NjIsNTg5NjMsNTg5NjQsNTg5NjUsNTg5NjYsNTg5NjcsNTg5NjgsNTg5NjksNTg5NzAsNTg5NzEsNTg5NzIsNTg5NzMsNTg5NzQsNTg5NzUsNTg5NzYsNTg5NzcsNTg5NzgsNTg5NzksNTg5ODAsNTg5ODEsNTg5ODIsNTg5ODMsNTg5ODQsNTg5ODUsNTg5ODYsNTg5ODcsNTg5ODgsNTg5ODksNTg5OTAsNTg5OTEsNTg5OTIsNTg5OTMsNTg5OTQsNTg5OTUsNTg5OTYsNTg5OTcsNTg5OTgsNTg5OTksNTkwMDAsNTkwMDEsNTkwMDIsNTkwMDMsNTkwMDQsNTkwMDUsNTkwMDYsNTkwMDcsNTkwMDgsNTkwMDksNTkwMTAsNTkwMTEsNTkwMTIsNTkwMTMsNTkwMTQsNTkwMTUsNTkwMTYsNTkwMTcsNTkwMTgsNTkwMTksNTkwMjAsNTkwMjEsNTkwMjIsNTkwMjMsNTkwMjQsNTkwMjUsNTkwMjYsNTkwMjcsNTkwMjgsNTkwMjksNTkwMzAsNTkwMzEsNTkwMzIsNTkwMzMsNTkwMzQsNTkwMzUsNTkwMzYsNTkwMzcsNTkwMzgsNTkwMzksNTkwNDAsNTkwNDEsNTkwNDIsNTkwNDMsNTkwNDQsNTkwNDUsMTI0NDksMTI0NTAsMTI0NTEsMTI0NTIsMTI0NTMsMTI0NTQsMTI0NTUsMTI0NTYsMTI0NTcsMTI0NTgsMTI0NTksMTI0NjAsMTI0NjEsMTI0NjIsMTI0NjMsMTI0NjQsMTI0NjUsMTI0NjYsMTI0NjcsMTI0NjgsMTI0NjksMTI0NzAsMTI0NzEsMTI0NzIsMTI0NzMsMTI0NzQsMTI0NzUsMTI0NzYsMTI0NzcsMTI0NzgsMTI0NzksMTI0ODAsMTI0ODEsMTI0ODIsMTI0ODMsMTI0ODQsMTI0ODUsMTI0ODYsMTI0ODcsMTI0ODgsMTI0ODksMTI0OTAsMTI0OTEsMTI0OTIsMTI0OTMsMTI0OTQsMTI0OTUsMTI0OTYsMTI0OTcsMTI0OTgsMTI0OTksMTI1MDAsMTI1MDEsMTI1MDIsMTI1MDMsMTI1MDQsMTI1MDUsMTI1MDYsMTI1MDcsMTI1MDgsMTI1MDksMTI1MTAsMTI1MTEsMTI1MTIsMTI1MTMsMTI1MTQsMTI1MTUsMTI1MTYsMTI1MTcsMTI1MTgsMTI1MTksMTI1MjAsMTI1MjEsMTI1MjIsMTI1MjMsMTI1MjQsMTI1MjUsMTI1MjYsMTI1MjcsMTI1MjgsMTI1MjksMTI1MzAsMTI1MzEsMTI1MzIsMTI1MzMsMTI1MzQsNTkyNjEsNTkyNjIsNTkyNjMsNTkyNjQsNTkyNjUsNTkyNjYsNTkyNjcsNTkyNjgsNTkwNDYsNTkwNDcsNTkwNDgsNTkwNDksNTkwNTAsNTkwNTEsNTkwNTIsNTkwNTMsNTkwNTQsNTkwNTUsNTkwNTYsNTkwNTcsNTkwNTgsNTkwNTksNTkwNjAsNTkwNjEsNTkwNjIsNTkwNjMsNTkwNjQsNTkwNjUsNTkwNjYsNTkwNjcsNTkwNjgsNTkwNjksNTkwNzAsNTkwNzEsNTkwNzIsNTkwNzMsNTkwNzQsNTkwNzUsNTkwNzYsNTkwNzcsNTkwNzgsNTkwNzksNTkwODAsNTkwODEsNTkwODIsNTkwODMsNTkwODQsNTkwODUsNTkwODYsNTkwODcsNTkwODgsNTkwODksNTkwOTAsNTkwOTEsNTkwOTIsNTkwOTMsNTkwOTQsNTkwOTUsNTkwOTYsNTkwOTcsNTkwOTgsNTkwOTksNTkxMDAsNTkxMDEsNTkxMDIsNTkxMDMsNTkxMDQsNTkxMDUsNTkxMDYsNTkxMDcsNTkxMDgsNTkxMDksNTkxMTAsNTkxMTEsNTkxMTIsNTkxMTMsNTkxMTQsNTkxMTUsNTkxMTYsNTkxMTcsNTkxMTgsNTkxMTksNTkxMjAsNTkxMjEsNTkxMjIsNTkxMjMsNTkxMjQsNTkxMjUsNTkxMjYsNTkxMjcsNTkxMjgsNTkxMjksNTkxMzAsNTkxMzEsNTkxMzIsNTkxMzMsNTkxMzQsNTkxMzUsNTkxMzYsNTkxMzcsNTkxMzgsNTkxMzksNTkxNDAsNTkxNDEsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsNTkyNjksNTkyNzAsNTkyNzEsNTkyNzIsNTkyNzMsNTkyNzQsNTkyNzUsNTkyNzYsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksNTkyNzcsNTkyNzgsNTkyNzksNTkyODAsNTkyODEsNTkyODIsNTkyODMsNjUwNzcsNjUwNzgsNjUwODEsNjUwODIsNjUwODcsNjUwODgsNjUwODUsNjUwODYsNjUwODksNjUwOTAsNjUwOTEsNjUwOTIsNTkyODQsNTkyODUsNjUwODMsNjUwODQsNjUwNzksNjUwODAsNjUwNzMsNTkyODYsNjUwNzUsNjUwNzYsNTkyODcsNTkyODgsNTkyODksNTkyOTAsNTkyOTEsNTkyOTIsNTkyOTMsNTkyOTQsNTkyOTUsNTkxNDIsNTkxNDMsNTkxNDQsNTkxNDUsNTkxNDYsNTkxNDcsNTkxNDgsNTkxNDksNTkxNTAsNTkxNTEsNTkxNTIsNTkxNTMsNTkxNTQsNTkxNTUsNTkxNTYsNTkxNTcsNTkxNTgsNTkxNTksNTkxNjAsNTkxNjEsNTkxNjIsNTkxNjMsNTkxNjQsNTkxNjUsNTkxNjYsNTkxNjcsNTkxNjgsNTkxNjksNTkxNzAsNTkxNzEsNTkxNzIsNTkxNzMsNTkxNzQsNTkxNzUsNTkxNzYsNTkxNzcsNTkxNzgsNTkxNzksNTkxODAsNTkxODEsNTkxODIsNTkxODMsNTkxODQsNTkxODUsNTkxODYsNTkxODcsNTkxODgsNTkxODksNTkxOTAsNTkxOTEsNTkxOTIsNTkxOTMsNTkxOTQsNTkxOTUsNTkxOTYsNTkxOTcsNTkxOTgsNTkxOTksNTkyMDAsNTkyMDEsNTkyMDIsNTkyMDMsNTkyMDQsNTkyMDUsNTkyMDYsNTkyMDcsNTkyMDgsNTkyMDksNTkyMTAsNTkyMTEsNTkyMTIsNTkyMTMsNTkyMTQsNTkyMTUsNTkyMTYsNTkyMTcsNTkyMTgsNTkyMTksNTkyMjAsNTkyMjEsNTkyMjIsNTkyMjMsNTkyMjQsNTkyMjUsNTkyMjYsNTkyMjcsNTkyMjgsNTkyMjksNTkyMzAsNTkyMzEsNTkyMzIsNTkyMzMsNTkyMzQsNTkyMzUsNTkyMzYsNTkyMzcsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTAyNSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsNTkyOTYsNTkyOTcsNTkyOTgsNTkyOTksNTkzMDAsNTkzMDEsNTkzMDIsNTkzMDMsNTkzMDQsNTkzMDUsNTkzMDYsNTkzMDcsNTkzMDgsNTkzMDksNTkzMTAsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTEwNSwxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsNTkzMTEsNTkzMTIsNTkzMTMsNTkzMTQsNTkzMTUsNTkzMTYsNTkzMTcsNTkzMTgsNTkzMTksNTkzMjAsNTkzMjEsNTkzMjIsNTkzMjMsNzE0LDcxNSw3MjksODIxMSw4MjEzLDgyMjksODI0NSw4NDUzLDg0NTcsODU5OCw4NTk5LDg2MDAsODYwMSw4NzI1LDg3MzUsODczOSw4Nzg2LDg4MDYsODgwNyw4ODk1LDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NTgxLDk1ODIsOTU4Myw5NTg0LDk1ODUsOTU4Niw5NTg3LDk2MDEsOTYwMiw5NjAzLDk2MDQsOTYwNSw5NjA2LDk2MDcsOTYwOCw5NjA5LDk2MTAsOTYxMSw5NjEyLDk2MTMsOTYxNCw5NjE1LDk2MTksOTYyMCw5NjIxLDk2NjAsOTY2MSw5Njk4LDk2OTksOTcwMCw5NzAxLDk3MzcsODg1MywxMjMwNiwxMjMxNywxMjMxOCw1OTMyNCw1OTMyNSw1OTMyNiw1OTMyNyw1OTMyOCw1OTMyOSw1OTMzMCw1OTMzMSw1OTMzMiw1OTMzMyw1OTMzNCwyNTcsMjI1LDQ2MiwyMjQsMjc1LDIzMywyODMsMjMyLDI5OSwyMzcsNDY0LDIzNiwzMzMsMjQzLDQ2NiwyNDIsMzYzLDI1MCw0NjgsMjQ5LDQ3MCw0NzIsNDc0LDQ3NiwyNTIsMjM0LDU5Myw3NzQzLDMyNCwzMjgsNTA1LDYwOSw1OTMzNyw1OTMzOCw1OTMzOSw1OTM0MCwxMjU0OSwxMjU1MCwxMjU1MSwxMjU1MiwxMjU1MywxMjU1NCwxMjU1NSwxMjU1NiwxMjU1NywxMjU1OCwxMjU1OSwxMjU2MCwxMjU2MSwxMjU2MiwxMjU2MywxMjU2NCwxMjU2NSwxMjU2NiwxMjU2NywxMjU2OCwxMjU2OSwxMjU3MCwxMjU3MSwxMjU3MiwxMjU3MywxMjU3NCwxMjU3NSwxMjU3NiwxMjU3NywxMjU3OCwxMjU3OSwxMjU4MCwxMjU4MSwxMjU4MiwxMjU4MywxMjU4NCwxMjU4NSw1OTM0MSw1OTM0Miw1OTM0Myw1OTM0NCw1OTM0NSw1OTM0Niw1OTM0Nyw1OTM0OCw1OTM0OSw1OTM1MCw1OTM1MSw1OTM1Miw1OTM1Myw1OTM1NCw1OTM1NSw1OTM1Niw1OTM1Nyw1OTM1OCw1OTM1OSw1OTM2MCw1OTM2MSwxMjMyMSwxMjMyMiwxMjMyMywxMjMyNCwxMjMyNSwxMjMyNiwxMjMyNywxMjMyOCwxMjMyOSwxMjk2MywxMzE5OCwxMzE5OSwxMzIxMiwxMzIxMywxMzIxNCwxMzIxNywxMzI1MiwxMzI2MiwxMzI2NSwxMzI2NiwxMzI2OSw2NTA3Miw2NTUwNiw2NTUwOCw1OTM2Miw4NDgxLDEyODQ5LDU5MzYzLDgyMDgsNTkzNjQsNTkzNjUsNTkzNjYsMTI1NDAsMTI0NDMsMTI0NDQsMTI1NDEsMTI1NDIsMTIyOTQsMTI0NDUsMTI0NDYsNjUwOTcsNjUwOTgsNjUwOTksNjUxMDAsNjUxMDEsNjUxMDIsNjUxMDMsNjUxMDQsNjUxMDUsNjUxMDYsNjUxMDgsNjUxMDksNjUxMTAsNjUxMTEsNjUxMTMsNjUxMTQsNjUxMTUsNjUxMTYsNjUxMTcsNjUxMTgsNjUxMTksNjUxMjAsNjUxMjEsNjUxMjIsNjUxMjMsNjUxMjQsNjUxMjUsNjUxMjYsNjUxMjgsNjUxMjksNjUxMzAsNjUxMzEsMTIzNTAsMTIyNzIsMTIyNzMsMTIyNzQsMTIyNzUsMTIyNzYsMTIyNzcsMTIyNzgsMTIyNzksMTIyODAsMTIyODEsMTIyODIsMTIyODMsMTIyOTUsNTkzODAsNTkzODEsNTkzODIsNTkzODMsNTkzODQsNTkzODUsNTkzODYsNTkzODcsNTkzODgsNTkzODksNTkzOTAsNTkzOTEsNTkzOTIsOTQ3Miw5NDczLDk0NzQsOTQ3NSw5NDc2LDk0NzcsOTQ3OCw5NDc5LDk0ODAsOTQ4MSw5NDgyLDk0ODMsOTQ4NCw5NDg1LDk0ODYsOTQ4Nyw5NDg4LDk0ODksOTQ5MCw5NDkxLDk0OTIsOTQ5Myw5NDk0LDk0OTUsOTQ5Niw5NDk3LDk0OTgsOTQ5OSw5NTAwLDk1MDEsOTUwMiw5NTAzLDk1MDQsOTUwNSw5NTA2LDk1MDcsOTUwOCw5NTA5LDk1MTAsOTUxMSw5NTEyLDk1MTMsOTUxNCw5NTE1LDk1MTYsOTUxNyw5NTE4LDk1MTksOTUyMCw5NTIxLDk1MjIsOTUyMyw5NTI0LDk1MjUsOTUyNiw5NTI3LDk1MjgsOTUyOSw5NTMwLDk1MzEsOTUzMiw5NTMzLDk1MzQsOTUzNSw5NTM2LDk1MzcsOTUzOCw5NTM5LDk1NDAsOTU0MSw5NTQyLDk1NDMsOTU0NCw5NTQ1LDk1NDYsOTU0Nyw1OTM5Myw1OTM5NCw1OTM5NSw1OTM5Niw1OTM5Nyw1OTM5OCw1OTM5OSw1OTQwMCw1OTQwMSw1OTQwMiw1OTQwMyw1OTQwNCw1OTQwNSw1OTQwNiw1OTQwNywyOTQwNCwyOTQwNSwyOTQwNywyOTQxMCwyOTQxMSwyOTQxMiwyOTQxMywyOTQxNCwyOTQxNSwyOTQxOCwyOTQxOSwyOTQyOSwyOTQzMCwyOTQzMywyOTQzNywyOTQzOCwyOTQzOSwyOTQ0MCwyOTQ0MiwyOTQ0NCwyOTQ0NSwyOTQ0NiwyOTQ0NywyOTQ0OCwyOTQ0OSwyOTQ1MSwyOTQ1MiwyOTQ1MywyOTQ1NSwyOTQ1NiwyOTQ1NywyOTQ1OCwyOTQ2MCwyOTQ2NCwyOTQ2NSwyOTQ2NiwyOTQ3MSwyOTQ3MiwyOTQ3NSwyOTQ3NiwyOTQ3OCwyOTQ3OSwyOTQ4MCwyOTQ4NSwyOTQ4NywyOTQ4OCwyOTQ5MCwyOTQ5MSwyOTQ5MywyOTQ5NCwyOTQ5OCwyOTQ5OSwyOTUwMCwyOTUwMSwyOTUwNCwyOTUwNSwyOTUwNiwyOTUwNywyOTUwOCwyOTUwOSwyOTUxMCwyOTUxMSwyOTUxMiwyOTUxMywyOTUxNCwyOTUxNSwyOTUxNiwyOTUxOCwyOTUxOSwyOTUyMSwyOTUyMywyOTUyNCwyOTUyNSwyOTUyNiwyOTUyOCwyOTUyOSwyOTUzMCwyOTUzMSwyOTUzMiwyOTUzMywyOTUzNCwyOTUzNSwyOTUzNywyOTUzOCwyOTUzOSwyOTU0MCwyOTU0MSwyOTU0MiwyOTU0MywyOTU0NCwyOTU0NSwyOTU0NiwyOTU0NywyOTU1MCwyOTU1MiwyOTU1Myw1NzM0NCw1NzM0NSw1NzM0Niw1NzM0Nyw1NzM0OCw1NzM0OSw1NzM1MCw1NzM1MSw1NzM1Miw1NzM1Myw1NzM1NCw1NzM1NSw1NzM1Niw1NzM1Nyw1NzM1OCw1NzM1OSw1NzM2MCw1NzM2MSw1NzM2Miw1NzM2Myw1NzM2NCw1NzM2NSw1NzM2Niw1NzM2Nyw1NzM2OCw1NzM2OSw1NzM3MCw1NzM3MSw1NzM3Miw1NzM3Myw1NzM3NCw1NzM3NSw1NzM3Niw1NzM3Nyw1NzM3OCw1NzM3OSw1NzM4MCw1NzM4MSw1NzM4Miw1NzM4Myw1NzM4NCw1NzM4NSw1NzM4Niw1NzM4Nyw1NzM4OCw1NzM4OSw1NzM5MCw1NzM5MSw1NzM5Miw1NzM5Myw1NzM5NCw1NzM5NSw1NzM5Niw1NzM5Nyw1NzM5OCw1NzM5OSw1NzQwMCw1NzQwMSw1NzQwMiw1NzQwMyw1NzQwNCw1NzQwNSw1NzQwNiw1NzQwNyw1NzQwOCw1NzQwOSw1NzQxMCw1NzQxMSw1NzQxMiw1NzQxMyw1NzQxNCw1NzQxNSw1NzQxNiw1NzQxNyw1NzQxOCw1NzQxOSw1NzQyMCw1NzQyMSw1NzQyMiw1NzQyMyw1NzQyNCw1NzQyNSw1NzQyNiw1NzQyNyw1NzQyOCw1NzQyOSw1NzQzMCw1NzQzMSw1NzQzMiw1NzQzMyw1NzQzNCw1NzQzNSw1NzQzNiw1NzQzNywyOTU1NCwyOTU1NSwyOTU1NiwyOTU1NywyOTU1OCwyOTU1OSwyOTU2MCwyOTU2MSwyOTU2MiwyOTU2MywyOTU2NCwyOTU2NSwyOTU2NywyOTU2OCwyOTU2OSwyOTU3MCwyOTU3MSwyOTU3MywyOTU3NCwyOTU3NiwyOTU3OCwyOTU4MCwyOTU4MSwyOTU4MywyOTU4NCwyOTU4NiwyOTU4NywyOTU4OCwyOTU4OSwyOTU5MSwyOTU5MiwyOTU5MywyOTU5NCwyOTU5NiwyOTU5NywyOTU5OCwyOTYwMCwyOTYwMSwyOTYwMywyOTYwNCwyOTYwNSwyOTYwNiwyOTYwNywyOTYwOCwyOTYxMCwyOTYxMiwyOTYxMywyOTYxNywyOTYyMCwyOTYyMSwyOTYyMiwyOTYyNCwyOTYyNSwyOTYyOCwyOTYyOSwyOTYzMCwyOTYzMSwyOTYzMywyOTYzNSwyOTYzNiwyOTYzNywyOTYzOCwyOTYzOSwyOTY0MywyOTY0NCwyOTY0NiwyOTY1MCwyOTY1MSwyOTY1MiwyOTY1MywyOTY1NCwyOTY1NSwyOTY1NiwyOTY1OCwyOTY1OSwyOTY2MCwyOTY2MSwyOTY2MywyOTY2NSwyOTY2NiwyOTY2NywyOTY2OCwyOTY3MCwyOTY3MiwyOTY3NCwyOTY3NSwyOTY3NiwyOTY3OCwyOTY3OSwyOTY4MCwyOTY4MSwyOTY4MywyOTY4NCwyOTY4NSwyOTY4NiwyOTY4Nyw1NzQzOCw1NzQzOSw1NzQ0MCw1NzQ0MSw1NzQ0Miw1NzQ0Myw1NzQ0NCw1NzQ0NSw1NzQ0Niw1NzQ0Nyw1NzQ0OCw1NzQ0OSw1NzQ1MCw1NzQ1MSw1NzQ1Miw1NzQ1Myw1NzQ1NCw1NzQ1NSw1NzQ1Niw1NzQ1Nyw1NzQ1OCw1NzQ1OSw1NzQ2MCw1NzQ2MSw1NzQ2Miw1NzQ2Myw1NzQ2NCw1NzQ2NSw1NzQ2Niw1NzQ2Nyw1NzQ2OCw1NzQ2OSw1NzQ3MCw1NzQ3MSw1NzQ3Miw1NzQ3Myw1NzQ3NCw1NzQ3NSw1NzQ3Niw1NzQ3Nyw1NzQ3OCw1NzQ3OSw1NzQ4MCw1NzQ4MSw1NzQ4Miw1NzQ4Myw1NzQ4NCw1NzQ4NSw1NzQ4Niw1NzQ4Nyw1NzQ4OCw1NzQ4OSw1NzQ5MCw1NzQ5MSw1NzQ5Miw1NzQ5Myw1NzQ5NCw1NzQ5NSw1NzQ5Niw1NzQ5Nyw1NzQ5OCw1NzQ5OSw1NzUwMCw1NzUwMSw1NzUwMiw1NzUwMyw1NzUwNCw1NzUwNSw1NzUwNiw1NzUwNyw1NzUwOCw1NzUwOSw1NzUxMCw1NzUxMSw1NzUxMiw1NzUxMyw1NzUxNCw1NzUxNSw1NzUxNiw1NzUxNyw1NzUxOCw1NzUxOSw1NzUyMCw1NzUyMSw1NzUyMiw1NzUyMyw1NzUyNCw1NzUyNSw1NzUyNiw1NzUyNyw1NzUyOCw1NzUyOSw1NzUzMCw1NzUzMSwyOTY4OCwyOTY4OSwyOTY5MCwyOTY5MSwyOTY5MiwyOTY5MywyOTY5NCwyOTY5NSwyOTY5NiwyOTY5NywyOTY5OCwyOTcwMCwyOTcwMywyOTcwNCwyOTcwNywyOTcwOCwyOTcwOSwyOTcxMCwyOTcxMywyOTcxNCwyOTcxNSwyOTcxNiwyOTcxNywyOTcxOCwyOTcxOSwyOTcyMCwyOTcyMSwyOTcyNCwyOTcyNSwyOTcyNiwyOTcyNywyOTcyOCwyOTcyOSwyOTczMSwyOTczMiwyOTczNSwyOTczNywyOTczOSwyOTc0MSwyOTc0MywyOTc0NSwyOTc0NiwyOTc1MSwyOTc1MiwyOTc1MywyOTc1NCwyOTc1NSwyOTc1NywyOTc1OCwyOTc1OSwyOTc2MCwyOTc2MiwyOTc2MywyOTc2NCwyOTc2NSwyOTc2NiwyOTc2NywyOTc2OCwyOTc2OSwyOTc3MCwyOTc3MSwyOTc3MiwyOTc3MywyOTc3NCwyOTc3NSwyOTc3NiwyOTc3NywyOTc3OCwyOTc3OSwyOTc4MCwyOTc4MiwyOTc4NCwyOTc4OSwyOTc5MiwyOTc5MywyOTc5NCwyOTc5NSwyOTc5NiwyOTc5NywyOTc5OCwyOTc5OSwyOTgwMCwyOTgwMSwyOTgwMiwyOTgwMywyOTgwNCwyOTgwNiwyOTgwNywyOTgwOSwyOTgxMCwyOTgxMSwyOTgxMiwyOTgxMywyOTgxNiwyOTgxNywyOTgxOCw1NzUzMiw1NzUzMyw1NzUzNCw1NzUzNSw1NzUzNiw1NzUzNyw1NzUzOCw1NzUzOSw1NzU0MCw1NzU0MSw1NzU0Miw1NzU0Myw1NzU0NCw1NzU0NSw1NzU0Niw1NzU0Nyw1NzU0OCw1NzU0OSw1NzU1MCw1NzU1MSw1NzU1Miw1NzU1Myw1NzU1NCw1NzU1NSw1NzU1Niw1NzU1Nyw1NzU1OCw1NzU1OSw1NzU2MCw1NzU2MSw1NzU2Miw1NzU2Myw1NzU2NCw1NzU2NSw1NzU2Niw1NzU2Nyw1NzU2OCw1NzU2OSw1NzU3MCw1NzU3MSw1NzU3Miw1NzU3Myw1NzU3NCw1NzU3NSw1NzU3Niw1NzU3Nyw1NzU3OCw1NzU3OSw1NzU4MCw1NzU4MSw1NzU4Miw1NzU4Myw1NzU4NCw1NzU4NSw1NzU4Niw1NzU4Nyw1NzU4OCw1NzU4OSw1NzU5MCw1NzU5MSw1NzU5Miw1NzU5Myw1NzU5NCw1NzU5NSw1NzU5Niw1NzU5Nyw1NzU5OCw1NzU5OSw1NzYwMCw1NzYwMSw1NzYwMiw1NzYwMyw1NzYwNCw1NzYwNSw1NzYwNiw1NzYwNyw1NzYwOCw1NzYwOSw1NzYxMCw1NzYxMSw1NzYxMiw1NzYxMyw1NzYxNCw1NzYxNSw1NzYxNiw1NzYxNyw1NzYxOCw1NzYxOSw1NzYyMCw1NzYyMSw1NzYyMiw1NzYyMyw1NzYyNCw1NzYyNSwyOTgxOSwyOTgyMCwyOTgyMSwyOTgyMywyOTgyNiwyOTgyOCwyOTgyOSwyOTgzMCwyOTgzMiwyOTgzMywyOTgzNCwyOTgzNiwyOTgzNywyOTgzOSwyOTg0MSwyOTg0MiwyOTg0MywyOTg0NCwyOTg0NSwyOTg0NiwyOTg0NywyOTg0OCwyOTg0OSwyOTg1MCwyOTg1MSwyOTg1MywyOTg1NSwyOTg1NiwyOTg1NywyOTg1OCwyOTg1OSwyOTg2MCwyOTg2MSwyOTg2MiwyOTg2NiwyOTg2NywyOTg2OCwyOTg2OSwyOTg3MCwyOTg3MSwyOTg3MiwyOTg3MywyOTg3NCwyOTg3NSwyOTg3NiwyOTg3NywyOTg3OCwyOTg3OSwyOTg4MCwyOTg4MSwyOTg4MywyOTg4NCwyOTg4NSwyOTg4NiwyOTg4NywyOTg4OCwyOTg4OSwyOTg5MCwyOTg5MSwyOTg5MiwyOTg5MywyOTg5NCwyOTg5NSwyOTg5NiwyOTg5NywyOTg5OCwyOTg5OSwyOTkwMCwyOTkwMSwyOTkwMiwyOTkwMywyOTkwNCwyOTkwNSwyOTkwNywyOTkwOCwyOTkwOSwyOTkxMCwyOTkxMSwyOTkxMiwyOTkxMywyOTkxNCwyOTkxNSwyOTkxNywyOTkxOSwyOTkyMSwyOTkyNSwyOTkyNywyOTkyOCwyOTkyOSwyOTkzMCwyOTkzMSwyOTkzMiwyOTkzMywyOTkzNiwyOTkzNywyOTkzOCw1NzYyNiw1NzYyNyw1NzYyOCw1NzYyOSw1NzYzMCw1NzYzMSw1NzYzMiw1NzYzMyw1NzYzNCw1NzYzNSw1NzYzNiw1NzYzNyw1NzYzOCw1NzYzOSw1NzY0MCw1NzY0MSw1NzY0Miw1NzY0Myw1NzY0NCw1NzY0NSw1NzY0Niw1NzY0Nyw1NzY0OCw1NzY0OSw1NzY1MCw1NzY1MSw1NzY1Miw1NzY1Myw1NzY1NCw1NzY1NSw1NzY1Niw1NzY1Nyw1NzY1OCw1NzY1OSw1NzY2MCw1NzY2MSw1NzY2Miw1NzY2Myw1NzY2NCw1NzY2NSw1NzY2Niw1NzY2Nyw1NzY2OCw1NzY2OSw1NzY3MCw1NzY3MSw1NzY3Miw1NzY3Myw1NzY3NCw1NzY3NSw1NzY3Niw1NzY3Nyw1NzY3OCw1NzY3OSw1NzY4MCw1NzY4MSw1NzY4Miw1NzY4Myw1NzY4NCw1NzY4NSw1NzY4Niw1NzY4Nyw1NzY4OCw1NzY4OSw1NzY5MCw1NzY5MSw1NzY5Miw1NzY5Myw1NzY5NCw1NzY5NSw1NzY5Niw1NzY5Nyw1NzY5OCw1NzY5OSw1NzcwMCw1NzcwMSw1NzcwMiw1NzcwMyw1NzcwNCw1NzcwNSw1NzcwNiw1NzcwNyw1NzcwOCw1NzcwOSw1NzcxMCw1NzcxMSw1NzcxMiw1NzcxMyw1NzcxNCw1NzcxNSw1NzcxNiw1NzcxNyw1NzcxOCw1NzcxOSwyOTkzOSwyOTk0MSwyOTk0NCwyOTk0NSwyOTk0NiwyOTk0NywyOTk0OCwyOTk0OSwyOTk1MCwyOTk1MiwyOTk1MywyOTk1NCwyOTk1NSwyOTk1NywyOTk1OCwyOTk1OSwyOTk2MCwyOTk2MSwyOTk2MiwyOTk2MywyOTk2NCwyOTk2NiwyOTk2OCwyOTk3MCwyOTk3MiwyOTk3MywyOTk3NCwyOTk3NSwyOTk3OSwyOTk4MSwyOTk4MiwyOTk4NCwyOTk4NSwyOTk4NiwyOTk4NywyOTk4OCwyOTk5MCwyOTk5MSwyOTk5NCwyOTk5OCwzMDAwNCwzMDAwNiwzMDAwOSwzMDAxMiwzMDAxMywzMDAxNSwzMDAxNywzMDAxOCwzMDAxOSwzMDAyMCwzMDAyMiwzMDAyMywzMDAyNSwzMDAyNiwzMDAyOSwzMDAzMiwzMDAzMywzMDAzNCwzMDAzNSwzMDAzNywzMDAzOCwzMDAzOSwzMDA0MCwzMDA0NSwzMDA0NiwzMDA0NywzMDA0OCwzMDA0OSwzMDA1MCwzMDA1MSwzMDA1MiwzMDA1NSwzMDA1NiwzMDA1NywzMDA1OSwzMDA2MCwzMDA2MSwzMDA2MiwzMDA2MywzMDA2NCwzMDA2NSwzMDA2NywzMDA2OSwzMDA3MCwzMDA3MSwzMDA3NCwzMDA3NSwzMDA3NiwzMDA3NywzMDA3OCwzMDA4MCwzMDA4MSwzMDA4MiwzMDA4NCwzMDA4NSwzMDA4Nyw1NzcyMCw1NzcyMSw1NzcyMiw1NzcyMyw1NzcyNCw1NzcyNSw1NzcyNiw1NzcyNyw1NzcyOCw1NzcyOSw1NzczMCw1NzczMSw1NzczMiw1NzczMyw1NzczNCw1NzczNSw1NzczNiw1NzczNyw1NzczOCw1NzczOSw1Nzc0MCw1Nzc0MSw1Nzc0Miw1Nzc0Myw1Nzc0NCw1Nzc0NSw1Nzc0Niw1Nzc0Nyw1Nzc0OCw1Nzc0OSw1Nzc1MCw1Nzc1MSw1Nzc1Miw1Nzc1Myw1Nzc1NCw1Nzc1NSw1Nzc1Niw1Nzc1Nyw1Nzc1OCw1Nzc1OSw1Nzc2MCw1Nzc2MSw1Nzc2Miw1Nzc2Myw1Nzc2NCw1Nzc2NSw1Nzc2Niw1Nzc2Nyw1Nzc2OCw1Nzc2OSw1Nzc3MCw1Nzc3MSw1Nzc3Miw1Nzc3Myw1Nzc3NCw1Nzc3NSw1Nzc3Niw1Nzc3Nyw1Nzc3OCw1Nzc3OSw1Nzc4MCw1Nzc4MSw1Nzc4Miw1Nzc4Myw1Nzc4NCw1Nzc4NSw1Nzc4Niw1Nzc4Nyw1Nzc4OCw1Nzc4OSw1Nzc5MCw1Nzc5MSw1Nzc5Miw1Nzc5Myw1Nzc5NCw1Nzc5NSw1Nzc5Niw1Nzc5Nyw1Nzc5OCw1Nzc5OSw1NzgwMCw1NzgwMSw1NzgwMiw1NzgwMyw1NzgwNCw1NzgwNSw1NzgwNiw1NzgwNyw1NzgwOCw1NzgwOSw1NzgxMCw1NzgxMSw1NzgxMiw1NzgxMywzMDA4OCwzMDA4OSwzMDA5MCwzMDA5MiwzMDA5MywzMDA5NCwzMDA5NiwzMDA5OSwzMDEwMSwzMDEwNCwzMDEwNywzMDEwOCwzMDExMCwzMDExNCwzMDExOCwzMDExOSwzMDEyMCwzMDEyMSwzMDEyMiwzMDEyNSwzMDEzNCwzMDEzNSwzMDEzOCwzMDEzOSwzMDE0MywzMDE0NCwzMDE0NSwzMDE1MCwzMDE1NSwzMDE1NiwzMDE1OCwzMDE1OSwzMDE2MCwzMDE2MSwzMDE2MywzMDE2NywzMDE2OSwzMDE3MCwzMDE3MiwzMDE3MywzMDE3NSwzMDE3NiwzMDE3NywzMDE4MSwzMDE4NSwzMDE4OCwzMDE4OSwzMDE5MCwzMDE5MSwzMDE5NCwzMDE5NSwzMDE5NywzMDE5OCwzMDE5OSwzMDIwMCwzMDIwMiwzMDIwMywzMDIwNSwzMDIwNiwzMDIxMCwzMDIxMiwzMDIxNCwzMDIxNSwzMDIxNiwzMDIxNywzMDIxOSwzMDIyMSwzMDIyMiwzMDIyMywzMDIyNSwzMDIyNiwzMDIyNywzMDIyOCwzMDIzMCwzMDIzNCwzMDIzNiwzMDIzNywzMDIzOCwzMDI0MSwzMDI0MywzMDI0NywzMDI0OCwzMDI1MiwzMDI1NCwzMDI1NSwzMDI1NywzMDI1OCwzMDI2MiwzMDI2MywzMDI2NSwzMDI2NiwzMDI2NywzMDI2OSwzMDI3MywzMDI3NCwzMDI3Niw1NzgxNCw1NzgxNSw1NzgxNiw1NzgxNyw1NzgxOCw1NzgxOSw1NzgyMCw1NzgyMSw1NzgyMiw1NzgyMyw1NzgyNCw1NzgyNSw1NzgyNiw1NzgyNyw1NzgyOCw1NzgyOSw1NzgzMCw1NzgzMSw1NzgzMiw1NzgzMyw1NzgzNCw1NzgzNSw1NzgzNiw1NzgzNyw1NzgzOCw1NzgzOSw1Nzg0MCw1Nzg0MSw1Nzg0Miw1Nzg0Myw1Nzg0NCw1Nzg0NSw1Nzg0Niw1Nzg0Nyw1Nzg0OCw1Nzg0OSw1Nzg1MCw1Nzg1MSw1Nzg1Miw1Nzg1Myw1Nzg1NCw1Nzg1NSw1Nzg1Niw1Nzg1Nyw1Nzg1OCw1Nzg1OSw1Nzg2MCw1Nzg2MSw1Nzg2Miw1Nzg2Myw1Nzg2NCw1Nzg2NSw1Nzg2Niw1Nzg2Nyw1Nzg2OCw1Nzg2OSw1Nzg3MCw1Nzg3MSw1Nzg3Miw1Nzg3Myw1Nzg3NCw1Nzg3NSw1Nzg3Niw1Nzg3Nyw1Nzg3OCw1Nzg3OSw1Nzg4MCw1Nzg4MSw1Nzg4Miw1Nzg4Myw1Nzg4NCw1Nzg4NSw1Nzg4Niw1Nzg4Nyw1Nzg4OCw1Nzg4OSw1Nzg5MCw1Nzg5MSw1Nzg5Miw1Nzg5Myw1Nzg5NCw1Nzg5NSw1Nzg5Niw1Nzg5Nyw1Nzg5OCw1Nzg5OSw1NzkwMCw1NzkwMSw1NzkwMiw1NzkwMyw1NzkwNCw1NzkwNSw1NzkwNiw1NzkwNywzMDI3NywzMDI3OCwzMDI3OSwzMDI4MCwzMDI4MSwzMDI4MiwzMDI4MywzMDI4NiwzMDI4NywzMDI4OCwzMDI4OSwzMDI5MCwzMDI5MSwzMDI5MywzMDI5NSwzMDI5NiwzMDI5NywzMDI5OCwzMDI5OSwzMDMwMSwzMDMwMywzMDMwNCwzMDMwNSwzMDMwNiwzMDMwOCwzMDMwOSwzMDMxMCwzMDMxMSwzMDMxMiwzMDMxMywzMDMxNCwzMDMxNiwzMDMxNywzMDMxOCwzMDMyMCwzMDMyMSwzMDMyMiwzMDMyMywzMDMyNCwzMDMyNSwzMDMyNiwzMDMyNywzMDMyOSwzMDMzMCwzMDMzMiwzMDMzNSwzMDMzNiwzMDMzNywzMDMzOSwzMDM0MSwzMDM0NSwzMDM0NiwzMDM0OCwzMDM0OSwzMDM1MSwzMDM1MiwzMDM1NCwzMDM1NiwzMDM1NywzMDM1OSwzMDM2MCwzMDM2MiwzMDM2MywzMDM2NCwzMDM2NSwzMDM2NiwzMDM2NywzMDM2OCwzMDM2OSwzMDM3MCwzMDM3MSwzMDM3MywzMDM3NCwzMDM3NSwzMDM3NiwzMDM3NywzMDM3OCwzMDM3OSwzMDM4MCwzMDM4MSwzMDM4MywzMDM4NCwzMDM4NywzMDM4OSwzMDM5MCwzMDM5MSwzMDM5MiwzMDM5MywzMDM5NCwzMDM5NSwzMDM5NiwzMDM5NywzMDM5OCwzMDQwMCwzMDQwMSwzMDQwMywyMTgzNCwzODQ2MywyMjQ2NywyNTM4NCwyMTcxMCwyMTc2OSwyMTY5NiwzMDM1MywzMDI4NCwzNDEwOCwzMDcwMiwzMzQwNiwzMDg2MSwyOTIzMywzODU1MiwzODc5NywyNzY4OCwyMzQzMywyMDQ3NCwyNTM1MywyNjI2MywyMzczNiwzMzAxOCwyNjY5NiwzMjk0MiwyNjExNCwzMDQxNCwyMDk4NSwyNTk0MiwyOTEwMCwzMjc1MywzNDk0OCwyMDY1OCwyMjg4NSwyNTAzNCwyODU5NSwzMzQ1MywyNTQyMCwyNTE3MCwyMTQ4NSwyMTU0MywzMTQ5NCwyMDg0MywzMDExNiwyNDA1MiwyNTMwMCwzNjI5OSwzODc3NCwyNTIyNiwzMjc5MywyMjM2NSwzODcxMiwzMjYxMCwyOTI0MCwzMDMzMywyNjU3NSwzMDMzNCwyNTY3MCwyMDMzNiwzNjEzMywyNTMwOCwzMTI1NSwyNjAwMSwyOTY3NywyNTY0NCwyNTIwMywzMzMyNCwzOTA0MSwyNjQ5NSwyOTI1NiwyNTE5OCwyNTI5MiwyMDI3NiwyOTkyMywyMTMyMiwyMTE1MCwzMjQ1OCwzNzAzMCwyNDExMCwyNjc1OCwyNzAzNiwzMzE1MiwzMjQ2NSwyNjgzNCwzMDkxNywzNDQ0NCwzODIyNSwyMDYyMSwzNTg3NiwzMzUwMiwzMjk5MCwyMTI1MywzNTA5MCwyMTA5MywzMDQwNCwzMDQwNywzMDQwOSwzMDQxMSwzMDQxMiwzMDQxOSwzMDQyMSwzMDQyNSwzMDQyNiwzMDQyOCwzMDQyOSwzMDQzMCwzMDQzMiwzMDQzMywzMDQzNCwzMDQzNSwzMDQzNiwzMDQzOCwzMDQzOSwzMDQ0MCwzMDQ0MSwzMDQ0MiwzMDQ0MywzMDQ0NCwzMDQ0NSwzMDQ0OCwzMDQ1MSwzMDQ1MywzMDQ1NCwzMDQ1NSwzMDQ1OCwzMDQ1OSwzMDQ2MSwzMDQ2MywzMDQ2NCwzMDQ2NiwzMDQ2NywzMDQ2OSwzMDQ3MCwzMDQ3NCwzMDQ3NiwzMDQ3OCwzMDQ3OSwzMDQ4MCwzMDQ4MSwzMDQ4MiwzMDQ4MywzMDQ4NCwzMDQ4NSwzMDQ4NiwzMDQ4NywzMDQ4OCwzMDQ5MSwzMDQ5MiwzMDQ5MywzMDQ5NCwzMDQ5NywzMDQ5OSwzMDUwMCwzMDUwMSwzMDUwMywzMDUwNiwzMDUwNywzMDUwOCwzMDUxMCwzMDUxMiwzMDUxMywzMDUxNCwzMDUxNSwzMDUxNiwzMDUyMSwzMDUyMywzMDUyNSwzMDUyNiwzMDUyNywzMDUzMCwzMDUzMiwzMDUzMywzMDUzNCwzMDUzNiwzMDUzNywzMDUzOCwzMDUzOSwzMDU0MCwzMDU0MSwzMDU0MiwzMDU0MywzMDU0NiwzMDU0NywzMDU0OCwzMDU0OSwzMDU1MCwzMDU1MSwzMDU1MiwzMDU1MywzMDU1NiwzNDE4MCwzODY0OSwyMDQ0NSwyMjU2MSwzOTI4MSwyMzQ1MywyNTI2NSwyNTI1MywyNjI5MiwzNTk2MSw0MDA3NywyOTE5MCwyNjQ3OSwzMDg2NSwyNDc1NCwyMTMyOSwyMTI3MSwzNjc0NCwzMjk3MiwzNjEyNSwzODA0OSwyMDQ5MywyOTM4NCwyMjc5MSwyNDgxMSwyODk1MywzNDk4NywyMjg2OCwzMzUxOSwyNjQxMiwzMTUyOCwyMzg0OSwzMjUwMywyOTk5NywyNzg5MywzNjQ1NCwzNjg1NiwzNjkyNCw0MDc2MywyNzYwNCwzNzE0NSwzMTUwOCwyNDQ0NCwzMDg4NywzNDAwNiwzNDEwOSwyNzYwNSwyNzYwOSwyNzYwNiwyNDA2NSwyNDE5OSwzMDIwMSwzODM4MSwyNTk0OSwyNDMzMCwyNDUxNywzNjc2NywyMjcyMSwzMzIxOCwzNjk5MSwzODQ5MSwzODgyOSwzNjc5MywzMjUzNCwzNjE0MCwyNTE1MywyMDQxNSwyMTQ2NCwyMTM0MiwzNjc3NiwzNjc3NywzNjc3OSwzNjk0MSwyNjYzMSwyNDQyNiwzMzE3NiwzNDkyMCw0MDE1MCwyNDk3MSwyMTAzNSwzMDI1MCwyNDQyOCwyNTk5NiwyODYyNiwyODM5MiwyMzQ4NiwyNTY3MiwyMDg1MywyMDkxMiwyNjU2NCwxOTk5MywzMTE3NywzOTI5MiwyODg1MSwzMDU1NywzMDU1OCwzMDU1OSwzMDU2MCwzMDU2NCwzMDU2NywzMDU2OSwzMDU3MCwzMDU3MywzMDU3NCwzMDU3NSwzMDU3NiwzMDU3NywzMDU3OCwzMDU3OSwzMDU4MCwzMDU4MSwzMDU4MiwzMDU4MywzMDU4NCwzMDU4NiwzMDU4NywzMDU4OCwzMDU5MywzMDU5NCwzMDU5NSwzMDU5OCwzMDU5OSwzMDYwMCwzMDYwMSwzMDYwMiwzMDYwMywzMDYwNywzMDYwOCwzMDYxMSwzMDYxMiwzMDYxMywzMDYxNCwzMDYxNSwzMDYxNiwzMDYxNywzMDYxOCwzMDYxOSwzMDYyMCwzMDYyMSwzMDYyMiwzMDYyNSwzMDYyNywzMDYyOCwzMDYzMCwzMDYzMiwzMDYzNSwzMDYzNywzMDYzOCwzMDYzOSwzMDY0MSwzMDY0MiwzMDY0NCwzMDY0NiwzMDY0NywzMDY0OCwzMDY0OSwzMDY1MCwzMDY1MiwzMDY1NCwzMDY1NiwzMDY1NywzMDY1OCwzMDY1OSwzMDY2MCwzMDY2MSwzMDY2MiwzMDY2MywzMDY2NCwzMDY2NSwzMDY2NiwzMDY2NywzMDY2OCwzMDY3MCwzMDY3MSwzMDY3MiwzMDY3MywzMDY3NCwzMDY3NSwzMDY3NiwzMDY3NywzMDY3OCwzMDY4MCwzMDY4MSwzMDY4MiwzMDY4NSwzMDY4NiwzMDY4NywzMDY4OCwzMDY4OSwzMDY5MiwzMDE0OSwyNDE4MiwyOTYyNywzMzc2MCwyNTc3MywyNTMyMCwzODA2OSwyNzg3NCwyMTMzOCwyMTE4NywyNTYxNSwzODA4MiwzMTYzNiwyMDI3MSwyNDA5MSwzMzMzNCwzMzA0NiwzMzE2MiwyODE5NiwyNzg1MCwzOTUzOSwyNTQyOSwyMTM0MCwyMTc1NCwzNDkxNywyMjQ5NiwxOTk4MSwyNDA2NywyNzQ5MywzMTgwNywzNzA5NiwyNDU5OCwyNTgzMCwyOTQ2OCwzNTAwOSwyNjQ0OCwyNTE2NSwzNjEzMCwzMDU3MiwzNjM5MywzNzMxOSwyNDQyNSwzMzc1NiwzNDA4MSwzOTE4NCwyMTQ0MiwzNDQ1MywyNzUzMSwyNDgxMywyNDgwOCwyODc5OSwzMzQ4NSwzMzMyOSwyMDE3OSwyNzgxNSwzNDI1NSwyNTgwNSwzMTk2MSwyNzEzMywyNjM2MSwzMzYwOSwyMTM5NywzMTU3NCwyMDM5MSwyMDg3NiwyNzk3OSwyMzYxOCwzNjQ2MSwyNTU1NCwyMTQ0OSwzMzU4MCwzMzU5MCwyNjU5NywzMDkwMCwyNTY2MSwyMzUxOSwyMzcwMCwyNDA0NiwzNTgxNSwyNTI4NiwyNjYxMiwzNTk2MiwyNTYwMCwyNTUzMCwzNDYzMywzOTMwNywzNTg2MywzMjU0NCwzODEzMCwyMDEzNSwzODQxNiwzOTA3NiwyNjEyNCwyOTQ2MiwzMDY5NCwzMDY5NiwzMDY5OCwzMDcwMywzMDcwNCwzMDcwNSwzMDcwNiwzMDcwOCwzMDcwOSwzMDcxMSwzMDcxMywzMDcxNCwzMDcxNSwzMDcxNiwzMDcyMywzMDcyNCwzMDcyNSwzMDcyNiwzMDcyNywzMDcyOCwzMDczMCwzMDczMSwzMDczNCwzMDczNSwzMDczNiwzMDczOSwzMDc0MSwzMDc0NSwzMDc0NywzMDc1MCwzMDc1MiwzMDc1MywzMDc1NCwzMDc1NiwzMDc2MCwzMDc2MiwzMDc2MywzMDc2NiwzMDc2NywzMDc2OSwzMDc3MCwzMDc3MSwzMDc3MywzMDc3NCwzMDc4MSwzMDc4MywzMDc4NSwzMDc4NiwzMDc4NywzMDc4OCwzMDc5MCwzMDc5MiwzMDc5MywzMDc5NCwzMDc5NSwzMDc5NywzMDc5OSwzMDgwMSwzMDgwMywzMDgwNCwzMDgwOCwzMDgwOSwzMDgxMCwzMDgxMSwzMDgxMiwzMDgxNCwzMDgxNSwzMDgxNiwzMDgxNywzMDgxOCwzMDgxOSwzMDgyMCwzMDgyMSwzMDgyMiwzMDgyMywzMDgyNCwzMDgyNSwzMDgzMSwzMDgzMiwzMDgzMywzMDgzNCwzMDgzNSwzMDgzNiwzMDgzNywzMDgzOCwzMDg0MCwzMDg0MSwzMDg0MiwzMDg0MywzMDg0NSwzMDg0NiwzMDg0NywzMDg0OCwzMDg0OSwzMDg1MCwzMDg1MSwyMjMzMCwyMzU4MSwyNDEyMCwzODI3MSwyMDYwNywzMjkyOCwyMTM3OCwyNTk1MCwzMDAyMSwyMTgwOSwyMDUxMywzNjIyOSwyNTIyMCwzODA0NiwyNjM5NywyMjA2NiwyODUyNiwyNDAzNCwyMTU1NywyODgxOCwzNjcxMCwyNTE5OSwyNTc2NCwyNTUwNywyNDQ0MywyODU1MiwzNzEwOCwzMzI1MSwzNjc4NCwyMzU3NiwyNjIxNiwyNDU2MSwyNzc4NSwzODQ3MiwzNjIyNSwzNDkyNCwyNTc0NSwzMTIxNiwyMjQ3OCwyNzIyNSwyNTEwNCwyMTU3NiwyMDA1NiwzMTI0MywyNDgwOSwyODU0OCwzNTgwMiwyNTIxNSwzNjg5NCwzOTU2MywzMTIwNCwyMTUwNywzMDE5NiwyNTM0NSwyMTI3MywyNzc0NCwzNjgzMSwyNDM0NywzOTUzNiwzMjgyNyw0MDgzMSwyMDM2MCwyMzYxMCwzNjE5NiwzMjcwOSwyNjAyMSwyODg2MSwyMDgwNSwyMDkxNCwzNDQxMSwyMzgxNSwyMzQ1NiwyNTI3NywzNzIyOCwzMDA2OCwzNjM2NCwzMTI2NCwyNDgzMywzMTYwOSwyMDE2NywzMjUwNCwzMDU5NywxOTk4NSwzMzI2MSwyMTAyMSwyMDk4NiwyNzI0OSwyMTQxNiwzNjQ4NywzODE0OCwzODYwNywyODM1MywzODUwMCwyNjk3MCwzMDg1MiwzMDg1MywzMDg1NCwzMDg1NiwzMDg1OCwzMDg1OSwzMDg2MywzMDg2NCwzMDg2NiwzMDg2OCwzMDg2OSwzMDg3MCwzMDg3MywzMDg3NywzMDg3OCwzMDg4MCwzMDg4MiwzMDg4NCwzMDg4NiwzMDg4OCwzMDg4OSwzMDg5MCwzMDg5MSwzMDg5MiwzMDg5MywzMDg5NCwzMDg5NSwzMDkwMSwzMDkwMiwzMDkwMywzMDkwNCwzMDkwNiwzMDkwNywzMDkwOCwzMDkwOSwzMDkxMSwzMDkxMiwzMDkxNCwzMDkxNSwzMDkxNiwzMDkxOCwzMDkxOSwzMDkyMCwzMDkyNCwzMDkyNSwzMDkyNiwzMDkyNywzMDkyOSwzMDkzMCwzMDkzMSwzMDkzNCwzMDkzNSwzMDkzNiwzMDkzOCwzMDkzOSwzMDk0MCwzMDk0MSwzMDk0MiwzMDk0MywzMDk0NCwzMDk0NSwzMDk0NiwzMDk0NywzMDk0OCwzMDk0OSwzMDk1MCwzMDk1MSwzMDk1MywzMDk1NCwzMDk1NSwzMDk1NywzMDk1OCwzMDk1OSwzMDk2MCwzMDk2MSwzMDk2MywzMDk2NSwzMDk2NiwzMDk2OCwzMDk2OSwzMDk3MSwzMDk3MiwzMDk3MywzMDk3NCwzMDk3NSwzMDk3NiwzMDk3OCwzMDk3OSwzMDk4MCwzMDk4MiwzMDk4MywzMDk4NCwzMDk4NSwzMDk4NiwzMDk4NywzMDk4OCwzMDc4NCwyMDY0OCwzMDY3OSwyNTYxNiwzNTMwMiwyMjc4OCwyNTU3MSwyNDAyOSwzMTM1OSwyNjk0MSwyMDI1NiwzMzMzNywyMTkxMiwyMDAxOCwzMDEyNiwzMTM4MywyNDE2MiwyNDIwMiwzODM4MywyMTAxOSwyMTU2MSwyODgxMCwyNTQ2MiwzODE4MCwyMjQwMiwyNjE0OSwyNjk0MywzNzI1NSwyMTc2NywyODE0NywzMjQzMSwzNDg1MCwyNTEzOSwzMjQ5NiwzMDEzMywzMzU3NiwzMDkxMywzODYwNCwzNjc2NiwyNDkwNCwyOTk0MywzNTc4OSwyNzQ5MiwyMTA1MCwzNjE3NiwyNzQyNSwzMjg3NCwzMzkwNSwyMjI1NywyMTI1NCwyMDE3NCwxOTk5NSwyMDk0NSwzMTg5NSwzNzI1OSwzMTc1MSwyMDQxOSwzNjQ3OSwzMTcxMywzMTM4OCwyNTcwMywyMzgyOCwyMDY1MiwzMzAzMCwzMDIwOSwzMTkyOSwyODE0MCwzMjczNiwyNjQ0OSwyMzM4NCwyMzU0NCwzMDkyMywyNTc3NCwyNTYxOSwyNTUxNCwyNTM4NywzODE2OSwyNTY0NSwzNjc5OCwzMTU3MiwzMDI0OSwyNTE3MSwyMjgyMywyMTU3NCwyNzUxMywyMDY0MywyNTE0MCwyNDEwMiwyNzUyNiwyMDE5NSwzNjE1MSwzNDk1NSwyNDQ1MywzNjkxMCwzMDk4OSwzMDk5MCwzMDk5MSwzMDk5MiwzMDk5MywzMDk5NCwzMDk5NiwzMDk5NywzMDk5OCwzMDk5OSwzMTAwMCwzMTAwMSwzMTAwMiwzMTAwMywzMTAwNCwzMTAwNSwzMTAwNywzMTAwOCwzMTAwOSwzMTAxMCwzMTAxMSwzMTAxMywzMTAxNCwzMTAxNSwzMTAxNiwzMTAxNywzMTAxOCwzMTAxOSwzMTAyMCwzMTAyMSwzMTAyMiwzMTAyMywzMTAyNCwzMTAyNSwzMTAyNiwzMTAyNywzMTAyOSwzMTAzMCwzMTAzMSwzMTAzMiwzMTAzMywzMTAzNywzMTAzOSwzMTA0MiwzMTA0MywzMTA0NCwzMTA0NSwzMTA0NywzMTA1MCwzMTA1MSwzMTA1MiwzMTA1MywzMTA1NCwzMTA1NSwzMTA1NiwzMTA1NywzMTA1OCwzMTA2MCwzMTA2MSwzMTA2NCwzMTA2NSwzMTA3MywzMTA3NSwzMTA3NiwzMTA3OCwzMTA4MSwzMTA4MiwzMTA4MywzMTA4NCwzMTA4NiwzMTA4OCwzMTA4OSwzMTA5MCwzMTA5MSwzMTA5MiwzMTA5MywzMTA5NCwzMTA5NywzMTA5OSwzMTEwMCwzMTEwMSwzMTEwMiwzMTEwMywzMTEwNiwzMTEwNywzMTExMCwzMTExMSwzMTExMiwzMTExMywzMTExNSwzMTExNiwzMTExNywzMTExOCwzMTEyMCwzMTEyMSwzMTEyMiwyNDYwOCwzMjgyOSwyNTI4NSwyMDAyNSwyMTMzMywzNzExMiwyNTUyOCwzMjk2NiwyNjA4NiwyNzY5NCwyMDI5NCwyNDgxNCwyODEyOSwzNTgwNiwyNDM3NywzNDUwNywyNDQwMywyNTM3NywyMDgyNiwzMzYzMywyNjcyMywyMDk5MiwyNTQ0MywzNjQyNCwyMDQ5OCwyMzcwNywzMTA5NSwyMzU0OCwyMTA0MCwzMTI5MSwyNDc2NCwzNjk0NywzMDQyMywyNDUwMywyNDQ3MSwzMDM0MCwzNjQ2MCwyODc4MywzMDMzMSwzMTU2MSwzMDYzNCwyMDk3OSwzNzAxMSwyMjU2NCwyMDMwMiwyODQwNCwzNjg0MiwyNTkzMiwzMTUxNSwyOTM4MCwyODA2OCwzMjczNSwyMzI2NSwyNTI2OSwyNDIxMywyMjMyMCwzMzkyMiwzMTUzMiwyNDA5MywyNDM1MSwzNjg4MiwzMjUzMiwzOTA3MiwyNTQ3NCwyODM1OSwzMDg3MiwyODg1NywyMDg1NiwzODc0NywyMjQ0MywzMDAwNSwyMDI5MSwzMDAwOCwyNDIxNSwyNDgwNiwyMjg4MCwyODA5NiwyNzU4MywzMDg1NywyMTUwMCwzODYxMywyMDkzOSwyMDk5MywyNTQ4MSwyMTUxNCwzODAzNSwzNTg0MywzNjMwMCwyOTI0MSwzMDg3OSwzNDY3OCwzNjg0NSwzNTg1MywyMTQ3MiwzMTEyMywzMTEyNCwzMTEyNSwzMTEyNiwzMTEyNywzMTEyOCwzMTEyOSwzMTEzMSwzMTEzMiwzMTEzMywzMTEzNCwzMTEzNSwzMTEzNiwzMTEzNywzMTEzOCwzMTEzOSwzMTE0MCwzMTE0MSwzMTE0MiwzMTE0NCwzMTE0NSwzMTE0NiwzMTE0NywzMTE0OCwzMTE0OSwzMTE1MCwzMTE1MSwzMTE1MiwzMTE1MywzMTE1NCwzMTE1NiwzMTE1NywzMTE1OCwzMTE1OSwzMTE2MCwzMTE2NCwzMTE2NywzMTE3MCwzMTE3MiwzMTE3MywzMTE3NSwzMTE3NiwzMTE3OCwzMTE4MCwzMTE4MiwzMTE4MywzMTE4NCwzMTE4NywzMTE4OCwzMTE5MCwzMTE5MSwzMTE5MywzMTE5NCwzMTE5NSwzMTE5NiwzMTE5NywzMTE5OCwzMTIwMCwzMTIwMSwzMTIwMiwzMTIwNSwzMTIwOCwzMTIxMCwzMTIxMiwzMTIxNCwzMTIxNywzMTIxOCwzMTIxOSwzMTIyMCwzMTIyMSwzMTIyMiwzMTIyMywzMTIyNSwzMTIyNiwzMTIyOCwzMTIzMCwzMTIzMSwzMTIzMywzMTIzNiwzMTIzNywzMTIzOSwzMTI0MCwzMTI0MSwzMTI0MiwzMTI0NCwzMTI0NywzMTI0OCwzMTI0OSwzMTI1MCwzMTI1MSwzMTI1MywzMTI1NCwzMTI1NiwzMTI1NywzMTI1OSwzMTI2MCwxOTk2OSwzMDQ0NywyMTQ4NiwzODAyNSwzOTAzMCw0MDcxOCwzODE4OSwyMzQ1MCwzNTc0NiwyMDAwMiwxOTk5NiwyMDkwOCwzMzg5MSwyNTAyNiwyMTE2MCwyNjYzNSwyMDM3NSwyNDY4MywyMDkyMywyNzkzNCwyMDgyOCwyNTIzOCwyNjAwNywzODQ5NywzNTkxMCwzNjg4NywzMDE2OCwzNzExNywzMDU2MywyNzYwMiwyOTMyMiwyOTQyMCwzNTgzNSwyMjU4MSwzMDU4NSwzNjE3MiwyNjQ2MCwzODIwOCwzMjkyMiwyNDIzMCwyODE5MywyMjkzMCwzMTQ3MSwzMDcwMSwzODIwMywyNzU3MywyNjAyOSwzMjUyNiwyMjUzNCwyMDgxNywzODQzMSwyMzU0NSwyMjY5NywyMTU0NCwzNjQ2NiwyNTk1OCwzOTAzOSwyMjI0NCwzODA0NSwzMDQ2MiwzNjkyOSwyNTQ3OSwyMTcwMiwyMjgxMCwyMjg0MiwyMjQyNywzNjUzMCwyNjQyMSwzNjM0NiwzMzMzMywyMTA1NywyNDgxNiwyMjU0OSwzNDU1OCwyMzc4NCw0MDUxNywyMDQyMCwzOTA2OSwzNTc2OSwyMzA3NywyNDY5NCwyMTM4MCwyNTIxMiwzNjk0MywzNzEyMiwzOTI5NSwyNDY4MSwzMjc4MCwyMDc5OSwzMjgxOSwyMzU3MiwzOTI4NSwyNzk1MywyMDEwOCwzMTI2MSwzMTI2MywzMTI2NSwzMTI2NiwzMTI2OCwzMTI2OSwzMTI3MCwzMTI3MSwzMTI3MiwzMTI3MywzMTI3NCwzMTI3NSwzMTI3NiwzMTI3NywzMTI3OCwzMTI3OSwzMTI4MCwzMTI4MSwzMTI4MiwzMTI4NCwzMTI4NSwzMTI4NiwzMTI4OCwzMTI5MCwzMTI5NCwzMTI5NiwzMTI5NywzMTI5OCwzMTI5OSwzMTMwMCwzMTMwMSwzMTMwMywzMTMwNCwzMTMwNSwzMTMwNiwzMTMwNywzMTMwOCwzMTMwOSwzMTMxMCwzMTMxMSwzMTMxMiwzMTMxNCwzMTMxNSwzMTMxNiwzMTMxNywzMTMxOCwzMTMyMCwzMTMyMSwzMTMyMiwzMTMyMywzMTMyNCwzMTMyNSwzMTMyNiwzMTMyNywzMTMyOCwzMTMyOSwzMTMzMCwzMTMzMSwzMTMzMiwzMTMzMywzMTMzNCwzMTMzNSwzMTMzNiwzMTMzNywzMTMzOCwzMTMzOSwzMTM0MCwzMTM0MSwzMTM0MiwzMTM0MywzMTM0NSwzMTM0NiwzMTM0NywzMTM0OSwzMTM1NSwzMTM1NiwzMTM1NywzMTM1OCwzMTM2MiwzMTM2NSwzMTM2NywzMTM2OSwzMTM3MCwzMTM3MSwzMTM3MiwzMTM3NCwzMTM3NSwzMTM3NiwzMTM3OSwzMTM4MCwzMTM4NSwzMTM4NiwzMTM4NywzMTM5MCwzMTM5MywzMTM5NCwzNjE0NCwyMTQ1NywzMjYwMiwzMTU2NywyMDI0MCwyMDA0NywzODQwMCwyNzg2MSwyOTY0OCwzNDI4MSwyNDA3MCwzMDA1OCwzMjc2MywyNzE0NiwzMDcxOCwzODAzNCwzMjMyMSwyMDk2MSwyODkwMiwyMTQ1MywzNjgyMCwzMzUzOSwzNjEzNywyOTM1OSwzOTI3NywyNzg2NywyMjM0NiwzMzQ1OSwyNjA0MSwzMjkzOCwyNTE1MSwzODQ1MCwyMjk1MiwyMDIyMywzNTc3NSwzMjQ0MiwyNTkxOCwzMzc3OCwzODc1MCwyMTg1NywzOTEzNCwzMjkzMywyMTI5MCwzNTgzNywyMTUzNiwzMjk1NCwyNDIyMywyNzgzMiwzNjE1MywzMzQ1MiwzNzIxMCwyMTU0NSwyNzY3NSwyMDk5OCwzMjQzOSwyMjM2NywyODk1NCwyNzc3NCwzMTg4MSwyMjg1OSwyMDIyMSwyNDU3NSwyNDg2OCwzMTkxNCwyMDAxNiwyMzU1MywyNjUzOSwzNDU2MiwyMzc5MiwzODE1NSwzOTExOCwzMDEyNywyODkyNSwzNjg5OCwyMDkxMSwzMjU0MSwzNTc3MywyMjg1NywyMDk2NCwyMDMxNSwyMTU0MiwyMjgyNywyNTk3NSwzMjkzMiwyMzQxMywyNTIwNiwyNTI4MiwzNjc1MiwyNDEzMywyNzY3OSwzMTUyNiwyMDIzOSwyMDQ0MCwyNjM4MSwzMTM5NSwzMTM5NiwzMTM5OSwzMTQwMSwzMTQwMiwzMTQwMywzMTQwNiwzMTQwNywzMTQwOCwzMTQwOSwzMTQxMCwzMTQxMiwzMTQxMywzMTQxNCwzMTQxNSwzMTQxNiwzMTQxNywzMTQxOCwzMTQxOSwzMTQyMCwzMTQyMSwzMTQyMiwzMTQyNCwzMTQyNSwzMTQyNiwzMTQyNywzMTQyOCwzMTQyOSwzMTQzMCwzMTQzMSwzMTQzMiwzMTQzMywzMTQzNCwzMTQzNiwzMTQzNywzMTQzOCwzMTQzOSwzMTQ0MCwzMTQ0MSwzMTQ0MiwzMTQ0MywzMTQ0NCwzMTQ0NSwzMTQ0NywzMTQ0OCwzMTQ1MCwzMTQ1MSwzMTQ1MiwzMTQ1MywzMTQ1NywzMTQ1OCwzMTQ2MCwzMTQ2MywzMTQ2NCwzMTQ2NSwzMTQ2NiwzMTQ2NywzMTQ2OCwzMTQ3MCwzMTQ3MiwzMTQ3MywzMTQ3NCwzMTQ3NSwzMTQ3NiwzMTQ3NywzMTQ3OCwzMTQ3OSwzMTQ4MCwzMTQ4MywzMTQ4NCwzMTQ4NiwzMTQ4OCwzMTQ4OSwzMTQ5MCwzMTQ5MywzMTQ5NSwzMTQ5NywzMTUwMCwzMTUwMSwzMTUwMiwzMTUwNCwzMTUwNiwzMTUwNywzMTUxMCwzMTUxMSwzMTUxMiwzMTUxNCwzMTUxNiwzMTUxNywzMTUxOSwzMTUyMSwzMTUyMiwzMTUyMywzMTUyNywzMTUyOSwzMTUzMywyODAxNCwyODA3NCwzMTExOSwzNDk5MywyNDM0MywyOTk5NSwyNTI0MiwzNjc0MSwyMDQ2MywzNzM0MCwyNjAyMywzMzA3MSwzMzEwNSwyNDIyMCwzMzEwNCwzNjIxMiwyMTEwMywzNTIwNiwzNjE3MSwyMjc5NywyMDYxMywyMDE4NCwzODQyOCwyOTIzOCwzMzE0NSwzNjEyNywyMzUwMCwzNTc0NywzODQ2OCwyMjkxOSwzMjUzOCwyMTY0OCwyMjEzNCwyMjAzMCwzNTgxMywyNTkxMywyNzAxMCwzODA0MSwzMDQyMiwyODI5NywyNDE3OCwyOTk3NiwyNjQzOCwyNjU3NywzMTQ4NywzMjkyNSwzNjIxNCwyNDg2MywzMTE3NCwyNTk1NCwzNjE5NSwyMDg3MiwyMTAxOCwzODA1MCwzMjU2OCwzMjkyMywzMjQzNCwyMzcwMywyODIwNywyNjQ2NCwzMTcwNSwzMDM0NywzOTY0MCwzMzE2NywzMjY2MCwzMTk1NywyNTYzMCwzODIyNCwzMTI5NSwyMTU3OCwyMTczMywyNzQ2OCwyNTYwMSwyNTA5Niw0MDUwOSwzMzAxMSwzMDEwNSwyMTEwNiwzODc2MSwzMzg4MywyNjY4NCwzNDUzMiwzODQwMSwzODU0OCwzODEyNCwyMDAxMCwyMTUwOCwzMjQ3MywyNjY4MSwzNjMxOSwzMjc4OSwyNjM1NiwyNDIxOCwzMjY5NywzMTUzNSwzMTUzNiwzMTUzOCwzMTU0MCwzMTU0MSwzMTU0MiwzMTU0MywzMTU0NSwzMTU0NywzMTU0OSwzMTU1MSwzMTU1MiwzMTU1MywzMTU1NCwzMTU1NSwzMTU1NiwzMTU1OCwzMTU2MCwzMTU2MiwzMTU2NSwzMTU2NiwzMTU3MSwzMTU3MywzMTU3NSwzMTU3NywzMTU4MCwzMTU4MiwzMTU4MywzMTU4NSwzMTU4NywzMTU4OCwzMTU4OSwzMTU5MCwzMTU5MSwzMTU5MiwzMTU5MywzMTU5NCwzMTU5NSwzMTU5NiwzMTU5NywzMTU5OSwzMTYwMCwzMTYwMywzMTYwNCwzMTYwNiwzMTYwOCwzMTYxMCwzMTYxMiwzMTYxMywzMTYxNSwzMTYxNywzMTYxOCwzMTYxOSwzMTYyMCwzMTYyMiwzMTYyMywzMTYyNCwzMTYyNSwzMTYyNiwzMTYyNywzMTYyOCwzMTYzMCwzMTYzMSwzMTYzMywzMTYzNCwzMTYzNSwzMTYzOCwzMTY0MCwzMTY0MSwzMTY0MiwzMTY0MywzMTY0NiwzMTY0NywzMTY0OCwzMTY1MSwzMTY1MiwzMTY1MywzMTY2MiwzMTY2MywzMTY2NCwzMTY2NiwzMTY2NywzMTY2OSwzMTY3MCwzMTY3MSwzMTY3MywzMTY3NCwzMTY3NSwzMTY3NiwzMTY3NywzMTY3OCwzMTY3OSwzMTY4MCwzMTY4MiwzMTY4MywzMTY4NCwyMjQ2NiwzMjgzMSwyNjc3NSwyNDAzNywyNTkxNSwyMTE1MSwyNDY4NSw0MDg1OCwyMDM3OSwzNjUyNCwyMDg0NCwyMzQ2NywyNDMzOSwyNDA0MSwyNzc0MiwyNTMyOSwzNjEyOSwyMDg0OSwzODA1NywyMTI0NiwyNzgwNywzMzUwMywyOTM5OSwyMjQzNCwyNjUwMCwzNjE0MSwyMjgxNSwzNjc2NCwzMzczNSwyMTY1MywzMTYyOSwyMDI3MiwyNzgzNywyMzM5NiwyMjk5Myw0MDcyMywyMTQ3NiwzNDUwNiwzOTU5MiwzNTg5NSwzMjkyOSwyNTkyNSwzOTAzOCwyMjI2NiwzODU5OSwyMTAzOCwyOTkxNiwyMTA3MiwyMzUyMSwyNTM0NiwzNTA3NCwyMDA1NCwyNTI5NiwyNDYxOCwyNjg3NCwyMDg1MSwyMzQ0OCwyMDg5NiwzNTI2NiwzMTY0OSwzOTMwMiwzMjU5MiwyNDgxNSwyODc0OCwzNjE0MywyMDgwOSwyNDE5MSwzNjg5MSwyOTgwOCwzNTI2OCwyMjMxNywzMDc4OSwyNDQwMiw0MDg2MywzODM5NCwzNjcxMiwzOTc0MCwzNTgwOSwzMDMyOCwyNjY5MCwyNjU4OCwzNjMzMCwzNjE0OSwyMTA1MywzNjc0NiwyODM3OCwyNjgyOSwzODE0OSwzNzEwMSwyMjI2OSwyNjUyNCwzNTA2NSwzNjgwNywyMTcwNCwzMTY4NSwzMTY4OCwzMTY4OSwzMTY5MCwzMTY5MSwzMTY5MywzMTY5NCwzMTY5NSwzMTY5NiwzMTY5OCwzMTcwMCwzMTcwMSwzMTcwMiwzMTcwMywzMTcwNCwzMTcwNywzMTcwOCwzMTcxMCwzMTcxMSwzMTcxMiwzMTcxNCwzMTcxNSwzMTcxNiwzMTcxOSwzMTcyMCwzMTcyMSwzMTcyMywzMTcyNCwzMTcyNSwzMTcyNywzMTcyOCwzMTczMCwzMTczMSwzMTczMiwzMTczMywzMTczNCwzMTczNiwzMTczNywzMTczOCwzMTczOSwzMTc0MSwzMTc0MywzMTc0NCwzMTc0NSwzMTc0NiwzMTc0NywzMTc0OCwzMTc0OSwzMTc1MCwzMTc1MiwzMTc1MywzMTc1NCwzMTc1NywzMTc1OCwzMTc2MCwzMTc2MSwzMTc2MiwzMTc2MywzMTc2NCwzMTc2NSwzMTc2NywzMTc2OCwzMTc2OSwzMTc3MCwzMTc3MSwzMTc3MiwzMTc3MywzMTc3NCwzMTc3NiwzMTc3NywzMTc3OCwzMTc3OSwzMTc4MCwzMTc4MSwzMTc4NCwzMTc4NSwzMTc4NywzMTc4OCwzMTc4OSwzMTc5MCwzMTc5MSwzMTc5MiwzMTc5MywzMTc5NCwzMTc5NSwzMTc5NiwzMTc5NywzMTc5OCwzMTc5OSwzMTgwMSwzMTgwMiwzMTgwMywzMTgwNCwzMTgwNSwzMTgwNiwzMTgxMCwzOTYwOCwyMzQwMSwyODAyMywyNzY4NiwyMDEzMywyMzQ3NSwzOTU1OSwzNzIxOSwyNTAwMCwzNzAzOSwzODg4OSwyMTU0NywyODA4NSwyMzUwNiwyMDk4OSwyMTg5OCwzMjU5NywzMjc1MiwyNTc4OCwyNTQyMSwyNjA5NywyNTAyMiwyNDcxNywyODkzOCwyNzczNSwyNzcyMSwyMjgzMSwyNjQ3NywzMzMyMiwyMjc0MSwyMjE1OCwzNTk0NiwyNzYyNywzNzA4NSwyMjkwOSwzMjc5MSwyMTQ5NSwyODAwOSwyMTYyMSwyMTkxNywzMzY1NSwzMzc0MywyNjY4MCwzMTE2NiwyMTY0NCwyMDMwOSwyMTUxMiwzMDQxOCwzNTk3NywzODQwMiwyNzgyNywyODA4OCwzNjIwMywzNTA4OCw0MDU0OCwzNjE1NCwyMjA3OSw0MDY1NywzMDE2NSwyNDQ1NiwyOTQwOCwyNDY4MCwyMTc1NiwyMDEzNiwyNzE3OCwzNDkxMywyNDY1OCwzNjcyMCwyMTcwMCwyODg4OCwzNDQyNSw0MDUxMSwyNzk0NiwyMzQzOSwyNDM0NCwzMjQxOCwyMTg5NywyMDM5OSwyOTQ5MiwyMTU2NCwyMTQwMiwyMDUwNSwyMTUxOCwyMTYyOCwyMDA0NiwyNDU3MywyOTc4NiwyMjc3NCwzMzg5OSwzMjk5MywzNDY3NiwyOTM5MiwzMTk0NiwyODI0NiwzMTgxMSwzMTgxMiwzMTgxMywzMTgxNCwzMTgxNSwzMTgxNiwzMTgxNywzMTgxOCwzMTgxOSwzMTgyMCwzMTgyMiwzMTgyMywzMTgyNCwzMTgyNSwzMTgyNiwzMTgyNywzMTgyOCwzMTgyOSwzMTgzMCwzMTgzMSwzMTgzMiwzMTgzMywzMTgzNCwzMTgzNSwzMTgzNiwzMTgzNywzMTgzOCwzMTgzOSwzMTg0MCwzMTg0MSwzMTg0MiwzMTg0MywzMTg0NCwzMTg0NSwzMTg0NiwzMTg0NywzMTg0OCwzMTg0OSwzMTg1MCwzMTg1MSwzMTg1MiwzMTg1MywzMTg1NCwzMTg1NSwzMTg1NiwzMTg1NywzMTg1OCwzMTg2MSwzMTg2MiwzMTg2MywzMTg2NCwzMTg2NSwzMTg2NiwzMTg3MCwzMTg3MSwzMTg3MiwzMTg3MywzMTg3NCwzMTg3NSwzMTg3NiwzMTg3NywzMTg3OCwzMTg3OSwzMTg4MCwzMTg4MiwzMTg4MywzMTg4NCwzMTg4NSwzMTg4NiwzMTg4NywzMTg4OCwzMTg5MSwzMTg5MiwzMTg5NCwzMTg5NywzMTg5OCwzMTg5OSwzMTkwNCwzMTkwNSwzMTkwNywzMTkxMCwzMTkxMSwzMTkxMiwzMTkxMywzMTkxNSwzMTkxNiwzMTkxNywzMTkxOSwzMTkyMCwzMTkyNCwzMTkyNSwzMTkyNiwzMTkyNywzMTkyOCwzMTkzMCwzMTkzMSwyNDM1OSwzNDM4MiwyMTgwNCwyNTI1MiwyMDExNCwyNzgxOCwyNTE0MywzMzQ1NywyMTcxOSwyMTMyNiwyOTUwMiwyODM2OSwzMDAxMSwyMTAxMCwyMTI3MCwzNTgwNSwyNzA4OCwyNDQ1OCwyNDU3NiwyODE0MiwyMjM1MSwyNzQyNiwyOTYxNSwyNjcwNywzNjgyNCwzMjUzMSwyNTQ0MiwyNDczOSwyMTc5NiwzMDE4NiwzNTkzOCwyODk0OSwyODA2NywyMzQ2MiwyNDE4NywzMzYxOCwyNDkwOCw0MDY0NCwzMDk3MCwzNDY0NywzMTc4MywzMDM0MywyMDk3NiwyNDgyMiwyOTAwNCwyNjE3OSwyNDE0MCwyNDY1MywzNTg1NCwyODc4NCwyNTM4MSwzNjc0NSwyNDUwOSwyNDY3NCwzNDUxNiwyMjIzOCwyNzU4NSwyNDcyNCwyNDkzNSwyMTMyMSwyNDgwMCwyNjIxNCwzNjE1OSwzMTIyOSwyMDI1MCwyODkwNSwyNzcxOSwzNTc2MywzNTgyNiwzMjQ3MiwzMzYzNiwyNjEyNywyMzEzMCwzOTc0NiwyNzk4NSwyODE1MSwzNTkwNSwyNzk2MywyMDI0OSwyODc3OSwzMzcxOSwyNTExMCwyNDc4NSwzODY2OSwzNjEzNSwzMTA5NiwyMDk4NywyMjMzNCwyMjUyMiwyNjQyNiwzMDA3MiwzMTI5MywzMTIxNSwzMTYzNywzMTkzNSwzMTkzNiwzMTkzOCwzMTkzOSwzMTk0MCwzMTk0MiwzMTk0NSwzMTk0NywzMTk1MCwzMTk1MSwzMTk1MiwzMTk1MywzMTk1NCwzMTk1NSwzMTk1NiwzMTk2MCwzMTk2MiwzMTk2MywzMTk2NSwzMTk2NiwzMTk2OSwzMTk3MCwzMTk3MSwzMTk3MiwzMTk3MywzMTk3NCwzMTk3NSwzMTk3NywzMTk3OCwzMTk3OSwzMTk4MCwzMTk4MSwzMTk4MiwzMTk4NCwzMTk4NSwzMTk4NiwzMTk4NywzMTk4OCwzMTk4OSwzMTk5MCwzMTk5MSwzMTk5MywzMTk5NCwzMTk5NiwzMTk5NywzMTk5OCwzMTk5OSwzMjAwMCwzMjAwMSwzMjAwMiwzMjAwMywzMjAwNCwzMjAwNSwzMjAwNiwzMjAwNywzMjAwOCwzMjAwOSwzMjAxMSwzMjAxMiwzMjAxMywzMjAxNCwzMjAxNSwzMjAxNiwzMjAxNywzMjAxOCwzMjAxOSwzMjAyMCwzMjAyMSwzMjAyMiwzMjAyMywzMjAyNCwzMjAyNSwzMjAyNiwzMjAyNywzMjAyOCwzMjAyOSwzMjAzMCwzMjAzMSwzMjAzMywzMjAzNSwzMjAzNiwzMjAzNywzMjAzOCwzMjA0MCwzMjA0MSwzMjA0MiwzMjA0NCwzMjA0NSwzMjA0NiwzMjA0OCwzMjA0OSwzMjA1MCwzMjA1MSwzMjA1MiwzMjA1MywzMjA1NCwzMjkwOCwzOTI2OSwzNjg1NywyODYwOCwzNTc0OSw0MDQ4MSwyMzAyMCwzMjQ4OSwzMjUyMSwyMTUxMywyNjQ5NywyNjg0MCwzNjc1MywzMTgyMSwzODU5OCwyMTQ1MCwyNDYxMywzMDE0MiwyNzc2MiwyMTM2MywyMzI0MSwzMjQyMywyNTM4MCwyMDk2MCwzMzAzNCwyNDA0OSwzNDAxNSwyNTIxNiwyMDg2NCwyMzM5NSwyMDIzOCwzMTA4NSwyMTA1OCwyNDc2MCwyNzk4MiwyMzQ5MiwyMzQ5MCwzNTc0NSwzNTc2MCwyNjA4MiwyNDUyNCwzODQ2OSwyMjkzMSwzMjQ4NywzMjQyNiwyMjAyNSwyNjU1MSwyMjg0MSwyMDMzOSwyMzQ3OCwyMTE1MiwzMzYyNiwzOTA1MCwzNjE1OCwzMDAwMiwzODA3OCwyMDU1MSwzMTI5MiwyMDIxNSwyNjU1MCwzOTU1MCwyMzIzMywyNzUxNiwzMDQxNywyMjM2MiwyMzU3NCwzMTU0NiwzODM4OCwyOTAwNiwyMDg2MCwzMjkzNywzMzM5MiwyMjkwNCwzMjUxNiwzMzU3NSwyNjgxNiwyNjYwNCwzMDg5NywzMDgzOSwyNTMxNSwyNTQ0MSwzMTYxNiwyMDQ2MSwyMTA5OCwyMDk0MywzMzYxNiwyNzA5OSwzNzQ5MiwzNjM0MSwzNjE0NSwzNTI2NSwzODE5MCwzMTY2MSwyMDIxNCwzMjA1NSwzMjA1NiwzMjA1NywzMjA1OCwzMjA1OSwzMjA2MCwzMjA2MSwzMjA2MiwzMjA2MywzMjA2NCwzMjA2NSwzMjA2NiwzMjA2NywzMjA2OCwzMjA2OSwzMjA3MCwzMjA3MSwzMjA3MiwzMjA3MywzMjA3NCwzMjA3NSwzMjA3NiwzMjA3NywzMjA3OCwzMjA3OSwzMjA4MCwzMjA4MSwzMjA4MiwzMjA4MywzMjA4NCwzMjA4NSwzMjA4NiwzMjA4NywzMjA4OCwzMjA4OSwzMjA5MCwzMjA5MSwzMjA5MiwzMjA5MywzMjA5NCwzMjA5NSwzMjA5NiwzMjA5NywzMjA5OCwzMjA5OSwzMjEwMCwzMjEwMSwzMjEwMiwzMjEwMywzMjEwNCwzMjEwNSwzMjEwNiwzMjEwNywzMjEwOCwzMjEwOSwzMjExMSwzMjExMiwzMjExMywzMjExNCwzMjExNSwzMjExNiwzMjExNywzMjExOCwzMjEyMCwzMjEyMSwzMjEyMiwzMjEyMywzMjEyNCwzMjEyNSwzMjEyNiwzMjEyNywzMjEyOCwzMjEyOSwzMjEzMCwzMjEzMSwzMjEzMiwzMjEzMywzMjEzNCwzMjEzNSwzMjEzNiwzMjEzNywzMjEzOCwzMjEzOSwzMjE0MCwzMjE0MSwzMjE0MiwzMjE0MywzMjE0NCwzMjE0NSwzMjE0NiwzMjE0NywzMjE0OCwzMjE0OSwzMjE1MCwzMjE1MSwzMjE1MiwyMDU4MSwzMzMyOCwyMTA3MywzOTI3OSwyODE3NiwyODI5MywyODA3MSwyNDMxNCwyMDcyNSwyMzAwNCwyMzU1OCwyNzk3NCwyNzc0MywzMDA4NiwzMzkzMSwyNjcyOCwyMjg3MCwzNTc2MiwyMTI4MCwzNzIzMywzODQ3NywzNDEyMSwyNjg5OCwzMDk3NywyODk2NiwzMzAxNCwyMDEzMiwzNzA2NiwyNzk3NSwzOTU1NiwyMzA0NywyMjIwNCwyNTYwNSwzODEyOCwzMDY5OSwyMDM4OSwzMzA1MCwyOTQwOSwzNTI4MiwzOTI5MCwzMjU2NCwzMjQ3OCwyMTExOSwyNTk0NSwzNzIzNywzNjczNSwzNjczOSwyMTQ4MywzMTM4MiwyNTU4MSwyNTUwOSwzMDM0MiwzMTIyNCwzNDkwMywzODQ1NCwyNTEzMCwyMTE2MywzMzQxMCwyNjcwOCwyNjQ4MCwyNTQ2MywzMDU3MSwzMTQ2OSwyNzkwNSwzMjQ2NywzNTI5OSwyMjk5MiwyNTEwNiwzNDI0OSwzMzQ0NSwzMDAyOCwyMDUxMSwyMDE3MSwzMDExNywzNTgxOSwyMzYyNiwyNDA2MiwzMTU2MywyNjAyMCwzNzMyOSwyMDE3MCwyNzk0MSwzNTE2NywzMjAzOSwzODE4MiwyMDE2NSwzNTg4MCwzNjgyNywzODc3MSwyNjE4NywzMTEwNSwzNjgxNywyODkwOCwyODAyNCwzMjE1MywzMjE1NCwzMjE1NSwzMjE1NiwzMjE1NywzMjE1OCwzMjE1OSwzMjE2MCwzMjE2MSwzMjE2MiwzMjE2MywzMjE2NCwzMjE2NSwzMjE2NywzMjE2OCwzMjE2OSwzMjE3MCwzMjE3MSwzMjE3MiwzMjE3MywzMjE3NSwzMjE3NiwzMjE3NywzMjE3OCwzMjE3OSwzMjE4MCwzMjE4MSwzMjE4MiwzMjE4MywzMjE4NCwzMjE4NSwzMjE4NiwzMjE4NywzMjE4OCwzMjE4OSwzMjE5MCwzMjE5MSwzMjE5MiwzMjE5MywzMjE5NCwzMjE5NSwzMjE5NiwzMjE5NywzMjE5OCwzMjE5OSwzMjIwMCwzMjIwMSwzMjIwMiwzMjIwMywzMjIwNCwzMjIwNSwzMjIwNiwzMjIwNywzMjIwOCwzMjIwOSwzMjIxMCwzMjIxMSwzMjIxMiwzMjIxMywzMjIxNCwzMjIxNSwzMjIxNiwzMjIxNywzMjIxOCwzMjIxOSwzMjIyMCwzMjIyMSwzMjIyMiwzMjIyMywzMjIyNCwzMjIyNSwzMjIyNiwzMjIyNywzMjIyOCwzMjIyOSwzMjIzMCwzMjIzMSwzMjIzMiwzMjIzMywzMjIzNCwzMjIzNSwzMjIzNiwzMjIzNywzMjIzOCwzMjIzOSwzMjI0MCwzMjI0MSwzMjI0MiwzMjI0MywzMjI0NCwzMjI0NSwzMjI0NiwzMjI0NywzMjI0OCwzMjI0OSwzMjI1MCwyMzYxMywyMTE3MCwzMzYwNiwyMDgzNCwzMzU1MCwzMDU1NSwyNjIzMCw0MDEyMCwyMDE0MCwyNDc3OCwzMTkzNCwzMTkyMywzMjQ2MywyMDExNywzNTY4NiwyNjIyMywzOTA0OCwzODc0NSwyMjY1OSwyNTk2NCwzODIzNiwyNDQ1MiwzMDE1MywzODc0MiwzMTQ1NSwzMTQ1NCwyMDkyOCwyODg0NywzMTM4NCwyNTU3OCwzMTM1MCwzMjQxNiwyOTU5MCwzODg5MywyMDAzNywyODc5MiwyMDA2MSwzNzIwMiwyMTQxNywyNTkzNywyNjA4NywzMzI3NiwzMzI4NSwyMTY0NiwyMzYwMSwzMDEwNiwzODgxNiwyNTMwNCwyOTQwMSwzMDE0MSwyMzYyMSwzOTU0NSwzMzczOCwyMzYxNiwyMTYzMiwzMDY5NywyMDAzMCwyNzgyMiwzMjg1OCwyNTI5OCwyNTQ1NCwyNDA0MCwyMDg1NSwzNjMxNywzNjM4MiwzODE5MSwyMDQ2NSwyMTQ3NywyNDgwNywyODg0NCwyMTA5NSwyNTQyNCw0MDUxNSwyMzA3MSwyMDUxOCwzMDUxOSwyMTM2NywzMjQ4MiwyNTczMywyNTg5OSwyNTIyNSwyNTQ5NiwyMDUwMCwyOTIzNywzNTI3MywyMDkxNSwzNTc3NiwzMjQ3NywyMjM0MywzMzc0MCwzODA1NSwyMDg5MSwyMTUzMSwyMzgwMywzMjI1MSwzMjI1MiwzMjI1MywzMjI1NCwzMjI1NSwzMjI1NiwzMjI1NywzMjI1OCwzMjI1OSwzMjI2MCwzMjI2MSwzMjI2MiwzMjI2MywzMjI2NCwzMjI2NSwzMjI2NiwzMjI2NywzMjI2OCwzMjI2OSwzMjI3MCwzMjI3MSwzMjI3MiwzMjI3MywzMjI3NCwzMjI3NSwzMjI3NiwzMjI3NywzMjI3OCwzMjI3OSwzMjI4MCwzMjI4MSwzMjI4MiwzMjI4MywzMjI4NCwzMjI4NSwzMjI4NiwzMjI4NywzMjI4OCwzMjI4OSwzMjI5MCwzMjI5MSwzMjI5MiwzMjI5MywzMjI5NCwzMjI5NSwzMjI5NiwzMjI5NywzMjI5OCwzMjI5OSwzMjMwMCwzMjMwMSwzMjMwMiwzMjMwMywzMjMwNCwzMjMwNSwzMjMwNiwzMjMwNywzMjMwOCwzMjMwOSwzMjMxMCwzMjMxMSwzMjMxMiwzMjMxMywzMjMxNCwzMjMxNiwzMjMxNywzMjMxOCwzMjMxOSwzMjMyMCwzMjMyMiwzMjMyMywzMjMyNCwzMjMyNSwzMjMyNiwzMjMyOCwzMjMyOSwzMjMzMCwzMjMzMSwzMjMzMiwzMjMzMywzMjMzNCwzMjMzNSwzMjMzNiwzMjMzNywzMjMzOCwzMjMzOSwzMjM0MCwzMjM0MSwzMjM0MiwzMjM0MywzMjM0NCwzMjM0NSwzMjM0NiwzMjM0NywzMjM0OCwzMjM0OSwyMDQyNiwzMTQ1OSwyNzk5NCwzNzA4OSwzOTU2NywyMTg4OCwyMTY1NCwyMTM0NSwyMTY3OSwyNDMyMCwyNTU3NywyNjk5OSwyMDk3NSwyNDkzNiwyMTAwMiwyMjU3MCwyMTIwOCwyMjM1MCwzMDczMywzMDQ3NSwyNDI0NywyNDk1MSwzMTk2OCwyNTE3OSwyNTIzOSwyMDEzMCwyODgyMSwzMjc3MSwyNTMzNSwyODkwMCwzODc1MiwyMjM5MSwzMzQ5OSwyNjYwNywyNjg2OSwzMDkzMywzOTA2MywzMTE4NSwyMjc3MSwyMTY4MywyMTQ4NywyODIxMiwyMDgxMSwyMTA1MSwyMzQ1OCwzNTgzOCwzMjk0MywyMTgyNywyMjQzOCwyNDY5MSwyMjM1MywyMTU0OSwzMTM1NCwyNDY1NiwyMzM4MCwyNTUxMSwyNTI0OCwyMTQ3NSwyNTE4NywyMzQ5NSwyNjU0MywyMTc0MSwzMTM5MSwzMzUxMCwzNzIzOSwyNDIxMSwzNTA0NCwyMjg0MCwyMjQ0NiwyNTM1OCwzNjMyOCwzMzAwNywyMjM1OSwzMTYwNywyMDM5MywyNDU1NSwyMzQ4NSwyNzQ1NCwyMTI4MSwzMTU2OCwyOTM3OCwyNjY5NCwzMDcxOSwzMDUxOCwyNjEwMywyMDkxNywyMDExMSwzMDQyMCwyMzc0MywzMTM5NywzMzkwOSwyMjg2MiwzOTc0NSwyMDYwOCwzMjM1MCwzMjM1MSwzMjM1MiwzMjM1MywzMjM1NCwzMjM1NSwzMjM1NiwzMjM1NywzMjM1OCwzMjM1OSwzMjM2MCwzMjM2MSwzMjM2MiwzMjM2MywzMjM2NCwzMjM2NSwzMjM2NiwzMjM2NywzMjM2OCwzMjM2OSwzMjM3MCwzMjM3MSwzMjM3MiwzMjM3MywzMjM3NCwzMjM3NSwzMjM3NiwzMjM3NywzMjM3OCwzMjM3OSwzMjM4MCwzMjM4MSwzMjM4MiwzMjM4MywzMjM4NCwzMjM4NSwzMjM4NywzMjM4OCwzMjM4OSwzMjM5MCwzMjM5MSwzMjM5MiwzMjM5MywzMjM5NCwzMjM5NSwzMjM5NiwzMjM5NywzMjM5OCwzMjM5OSwzMjQwMCwzMjQwMSwzMjQwMiwzMjQwMywzMjQwNCwzMjQwNSwzMjQwNiwzMjQwNywzMjQwOCwzMjQwOSwzMjQxMCwzMjQxMiwzMjQxMywzMjQxNCwzMjQzMCwzMjQzNiwzMjQ0MywzMjQ0NCwzMjQ3MCwzMjQ4NCwzMjQ5MiwzMjUwNSwzMjUyMiwzMjUyOCwzMjU0MiwzMjU2NywzMjU2OSwzMjU3MSwzMjU3MiwzMjU3MywzMjU3NCwzMjU3NSwzMjU3NiwzMjU3NywzMjU3OSwzMjU4MiwzMjU4MywzMjU4NCwzMjU4NSwzMjU4NiwzMjU4NywzMjU4OCwzMjU4OSwzMjU5MCwzMjU5MSwzMjU5NCwzMjU5NSwzOTMwNCwyNDg3MSwyODI5MSwyMjM3MiwyNjExOCwyNTQxNCwyMjI1NiwyNTMyNCwyNTE5MywyNDI3NSwzODQyMCwyMjQwMywyNTI4OSwyMTg5NSwzNDU5MywzMzA5OCwzNjc3MSwyMTg2MiwzMzcxMywyNjQ2OSwzNjE4MiwzNDAxMywyMzE0NiwyNjYzOSwyNTMxOCwzMTcyNiwzODQxNywyMDg0OCwyODU3MiwzNTg4OCwyNTU5NywzNTI3MiwyNTA0MiwzMjUxOCwyODg2NiwyODM4OSwyOTcwMSwyNzAyOCwyOTQzNiwyNDI2NiwzNzA3MCwyNjM5MSwyODAxMCwyNTQzOCwyMTE3MSwyOTI4MiwzMjc2OSwyMDMzMiwyMzAxMywzNzIyNiwyODg4OSwyODA2MSwyMTIwMiwyMDA0OCwzODY0NywzODI1MywzNDE3NCwzMDkyMiwzMjA0NywyMDc2OSwyMjQxOCwyNTc5NCwzMjkwNywzMTg2NywyNzg4MiwyNjg2NSwyNjk3NCwyMDkxOSwyMTQwMCwyNjc5MiwyOTMxMyw0MDY1NCwzMTcyOSwyOTQzMiwzMTE2MywyODQzNSwyOTcwMiwyNjQ0NiwzNzMyNCw0MDEwMCwzMTAzNiwzMzY3MywzMzYyMCwyMTUxOSwyNjY0NywyMDAyOSwyMTM4NSwyMTE2OSwzMDc4MiwyMTM4MiwyMTAzMywyMDYxNiwyMDM2MywyMDQzMiwzMjU5OCwzMjYwMSwzMjYwMywzMjYwNCwzMjYwNSwzMjYwNiwzMjYwOCwzMjYxMSwzMjYxMiwzMjYxMywzMjYxNCwzMjYxNSwzMjYxOSwzMjYyMCwzMjYyMSwzMjYyMywzMjYyNCwzMjYyNywzMjYyOSwzMjYzMCwzMjYzMSwzMjYzMiwzMjYzNCwzMjYzNSwzMjYzNiwzMjYzNywzMjYzOSwzMjY0MCwzMjY0MiwzMjY0MywzMjY0NCwzMjY0NSwzMjY0NiwzMjY0NywzMjY0OCwzMjY0OSwzMjY1MSwzMjY1MywzMjY1NSwzMjY1NiwzMjY1NywzMjY1OCwzMjY1OSwzMjY2MSwzMjY2MiwzMjY2MywzMjY2NCwzMjY2NSwzMjY2NywzMjY2OCwzMjY3MiwzMjY3NCwzMjY3NSwzMjY3NywzMjY3OCwzMjY4MCwzMjY4MSwzMjY4MiwzMjY4MywzMjY4NCwzMjY4NSwzMjY4NiwzMjY4OSwzMjY5MSwzMjY5MiwzMjY5MywzMjY5NCwzMjY5NSwzMjY5OCwzMjY5OSwzMjcwMiwzMjcwNCwzMjcwNiwzMjcwNywzMjcwOCwzMjcxMCwzMjcxMSwzMjcxMiwzMjcxMywzMjcxNSwzMjcxNywzMjcxOSwzMjcyMCwzMjcyMSwzMjcyMiwzMjcyMywzMjcyNiwzMjcyNywzMjcyOSwzMjczMCwzMjczMSwzMjczMiwzMjczMywzMjczNCwzMjczOCwzMjczOSwzMDE3OCwzMTQzNSwzMTg5MCwyNzgxMywzODU4MiwyMTE0NywyOTgyNywyMTczNywyMDQ1NywzMjg1MiwzMzcxNCwzNjgzMCwzODI1NiwyNDI2NSwyNDYwNCwyODA2MywyNDA4OCwyNTk0NywzMzA4MCwzODE0MiwyNDY1MSwyODg2MCwzMjQ1MSwzMTkxOCwyMDkzNywyNjc1MywzMTkyMSwzMzM5MSwyMDAwNCwzNjc0MiwzNzMyNywyNjIzOCwyMDE0MiwzNTg0NSwyNTc2OSwzMjg0MiwyMDY5OCwzMDEwMywyOTEzNCwyMzUyNSwzNjc5NywyODUxOCwyMDEwMiwyNTczMCwzODI0MywyNDI3OCwyNjAwOSwyMTAxNSwzNTAxMCwyODg3MiwyMTE1NSwyOTQ1NCwyOTc0NywyNjUxOSwzMDk2NywzODY3OCwyMDAyMCwzNzA1MSw0MDE1OCwyODEwNywyMDk1NSwzNjE2MSwyMTUzMywyNTI5NCwyOTYxOCwzMzc3NywzODY0Niw0MDgzNiwzODA4MywyMDI3OCwzMjY2NiwyMDk0MCwyODc4OSwzODUxNywyMzcyNSwzOTA0NiwyMTQ3OCwyMDE5NiwyODMxNiwyOTcwNSwyNzA2MCwzMDgyNywzOTMxMSwzMDA0MSwyMTAxNiwzMDI0NCwyNzk2OSwyNjYxMSwyMDg0NSw0MDg1NywzMjg0MywyMTY1NywzMTU0OCwzMTQyMywzMjc0MCwzMjc0MywzMjc0NCwzMjc0NiwzMjc0NywzMjc0OCwzMjc0OSwzMjc1MSwzMjc1NCwzMjc1NiwzMjc1NywzMjc1OCwzMjc1OSwzMjc2MCwzMjc2MSwzMjc2MiwzMjc2NSwzMjc2NiwzMjc2NywzMjc3MCwzMjc3NSwzMjc3NiwzMjc3NywzMjc3OCwzMjc4MiwzMjc4MywzMjc4NSwzMjc4NywzMjc5NCwzMjc5NSwzMjc5NywzMjc5OCwzMjc5OSwzMjgwMSwzMjgwMywzMjgwNCwzMjgxMSwzMjgxMiwzMjgxMywzMjgxNCwzMjgxNSwzMjgxNiwzMjgxOCwzMjgyMCwzMjgyNSwzMjgyNiwzMjgyOCwzMjgzMCwzMjgzMiwzMjgzMywzMjgzNiwzMjgzNywzMjgzOSwzMjg0MCwzMjg0MSwzMjg0NiwzMjg0NywzMjg0OCwzMjg0OSwzMjg1MSwzMjg1MywzMjg1NCwzMjg1NSwzMjg1NywzMjg1OSwzMjg2MCwzMjg2MSwzMjg2MiwzMjg2MywzMjg2NCwzMjg2NSwzMjg2NiwzMjg2NywzMjg2OCwzMjg2OSwzMjg3MCwzMjg3MSwzMjg3MiwzMjg3NSwzMjg3NiwzMjg3NywzMjg3OCwzMjg3OSwzMjg4MCwzMjg4MiwzMjg4MywzMjg4NCwzMjg4NSwzMjg4NiwzMjg4NywzMjg4OCwzMjg4OSwzMjg5MCwzMjg5MSwzMjg5MiwzMjg5MywzODUzNCwyMjQwNCwyNTMxNCwzODQ3MSwyNzAwNCwyMzA0NCwyNTYwMiwzMTY5OSwyODQzMSwzODQ3NSwzMzQ0NiwyMTM0NiwzOTA0NSwyNDIwOCwyODgwOSwyNTUyMywyMTM0OCwzNDM4Myw0MDA2NSw0MDU5NSwzMDg2MCwzODcwNiwzNjMzNSwzNjE2Miw0MDU3NSwyODUxMCwzMTEwOCwyNDQwNSwzODQ3MCwyNTEzNCwzOTU0MCwyMTUyNSwzODEwOSwyMDM4NywyNjA1MywyMzY1MywyMzY0OSwzMjUzMywzNDM4NSwyNzY5NSwyNDQ1OSwyOTU3NSwyODM4OCwzMjUxMSwyMzc4MiwyNTM3MSwyMzQwMiwyODM5MCwyMTM2NSwyMDA4MSwyNTUwNCwzMDA1MywyNTI0OSwzNjcxOCwyMDI2MiwyMDE3NywyNzgxNCwzMjQzOCwzNTc3MCwzMzgyMSwzNDc0NiwzMjU5OSwzNjkyMywzODE3OSwzMTY1NywzOTU4NSwzNTA2NCwzMzg1MywyNzkzMSwzOTU1OCwzMjQ3NiwyMjkyMCw0MDYzNSwyOTU5NSwzMDcyMSwzNDQzNCwzOTUzMiwzOTU1NCwyMjA0MywyMTUyNywyMjQ3NSwyMDA4MCw0MDYxNCwyMTMzNCwzNjgwOCwzMzAzMywzMDYxMCwzOTMxNCwzNDU0MiwyODM4NSwzNDA2NywyNjM2NCwyNDkzMCwyODQ1OSwzMjg5NCwzMjg5NywzMjg5OCwzMjkwMSwzMjkwNCwzMjkwNiwzMjkwOSwzMjkxMCwzMjkxMSwzMjkxMiwzMjkxMywzMjkxNCwzMjkxNiwzMjkxNywzMjkxOSwzMjkyMSwzMjkyNiwzMjkzMSwzMjkzNCwzMjkzNSwzMjkzNiwzMjk0MCwzMjk0NCwzMjk0NywzMjk0OSwzMjk1MCwzMjk1MiwzMjk1MywzMjk1NSwzMjk2NSwzMjk2NywzMjk2OCwzMjk2OSwzMjk3MCwzMjk3MSwzMjk3NSwzMjk3NiwzMjk3NywzMjk3OCwzMjk3OSwzMjk4MCwzMjk4MSwzMjk4NCwzMjk5MSwzMjk5MiwzMjk5NCwzMjk5NSwzMjk5OCwzMzAwNiwzMzAxMywzMzAxNSwzMzAxNywzMzAxOSwzMzAyMiwzMzAyMywzMzAyNCwzMzAyNSwzMzAyNywzMzAyOCwzMzAyOSwzMzAzMSwzMzAzMiwzMzAzNSwzMzAzNiwzMzA0NSwzMzA0NywzMzA0OSwzMzA1MSwzMzA1MiwzMzA1MywzMzA1NSwzMzA1NiwzMzA1NywzMzA1OCwzMzA1OSwzMzA2MCwzMzA2MSwzMzA2MiwzMzA2MywzMzA2NCwzMzA2NSwzMzA2NiwzMzA2NywzMzA2OSwzMzA3MCwzMzA3MiwzMzA3NSwzMzA3NiwzMzA3NywzMzA3OSwzMzA4MSwzMzA4MiwzMzA4MywzMzA4NCwzMzA4NSwzMzA4NywzNTg4MSwzMzQyNiwzMzU3OSwzMDQ1MCwyNzY2NywyNDUzNywzMzcyNSwyOTQ4MywzMzU0MSwzODE3MCwyNzYxMSwzMDY4MywzODA4NiwyMTM1OSwzMzUzOCwyMDg4MiwyNDEyNSwzNTk4MCwzNjE1MiwyMDA0MCwyOTYxMSwyNjUyMiwyNjc1NywzNzIzOCwzODY2NSwyOTAyOCwyNzgwOSwzMDQ3MywyMzE4NiwzODIwOSwyNzU5OSwzMjY1NCwyNjE1MSwyMzUwNCwyMjk2OSwyMzE5NCwzODM3NiwzODM5MSwyMDIwNCwzMzgwNCwzMzk0NSwyNzMwOCwzMDQzMSwzODE5MiwyOTQ2NywyNjc5MCwyMzM5MSwzMDUxMSwzNzI3NCwzODc1MywzMTk2NCwzNjg1NSwzNTg2OCwyNDM1NywzMTg1OSwzMTE5MiwzNTI2OSwyNzg1MiwzNDU4OCwyMzQ5NCwyNDEzMCwyNjgyNSwzMDQ5NiwzMjUwMSwyMDg4NSwyMDgxMywyMTE5MywyMzA4MSwzMjUxNywzODc1NCwzMzQ5NSwyNTU1MSwzMDU5NiwzNDI1NiwzMTE4NiwyODIxOCwyNDIxNywyMjkzNywzNDA2NSwyODc4MSwyNzY2NSwyNTI3OSwzMDM5OSwyNTkzNSwyNDc1MSwzODM5NywyNjEyNiwzNDcxOSw0MDQ4MywzODEyNSwyMTUxNywyMTYyOSwzNTg4NCwyNTcyMCwzMzA4OCwzMzA4OSwzMzA5MCwzMzA5MSwzMzA5MiwzMzA5MywzMzA5NSwzMzA5NywzMzEwMSwzMzEwMiwzMzEwMywzMzEwNiwzMzExMCwzMzExMSwzMzExMiwzMzExNSwzMzExNiwzMzExNywzMzExOCwzMzExOSwzMzEyMSwzMzEyMiwzMzEyMywzMzEyNCwzMzEyNiwzMzEyOCwzMzEzMCwzMzEzMSwzMzEzMiwzMzEzNSwzMzEzOCwzMzEzOSwzMzE0MSwzMzE0MiwzMzE0MywzMzE0NCwzMzE1MywzMzE1NSwzMzE1NiwzMzE1NywzMzE1OCwzMzE1OSwzMzE2MSwzMzE2MywzMzE2NCwzMzE2NSwzMzE2NiwzMzE2OCwzMzE3MCwzMzE3MSwzMzE3MiwzMzE3MywzMzE3NCwzMzE3NSwzMzE3NywzMzE3OCwzMzE4MiwzMzE4MywzMzE4NCwzMzE4NSwzMzE4NiwzMzE4OCwzMzE4OSwzMzE5MSwzMzE5MywzMzE5NSwzMzE5NiwzMzE5NywzMzE5OCwzMzE5OSwzMzIwMCwzMzIwMSwzMzIwMiwzMzIwNCwzMzIwNSwzMzIwNiwzMzIwNywzMzIwOCwzMzIwOSwzMzIxMiwzMzIxMywzMzIxNCwzMzIxNSwzMzIyMCwzMzIyMSwzMzIyMywzMzIyNCwzMzIyNSwzMzIyNywzMzIyOSwzMzIzMCwzMzIzMSwzMzIzMiwzMzIzMywzMzIzNCwzMzIzNSwyNTcyMSwzNDMyMSwyNzE2OSwzMzE4MCwzMDk1MiwyNTcwNSwzOTc2NCwyNTI3MywyNjQxMSwzMzcwNywyMjY5Niw0MDY2NCwyNzgxOSwyODQ0OCwyMzUxOCwzODQ3NiwzNTg1MSwyOTI3OSwyNjU3NiwyNTI4NywyOTI4MSwyMDEzNywyMjk4MiwyNzU5NywyMjY3NSwyNjI4NiwyNDE0OSwyMTIxNSwyNDkxNywyNjQwOCwzMDQ0NiwzMDU2NiwyOTI4NywzMTMwMiwyNTM0MywyMTczOCwyMTU4NCwzODA0OCwzNzAyNywyMzA2OCwzMjQzNSwyNzY3MCwyMDAzNSwyMjkwMiwzMjc4NCwyMjg1NiwyMTMzNSwzMDAwNywzODU5MCwyMjIxOCwyNTM3NiwzMzA0MSwyNDcwMCwzODM5MywyODExOCwyMTYwMiwzOTI5NywyMDg2OSwyMzI3MywzMzAyMSwyMjk1OCwzODY3NSwyMDUyMiwyNzg3NywyMzYxMiwyNTMxMSwyMDMyMCwyMTMxMSwzMzE0NywzNjg3MCwyODM0NiwzNDA5MSwyNTI4OCwyNDE4MCwzMDkxMCwyNTc4MSwyNTQ2NywyNDU2NSwyMzA2NCwzNzI0Nyw0MDQ3OSwyMzYxNSwyNTQyMywzMjgzNCwyMzQyMSwyMTg3MCwzODIxOCwzODIyMSwyODAzNywyNDc0NCwyNjU5MiwyOTQwNiwyMDk1NywyMzQyNSwzMzIzNiwzMzIzNywzMzIzOCwzMzIzOSwzMzI0MCwzMzI0MSwzMzI0MiwzMzI0MywzMzI0NCwzMzI0NSwzMzI0NiwzMzI0NywzMzI0OCwzMzI0OSwzMzI1MCwzMzI1MiwzMzI1MywzMzI1NCwzMzI1NiwzMzI1NywzMzI1OSwzMzI2MiwzMzI2MywzMzI2NCwzMzI2NSwzMzI2NiwzMzI2OSwzMzI3MCwzMzI3MSwzMzI3MiwzMzI3MywzMzI3NCwzMzI3NywzMzI3OSwzMzI4MywzMzI4NywzMzI4OCwzMzI4OSwzMzI5MCwzMzI5MSwzMzI5NCwzMzI5NSwzMzI5NywzMzI5OSwzMzMwMSwzMzMwMiwzMzMwMywzMzMwNCwzMzMwNSwzMzMwNiwzMzMwOSwzMzMxMiwzMzMxNiwzMzMxNywzMzMxOCwzMzMxOSwzMzMyMSwzMzMyNiwzMzMzMCwzMzMzOCwzMzM0MCwzMzM0MSwzMzM0MywzMzM0NCwzMzM0NSwzMzM0NiwzMzM0NywzMzM0OSwzMzM1MCwzMzM1MiwzMzM1NCwzMzM1NiwzMzM1NywzMzM1OCwzMzM2MCwzMzM2MSwzMzM2MiwzMzM2MywzMzM2NCwzMzM2NSwzMzM2NiwzMzM2NywzMzM2OSwzMzM3MSwzMzM3MiwzMzM3MywzMzM3NCwzMzM3NiwzMzM3NywzMzM3OCwzMzM3OSwzMzM4MCwzMzM4MSwzMzM4MiwzMzM4MywzMzM4NSwyNTMxOSwyNzg3MCwyOTI3NSwyNTE5NywzODA2MiwzMjQ0NSwzMzA0MywyNzk4NywyMDg5MiwyNDMyNCwyMjkwMCwyMTE2MiwyNDU5NCwyMjg5OSwyNjI2MiwzNDM4NCwzMDExMSwyNTM4NiwyNTA2MiwzMTk4MywzNTgzNCwyMTczNCwyNzQzMSw0MDQ4NSwyNzU3MiwzNDI2MSwyMTU4OSwyMDU5OCwyNzgxMiwyMTg2NiwzNjI3NiwyOTIyOCwyNDA4NSwyNDU5NywyOTc1MCwyNTI5MywyNTQ5MCwyOTI2MCwyNDQ3MiwyODIyNywyNzk2NiwyNTg1NiwyODUwNCwzMDQyNCwzMDkyOCwzMDQ2MCwzMDAzNiwyMTAyOCwyMTQ2NywyMDA1MSwyNDIyMiwyNjA0OSwzMjgxMCwzMjk4MiwyNTI0MywyMTYzOCwyMTAzMiwyODg0NiwzNDk1NywzNjMwNSwyNzg3MywyMTYyNCwzMjk4NiwyMjUyMSwzNTA2MCwzNjE4MCwzODUwNiwzNzE5NywyMDMyOSwyNzgwMywyMTk0MywzMDQwNiwzMDc2OCwyNTI1NiwyODkyMSwyODU1OCwyNDQyOSwzNDAyOCwyNjg0MiwzMDg0NCwzMTczNSwzMzE5MiwyNjM3OSw0MDUyNywyNTQ0NywzMDg5NiwyMjM4MywzMDczOCwzODcxMywyNTIwOSwyNTI1OSwyMTEyOCwyOTc0OSwyNzYwNywzMzM4NiwzMzM4NywzMzM4OCwzMzM4OSwzMzM5MywzMzM5NywzMzM5OCwzMzM5OSwzMzQwMCwzMzQwMywzMzQwNCwzMzQwOCwzMzQwOSwzMzQxMSwzMzQxMywzMzQxNCwzMzQxNSwzMzQxNywzMzQyMCwzMzQyNCwzMzQyNywzMzQyOCwzMzQyOSwzMzQzMCwzMzQzNCwzMzQzNSwzMzQzOCwzMzQ0MCwzMzQ0MiwzMzQ0MywzMzQ0NywzMzQ1OCwzMzQ2MSwzMzQ2MiwzMzQ2NiwzMzQ2NywzMzQ2OCwzMzQ3MSwzMzQ3MiwzMzQ3NCwzMzQ3NSwzMzQ3NywzMzQ3OCwzMzQ4MSwzMzQ4OCwzMzQ5NCwzMzQ5NywzMzQ5OCwzMzUwMSwzMzUwNiwzMzUxMSwzMzUxMiwzMzUxMywzMzUxNCwzMzUxNiwzMzUxNywzMzUxOCwzMzUyMCwzMzUyMiwzMzUyMywzMzUyNSwzMzUyNiwzMzUyOCwzMzUzMCwzMzUzMiwzMzUzMywzMzUzNCwzMzUzNSwzMzUzNiwzMzU0NiwzMzU0NywzMzU0OSwzMzU1MiwzMzU1NCwzMzU1NSwzMzU1OCwzMzU2MCwzMzU2MSwzMzU2NSwzMzU2NiwzMzU2NywzMzU2OCwzMzU2OSwzMzU3MCwzMzU3MSwzMzU3MiwzMzU3MywzMzU3NCwzMzU3NywzMzU3OCwzMzU4MiwzMzU4NCwzMzU4NiwzMzU5MSwzMzU5NSwzMzU5NywyMTg2MCwzMzA4NiwzMDEzMCwzMDM4MiwyMTMwNSwzMDE3NCwyMDczMSwyMzYxNywzNTY5MiwzMTY4NywyMDU1OSwyOTI1NSwzOTU3NSwzOTEyOCwyODQxOCwyOTkyMiwzMTA4MCwyNTczNSwzMDYyOSwyNTM0MCwzOTA1NywzNjEzOSwyMTY5NywzMjg1NiwyMDA1MCwyMjM3OCwzMzUyOSwzMzgwNSwyNDE3OSwyMDk3MywyOTk0MiwzNTc4MCwyMzYzMSwyMjM2OSwyNzkwMCwzOTA0NywyMzExMCwzMDc3MiwzOTc0OCwzNjg0MywzMTg5MywyMTA3OCwyNTE2OSwzODEzOCwyMDE2NiwzMzY3MCwzMzg4OSwzMzc2OSwzMzk3MCwyMjQ4NCwyNjQyMCwyMjI3NSwyNjIyMiwyODAwNiwzNTg4OSwyNjMzMywyODY4OSwyNjM5OSwyNzQ1MCwyNjY0NiwyNTExNCwyMjk3MSwxOTk3MSwyMDkzMiwyODQyMiwyNjU3OCwyNzc5MSwyMDg1NCwyNjgyNywyMjg1NSwyNzQ5NSwzMDA1NCwyMzgyMiwzMzA0MCw0MDc4NCwyNjA3MSwzMTA0OCwzMTA0MSwzOTU2OSwzNjIxNSwyMzY4MiwyMDA2MiwyMDIyNSwyMTU1MSwyMjg2NSwzMDczMiwyMjEyMCwyNzY2OCwzNjgwNCwyNDMyMywyNzc3MywyNzg3NSwzNTc1NSwyNTQ4OCwzMzU5OCwzMzU5OSwzMzYwMSwzMzYwMiwzMzYwNCwzMzYwNSwzMzYwOCwzMzYxMCwzMzYxMSwzMzYxMiwzMzYxMywzMzYxNCwzMzYxOSwzMzYyMSwzMzYyMiwzMzYyMywzMzYyNCwzMzYyNSwzMzYyOSwzMzYzNCwzMzY0OCwzMzY0OSwzMzY1MCwzMzY1MSwzMzY1MiwzMzY1MywzMzY1NCwzMzY1NywzMzY1OCwzMzY2MiwzMzY2MywzMzY2NCwzMzY2NSwzMzY2NiwzMzY2NywzMzY2OCwzMzY3MSwzMzY3MiwzMzY3NCwzMzY3NSwzMzY3NiwzMzY3NywzMzY3OSwzMzY4MCwzMzY4MSwzMzY4NCwzMzY4NSwzMzY4NiwzMzY4NywzMzY4OSwzMzY5MCwzMzY5MywzMzY5NSwzMzY5NywzMzY5OCwzMzY5OSwzMzcwMCwzMzcwMSwzMzcwMiwzMzcwMywzMzcwOCwzMzcwOSwzMzcxMCwzMzcxMSwzMzcxNywzMzcyMywzMzcyNiwzMzcyNywzMzczMCwzMzczMSwzMzczMiwzMzczNCwzMzczNiwzMzczNywzMzczOSwzMzc0MSwzMzc0MiwzMzc0NCwzMzc0NSwzMzc0NiwzMzc0NywzMzc0OSwzMzc1MSwzMzc1MywzMzc1NCwzMzc1NSwzMzc1OCwzMzc2MiwzMzc2MywzMzc2NCwzMzc2NiwzMzc2NywzMzc2OCwzMzc3MSwzMzc3MiwzMzc3MywyNDY4OCwyNzk2NSwyOTMwMSwyNTE5MCwzODAzMCwzODA4NSwyMTMxNSwzNjgwMSwzMTYxNCwyMDE5MSwzNTg3OCwyMDA5NCw0MDY2MCwzODA2NSwzODA2NywyMTA2OSwyODUwOCwzNjk2MywyNzk3MywzNTg5MiwyMjU0NSwyMzg4NCwyNzQyNCwyNzQ2NSwyNjUzOCwyMTU5NSwzMzEwOCwzMjY1MiwyMjY4MSwzNDEwMywyNDM3OCwyNTI1MCwyNzIwNywzODIwMSwyNTk3MCwyNDcwOCwyNjcyNSwzMDYzMSwyMDA1MiwyMDM5MiwyNDAzOSwzODgwOCwyNTc3MiwzMjcyOCwyMzc4OSwyMDQzMSwzMTM3MywyMDk5OSwzMzU0MCwxOTk4OCwyNDYyMywzMTM2MywzODA1NCwyMDQwNSwyMDE0NiwzMTIwNiwyOTc0OCwyMTIyMCwzMzQ2NSwyNTgxMCwzMTE2NSwyMzUxNywyNzc3NywzODczOCwzNjczMSwyNzY4MiwyMDU0MiwyMTM3NSwyODE2NSwyNTgwNiwyNjIyOCwyNzY5NiwyNDc3MywzOTAzMSwzNTgzMSwyNDE5OCwyOTc1NiwzMTM1MSwzMTE3OSwxOTk5MiwzNzA0MSwyOTY5OSwyNzcxNCwyMjIzNCwzNzE5NSwyNzg0NSwzNjIzNSwyMTMwNiwzNDUwMiwyNjM1NCwzNjUyNywyMzYyNCwzOTUzNywyODE5MiwzMzc3NCwzMzc3NSwzMzc3OSwzMzc4MCwzMzc4MSwzMzc4MiwzMzc4MywzMzc4NiwzMzc4NywzMzc4OCwzMzc5MCwzMzc5MSwzMzc5MiwzMzc5NCwzMzc5NywzMzc5OSwzMzgwMCwzMzgwMSwzMzgwMiwzMzgwOCwzMzgxMCwzMzgxMSwzMzgxMiwzMzgxMywzMzgxNCwzMzgxNSwzMzgxNywzMzgxOCwzMzgxOSwzMzgyMiwzMzgyMywzMzgyNCwzMzgyNSwzMzgyNiwzMzgyNywzMzgzMywzMzgzNCwzMzgzNSwzMzgzNiwzMzgzNywzMzgzOCwzMzgzOSwzMzg0MCwzMzg0MiwzMzg0MywzMzg0NCwzMzg0NSwzMzg0NiwzMzg0NywzMzg0OSwzMzg1MCwzMzg1MSwzMzg1NCwzMzg1NSwzMzg1NiwzMzg1NywzMzg1OCwzMzg1OSwzMzg2MCwzMzg2MSwzMzg2MywzMzg2NCwzMzg2NSwzMzg2NiwzMzg2NywzMzg2OCwzMzg2OSwzMzg3MCwzMzg3MSwzMzg3MiwzMzg3NCwzMzg3NSwzMzg3NiwzMzg3NywzMzg3OCwzMzg4MCwzMzg4NSwzMzg4NiwzMzg4NywzMzg4OCwzMzg5MCwzMzg5MiwzMzg5MywzMzg5NCwzMzg5NSwzMzg5NiwzMzg5OCwzMzkwMiwzMzkwMywzMzkwNCwzMzkwNiwzMzkwOCwzMzkxMSwzMzkxMywzMzkxNSwzMzkxNiwyMTQ2MiwyMzA5NCw0MDg0MywzNjI1OSwyMTQzNSwyMjI4MCwzOTA3OSwyNjQzNSwzNzI3NSwyNzg0OSwyMDg0MCwzMDE1NCwyNTMzMSwyOTM1NiwyMTA0OCwyMTE0OSwzMjU3MCwyODgyMCwzMDI2NCwyMTM2NCw0MDUyMiwyNzA2MywzMDgzMCwzODU5MiwzNTAzMywzMjY3NiwyODk4MiwyOTEyMywyMDg3MywyNjU3OSwyOTkyNCwyMjc1NiwyNTg4MCwyMjE5OSwzNTc1MywzOTI4NiwyNTIwMCwzMjQ2OSwyNDgyNSwyODkwOSwyMjc2NCwyMDE2MSwyMDE1NCwyNDUyNSwzODg4NywyMDIxOSwzNTc0OCwyMDk5NSwyMjkyMiwzMjQyNywyNTE3MiwyMDE3MywyNjA4NSwyNTEwMiwzMzU5MiwzMzk5MywzMzYzNSwzNDcwMSwyOTA3NiwyODM0MiwyMzQ4MSwzMjQ2NiwyMDg4NywyNTU0NSwyNjU4MCwzMjkwNSwzMzU5MywzNDgzNywyMDc1NCwyMzQxOCwyMjkxNCwzNjc4NSwyMDA4MywyNzc0MSwyMDgzNywzNTEwOSwzNjcxOSwzODQ0NiwzNDEyMiwyOTc5MCwzODE2MCwzODM4NCwyODA3MCwzMzUwOSwyNDM2OSwyNTc0NiwyNzkyMiwzMzgzMiwzMzEzNCw0MDEzMSwyMjYyMiwzNjE4NywxOTk3NywyMTQ0MSwzMzkxNywzMzkxOCwzMzkxOSwzMzkyMCwzMzkyMSwzMzkyMywzMzkyNCwzMzkyNSwzMzkyNiwzMzkzMCwzMzkzMywzMzkzNSwzMzkzNiwzMzkzNywzMzkzOCwzMzkzOSwzMzk0MCwzMzk0MSwzMzk0MiwzMzk0NCwzMzk0NiwzMzk0NywzMzk0OSwzMzk1MCwzMzk1MSwzMzk1MiwzMzk1NCwzMzk1NSwzMzk1NiwzMzk1NywzMzk1OCwzMzk1OSwzMzk2MCwzMzk2MSwzMzk2MiwzMzk2MywzMzk2NCwzMzk2NSwzMzk2NiwzMzk2OCwzMzk2OSwzMzk3MSwzMzk3MywzMzk3NCwzMzk3NSwzMzk3OSwzMzk4MCwzMzk4MiwzMzk4NCwzMzk4NiwzMzk4NywzMzk4OSwzMzk5MCwzMzk5MSwzMzk5MiwzMzk5NSwzMzk5NiwzMzk5OCwzMzk5OSwzNDAwMiwzNDAwNCwzNDAwNSwzNDAwNywzNDAwOCwzNDAwOSwzNDAxMCwzNDAxMSwzNDAxMiwzNDAxNCwzNDAxNywzNDAxOCwzNDAyMCwzNDAyMywzNDAyNCwzNDAyNSwzNDAyNiwzNDAyNywzNDAyOSwzNDAzMCwzNDAzMSwzNDAzMywzNDAzNCwzNDAzNSwzNDAzNiwzNDAzNywzNDAzOCwzNDAzOSwzNDA0MCwzNDA0MSwzNDA0MiwzNDA0MywzNDA0NSwzNDA0NiwzNDA0OCwzNDA0OSwzNDA1MCwyMDI1NCwyNTk1NSwyNjcwNSwyMTk3MSwyMDAwNywyNTYyMCwzOTU3OCwyNTE5NSwyMzIzNCwyOTc5MSwzMzM5NCwyODA3MywyNjg2MiwyMDcxMSwzMzY3OCwzMDcyMiwyNjQzMiwyMTA0OSwyNzgwMSwzMjQzMywyMDY2NywyMTg2MSwyOTAyMiwzMTU3OSwyNjE5NCwyOTY0MiwzMzUxNSwyNjQ0MSwyMzY2NSwyMTAyNCwyOTA1MywzNDkyMywzODM3OCwzODQ4NSwyNTc5NywzNjE5MywzMzIwMywyMTg5MiwyNzczMywyNTE1OSwzMjU1OCwyMjY3NCwyMDI2MCwyMTgzMCwzNjE3NSwyNjE4OCwxOTk3OCwyMzU3OCwzNTA1OSwyNjc4NiwyNTQyMiwzMTI0NSwyODkwMywzMzQyMSwyMTI0MiwzODkwMiwyMzU2OSwyMTczNiwzNzA0NSwzMjQ2MSwyMjg4MiwzNjE3MCwzNDUwMywzMzI5MiwzMzI5MywzNjE5OCwyNTY2OCwyMzU1NiwyNDkxMywyODA0MSwzMTAzOCwzNTc3NCwzMDc3NSwzMDAwMywyMTYyNywyMDI4MCwzNjUyMywyODE0NSwyMzA3MiwzMjQ1MywzMTA3MCwyNzc4NCwyMzQ1NywyMzE1OCwyOTk3OCwzMjk1OCwyNDkxMCwyODE4MywyMjc2OCwyOTk4MywyOTk4OSwyOTI5OCwyMTMxOSwzMjQ5OSwzNDA1MSwzNDA1MiwzNDA1MywzNDA1NCwzNDA1NSwzNDA1NiwzNDA1NywzNDA1OCwzNDA1OSwzNDA2MSwzNDA2MiwzNDA2MywzNDA2NCwzNDA2NiwzNDA2OCwzNDA2OSwzNDA3MCwzNDA3MiwzNDA3MywzNDA3NSwzNDA3NiwzNDA3NywzNDA3OCwzNDA4MCwzNDA4MiwzNDA4MywzNDA4NCwzNDA4NSwzNDA4NiwzNDA4NywzNDA4OCwzNDA4OSwzNDA5MCwzNDA5MywzNDA5NCwzNDA5NSwzNDA5NiwzNDA5NywzNDA5OCwzNDA5OSwzNDEwMCwzNDEwMSwzNDEwMiwzNDExMCwzNDExMSwzNDExMiwzNDExMywzNDExNCwzNDExNiwzNDExNywzNDExOCwzNDExOSwzNDEyMywzNDEyNCwzNDEyNSwzNDEyNiwzNDEyNywzNDEyOCwzNDEyOSwzNDEzMCwzNDEzMSwzNDEzMiwzNDEzMywzNDEzNSwzNDEzNiwzNDEzOCwzNDEzOSwzNDE0MCwzNDE0MSwzNDE0MywzNDE0NCwzNDE0NSwzNDE0NiwzNDE0NywzNDE0OSwzNDE1MCwzNDE1MSwzNDE1MywzNDE1NCwzNDE1NSwzNDE1NiwzNDE1NywzNDE1OCwzNDE1OSwzNDE2MCwzNDE2MSwzNDE2MywzNDE2NSwzNDE2NiwzNDE2NywzNDE2OCwzNDE3MiwzNDE3MywzNDE3NSwzNDE3NiwzNDE3NywzMDQ2NSwzMDQyNywyMTA5NywzMjk4OCwyMjMwNywyNDA3MiwyMjgzMywyOTQyMiwyNjA0NSwyODI4NywzNTc5OSwyMzYwOCwzNDQxNywyMTMxMywzMDcwNywyNTM0MiwyNjEwMiwyMDE2MCwzOTEzNSwzNDQzMiwyMzQ1NCwzNTc4MiwyMTQ5MCwzMDY5MCwyMDM1MSwyMzYzMCwzOTU0MiwyMjk4NywyNDMzNSwzMTAzNCwyMjc2MywxOTk5MCwyNjYyMywyMDEwNywyNTMyNSwzNTQ3NSwzNjg5MywyMTE4MywyNjE1OSwyMTk4MCwyMjEyNCwzNjg2NiwyMDE4MSwyMDM2NSwzNzMyMiwzOTI4MCwyNzY2MywyNDA2NiwyNDY0MywyMzQ2MCwzNTI3MCwzNTc5NywyNTkxMCwyNTE2MywzOTMxOCwyMzQzMiwyMzU1MSwyNTQ4MCwyMTgwNiwyMTQ2MywzMDI0NiwyMDg2MSwzNDA5MiwyNjUzMCwyNjgwMywyNzUzMCwyNTIzNCwzNjc1NSwyMTQ2MCwzMzI5OCwyODExMywzMDA5NSwyMDA3MCwzNjE3NCwyMzQwOCwyOTA4NywzNDIyMywyNjI1NywyNjMyOSwzMjYyNiwzNDU2MCw0MDY1Myw0MDczNiwyMzY0NiwyNjQxNSwzNjg0OCwyNjY0MSwyNjQ2MywyNTEwMSwzMTQ0NiwyMjY2MSwyNDI0NiwyNTk2OCwyODQ2NSwzNDE3OCwzNDE3OSwzNDE4MiwzNDE4NCwzNDE4NSwzNDE4NiwzNDE4NywzNDE4OCwzNDE4OSwzNDE5MCwzNDE5MiwzNDE5MywzNDE5NCwzNDE5NSwzNDE5NiwzNDE5NywzNDE5OCwzNDE5OSwzNDIwMCwzNDIwMSwzNDIwMiwzNDIwNSwzNDIwNiwzNDIwNywzNDIwOCwzNDIwOSwzNDIxMCwzNDIxMSwzNDIxMywzNDIxNCwzNDIxNSwzNDIxNywzNDIxOSwzNDIyMCwzNDIyMSwzNDIyNSwzNDIyNiwzNDIyNywzNDIyOCwzNDIyOSwzNDIzMCwzNDIzMiwzNDIzNCwzNDIzNSwzNDIzNiwzNDIzNywzNDIzOCwzNDIzOSwzNDI0MCwzNDI0MiwzNDI0MywzNDI0NCwzNDI0NSwzNDI0NiwzNDI0NywzNDI0OCwzNDI1MCwzNDI1MSwzNDI1MiwzNDI1MywzNDI1NCwzNDI1NywzNDI1OCwzNDI2MCwzNDI2MiwzNDI2MywzNDI2NCwzNDI2NSwzNDI2NiwzNDI2NywzNDI2OSwzNDI3MCwzNDI3MSwzNDI3MiwzNDI3MywzNDI3NCwzNDI3NSwzNDI3NywzNDI3OCwzNDI3OSwzNDI4MCwzNDI4MiwzNDI4MywzNDI4NCwzNDI4NSwzNDI4NiwzNDI4NywzNDI4OCwzNDI4OSwzNDI5MCwzNDI5MSwzNDI5MiwzNDI5MywzNDI5NCwzNDI5NSwzNDI5NiwyNDY2MSwyMTA0NywzMjc4MSwyNTY4NCwzNDkyOCwyOTk5MywyNDA2OSwyNjY0MywyNTMzMiwzODY4NCwyMTQ1MiwyOTI0NSwzNTg0MSwyNzcwMCwzMDU2MSwzMTI0NiwyMTU1MCwzMDYzNiwzOTAzNCwzMzMwOCwzNTgyOCwzMDgwNSwyNjM4OCwyODg2NSwyNjAzMSwyNTc0OSwyMjA3MCwyNDYwNSwzMTE2OSwyMTQ5NiwxOTk5NywyNzUxNSwzMjkwMiwyMzU0NiwyMTk4NywyMjIzNSwyMDI4MiwyMDI4NCwzOTI4MiwyNDA1MSwyNjQ5NCwzMjgyNCwyNDU3OCwzOTA0MiwzNjg2NSwyMzQzNSwzNTc3MiwzNTgyOSwyNTYyOCwzMzM2OCwyNTgyMiwyMjAxMywzMzQ4NywzNzIyMSwyMDQzOSwzMjAzMiwzNjg5NSwzMTkwMywyMDcyMywyMjYwOSwyODMzNSwyMzQ4NywzNTc4NSwzMjg5OSwzNzI0MCwzMzk0OCwzMTYzOSwzNDQyOSwzODUzOSwzODU0MywzMjQ4NSwzOTYzNSwzMDg2MiwyMzY4MSwzMTMxOSwzNjkzMCwzODU2NywzMTA3MSwyMzM4NSwyNTQzOSwzMTQ5OSwzNDAwMSwyNjc5NywyMTc2NiwzMjU1MywyOTcxMiwzMjAzNCwzODE0NSwyNTE1MiwyMjYwNCwyMDE4MiwyMzQyNywyMjkwNSwyMjYxMiwzNDI5NywzNDI5OCwzNDMwMCwzNDMwMSwzNDMwMiwzNDMwNCwzNDMwNSwzNDMwNiwzNDMwNywzNDMwOCwzNDMxMCwzNDMxMSwzNDMxMiwzNDMxMywzNDMxNCwzNDMxNSwzNDMxNiwzNDMxNywzNDMxOCwzNDMxOSwzNDMyMCwzNDMyMiwzNDMyMywzNDMyNCwzNDMyNSwzNDMyNywzNDMyOCwzNDMyOSwzNDMzMCwzNDMzMSwzNDMzMiwzNDMzMywzNDMzNCwzNDMzNSwzNDMzNiwzNDMzNywzNDMzOCwzNDMzOSwzNDM0MCwzNDM0MSwzNDM0MiwzNDM0NCwzNDM0NiwzNDM0NywzNDM0OCwzNDM0OSwzNDM1MCwzNDM1MSwzNDM1MiwzNDM1MywzNDM1NCwzNDM1NSwzNDM1NiwzNDM1NywzNDM1OCwzNDM1OSwzNDM2MSwzNDM2MiwzNDM2MywzNDM2NSwzNDM2NiwzNDM2NywzNDM2OCwzNDM2OSwzNDM3MCwzNDM3MSwzNDM3MiwzNDM3MywzNDM3NCwzNDM3NSwzNDM3NiwzNDM3NywzNDM3OCwzNDM3OSwzNDM4MCwzNDM4NiwzNDM4NywzNDM4OSwzNDM5MCwzNDM5MSwzNDM5MiwzNDM5MywzNDM5NSwzNDM5NiwzNDM5NywzNDM5OSwzNDQwMCwzNDQwMSwzNDQwMywzNDQwNCwzNDQwNSwzNDQwNiwzNDQwNywzNDQwOCwzNDQwOSwzNDQxMCwyOTU0OSwyNTM3NCwzNjQyNywzNjM2NywzMjk3NCwzMzQ5MiwyNTI2MCwyMTQ4OCwyNzg4OCwzNzIxNCwyMjgyNiwyNDU3NywyNzc2MCwyMjM0OSwyNTY3NCwzNjEzOCwzMDI1MSwyODM5MywyMjM2MywyNzI2NCwzMDE5MiwyODUyNSwzNTg4NSwzNTg0OCwyMjM3NCwyNzYzMSwzNDk2MiwzMDg5OSwyNTUwNiwyMTQ5NywyODg0NSwyNzc0OCwyMjYxNiwyNTY0MiwyMjUzMCwyNjg0OCwzMzE3OSwyMTc3NiwzMTk1OCwyMDUwNCwzNjUzOCwyODEwOCwzNjI1NSwyODkwNywyNTQ4NywyODA1OSwyODM3MiwzMjQ4NiwzMzc5NiwyNjY5MSwzNjg2NywyODEyMCwzODUxOCwzNTc1MiwyMjg3MSwyOTMwNSwzNDI3NiwzMzE1MCwzMDE0MCwzNTQ2NiwyNjc5OSwyMTA3NiwzNjM4NiwzODE2MSwyNTU1MiwzOTA2NCwzNjQyMCwyMTg4NCwyMDMwNywyNjM2NywyMjE1OSwyNDc4OSwyODA1MywyMTA1OSwyMzYyNSwyMjgyNSwyODE1NSwyMjYzNSwzMDAwMCwyOTk4MCwyNDY4NCwzMzMwMCwzMzA5NCwyNTM2MSwyNjQ2NSwzNjgzNCwzMDUyMiwzNjMzOSwzNjE0OCwzODA4MSwyNDA4NiwyMTM4MSwyMTU0OCwyODg2NywzNDQxMywzNDQxNSwzNDQxNiwzNDQxOCwzNDQxOSwzNDQyMCwzNDQyMSwzNDQyMiwzNDQyMywzNDQyNCwzNDQzNSwzNDQzNiwzNDQzNywzNDQzOCwzNDQzOSwzNDQ0MCwzNDQ0MSwzNDQ0NiwzNDQ0NywzNDQ0OCwzNDQ0OSwzNDQ1MCwzNDQ1MiwzNDQ1NCwzNDQ1NSwzNDQ1NiwzNDQ1NywzNDQ1OCwzNDQ1OSwzNDQ2MiwzNDQ2MywzNDQ2NCwzNDQ2NSwzNDQ2NiwzNDQ2OSwzNDQ3MCwzNDQ3NSwzNDQ3NywzNDQ3OCwzNDQ4MiwzNDQ4MywzNDQ4NywzNDQ4OCwzNDQ4OSwzNDQ5MSwzNDQ5MiwzNDQ5MywzNDQ5NCwzNDQ5NSwzNDQ5NywzNDQ5OCwzNDQ5OSwzNDUwMSwzNDUwNCwzNDUwOCwzNDUwOSwzNDUxNCwzNDUxNSwzNDUxNywzNDUxOCwzNDUxOSwzNDUyMiwzNDUyNCwzNDUyNSwzNDUyOCwzNDUyOSwzNDUzMCwzNDUzMSwzNDUzMywzNDUzNCwzNDUzNSwzNDUzNiwzNDUzOCwzNDUzOSwzNDU0MCwzNDU0MywzNDU0OSwzNDU1MCwzNDU1MSwzNDU1NCwzNDU1NSwzNDU1NiwzNDU1NywzNDU1OSwzNDU2MSwzNDU2NCwzNDU2NSwzNDU2NiwzNDU3MSwzNDU3MiwzNDU3NCwzNDU3NSwzNDU3NiwzNDU3NywzNDU4MCwzNDU4MiwyNzcxMiwyNDMxMSwyMDU3MiwyMDE0MSwyNDIzNywyNTQwMiwzMzM1MSwzNjg5MCwyNjcwNCwzNzIzMCwzMDY0MywyMTUxNiwzODEwOCwyNDQyMCwzMTQ2MSwyNjc0MiwyNTQxMywzMTU3MCwzMjQ3OSwzMDE3MSwyMDU5OSwyNTIzNywyMjgzNiwzNjg3OSwyMDk4NCwzMTE3MSwzMTM2MSwyMjI3MCwyNDQ2NiwzNjg4NCwyODAzNCwyMzY0OCwyMjMwMywyMTUyMCwyMDgyMCwyODIzNywyMjI0MiwyNTUxMiwzOTA1OSwzMzE1MSwzNDU4MSwzNTExNCwzNjg2NCwyMTUzNCwyMzY2MywzMzIxNiwyNTMwMiwyNTE3NiwzMzA3Myw0MDUwMSwzODQ2NCwzOTUzNCwzOTU0OCwyNjkyNSwyMjk0OSwyNTI5OSwyMTgyMiwyNTM2NiwyMTcwMywzNDUyMSwyNzk2NCwyMzA0MywyOTkyNiwzNDk3MiwyNzQ5OCwyMjgwNiwzNTkxNiwyNDM2NywyODI4NiwyOTYwOSwzOTAzNywyMDAyNCwyODkxOSwyMzQzNiwzMDg3MSwyNTQwNSwyNjIwMiwzMDM1OCwyNDc3OSwyMzQ1MSwyMzExMywxOTk3NSwzMzEwOSwyNzc1NCwyOTU3OSwyMDEyOSwyNjUwNSwzMjU5MywyNDQ0OCwyNjEwNiwyNjM5NSwyNDUzNiwyMjkxNiwyMzA0MSwzNDU4NSwzNDU4NywzNDU4OSwzNDU5MSwzNDU5MiwzNDU5NiwzNDU5OCwzNDU5OSwzNDYwMCwzNDYwMiwzNDYwMywzNDYwNCwzNDYwNSwzNDYwNywzNDYwOCwzNDYxMCwzNDYxMSwzNDYxMywzNDYxNCwzNDYxNiwzNDYxNywzNDYxOCwzNDYyMCwzNDYyMSwzNDYyNCwzNDYyNSwzNDYyNiwzNDYyNywzNDYyOCwzNDYyOSwzNDYzMCwzNDYzNCwzNDYzNSwzNDYzNywzNDYzOSwzNDY0MCwzNDY0MSwzNDY0MiwzNDY0NCwzNDY0NSwzNDY0NiwzNDY0OCwzNDY1MCwzNDY1MSwzNDY1MiwzNDY1MywzNDY1NCwzNDY1NSwzNDY1NywzNDY1OCwzNDY2MiwzNDY2MywzNDY2NCwzNDY2NSwzNDY2NiwzNDY2NywzNDY2OCwzNDY2OSwzNDY3MSwzNDY3MywzNDY3NCwzNDY3NSwzNDY3NywzNDY3OSwzNDY4MCwzNDY4MSwzNDY4MiwzNDY4NywzNDY4OCwzNDY4OSwzNDY5MiwzNDY5NCwzNDY5NSwzNDY5NywzNDY5OCwzNDcwMCwzNDcwMiwzNDcwMywzNDcwNCwzNDcwNSwzNDcwNiwzNDcwOCwzNDcwOSwzNDcxMCwzNDcxMiwzNDcxMywzNDcxNCwzNDcxNSwzNDcxNiwzNDcxNywzNDcxOCwzNDcyMCwzNDcyMSwzNDcyMiwzNDcyMywzNDcyNCwyNDAxMywyNDQ5NCwyMTM2MSwzODg4NiwzNjgyOSwyNjY5MywyMjI2MCwyMTgwNywyNDc5OSwyMDAyNiwyODQ5MywzMjUwMCwzMzQ3OSwzMzgwNiwyMjk5NiwyMDI1NSwyMDI2NiwyMzYxNCwzMjQyOCwyNjQxMCwzNDA3NCwyMTYxOSwzMDAzMSwzMjk2MywyMTg5MCwzOTc1OSwyMDMwMSwyODIwNSwzNTg1OSwyMzU2MSwyNDk0NCwyMTM1NSwzMDIzOSwyODIwMSwzNDQ0MiwyNTk5MSwzODM5NSwzMjQ0MSwyMTU2MywzMTI4MywzMjAxMCwzODM4MiwyMTk4NSwzMjcwNSwyOTkzNCwyNTM3MywzNDU4MywyODA2NSwzMTM4OSwyNTEwNSwyNjAxNywyMTM1MSwyNTU2OSwyNzc3OSwyNDA0MywyMTU5NiwzODA1NiwyMDA0NCwyNzc0NSwzNTgyMCwyMzYyNywyNjA4MCwzMzQzNiwyNjc5MSwyMTU2NiwyMTU1NiwyNzU5NSwyNzQ5NCwyMDExNiwyNTQxMCwyMTMyMCwzMzMxMCwyMDIzNywyMDM5OCwyMjM2NiwyNTA5OCwzODY1NCwyNjIxMiwyOTI4OSwyMTI0NywyMTE1MywyNDczNSwzNTgyMywyNjEzMiwyOTA4MSwyNjUxMiwzNTE5OSwzMDgwMiwzMDcxNywyNjIyNCwyMjA3NSwyMTU2MCwzODE3NywyOTMwNiwzNDcyNSwzNDcyNiwzNDcyNywzNDcyOSwzNDczMCwzNDczNCwzNDczNiwzNDczNywzNDczOCwzNDc0MCwzNDc0MiwzNDc0MywzNDc0NCwzNDc0NSwzNDc0NywzNDc0OCwzNDc1MCwzNDc1MSwzNDc1MywzNDc1NCwzNDc1NSwzNDc1NiwzNDc1NywzNDc1OSwzNDc2MCwzNDc2MSwzNDc2NCwzNDc2NSwzNDc2NiwzNDc2NywzNDc2OCwzNDc3MiwzNDc3MywzNDc3NCwzNDc3NSwzNDc3NiwzNDc3NywzNDc3OCwzNDc4MCwzNDc4MSwzNDc4MiwzNDc4MywzNDc4NSwzNDc4NiwzNDc4NywzNDc4OCwzNDc5MCwzNDc5MSwzNDc5MiwzNDc5MywzNDc5NSwzNDc5NiwzNDc5NywzNDc5OSwzNDgwMCwzNDgwMSwzNDgwMiwzNDgwMywzNDgwNCwzNDgwNSwzNDgwNiwzNDgwNywzNDgwOCwzNDgxMCwzNDgxMSwzNDgxMiwzNDgxMywzNDgxNSwzNDgxNiwzNDgxNywzNDgxOCwzNDgyMCwzNDgyMSwzNDgyMiwzNDgyMywzNDgyNCwzNDgyNSwzNDgyNywzNDgyOCwzNDgyOSwzNDgzMCwzNDgzMSwzNDgzMiwzNDgzMywzNDgzNCwzNDgzNiwzNDgzOSwzNDg0MCwzNDg0MSwzNDg0MiwzNDg0NCwzNDg0NSwzNDg0NiwzNDg0NywzNDg0OCwzNDg1MSwzMTIzMiwyNDY4NywyNDA3NiwyNDcxMywzMzE4MSwyMjgwNSwyNDc5NiwyOTA2MCwyODkxMSwyODMzMCwyNzcyOCwyOTMxMiwyNzI2OCwzNDk4OSwyNDEwOSwyMDA2NCwyMzIxOSwyMTkxNiwzODExNSwyNzkyNywzMTk5NSwzODU1MywyNTEwMywzMjQ1NCwzMDYwNiwzNDQzMCwyMTI4MywzODY4NiwzNjc1OCwyNjI0NywyMzc3NywyMDM4NCwyOTQyMSwxOTk3OSwyMTQxNCwyMjc5OSwyMTUyMywyNTQ3MiwzODE4NCwyMDgwOCwyMDE4NSw0MDA5MiwzMjQyMCwyMTY4OCwzNjEzMiwzNDkwMCwzMzMzNSwzODM4NiwyODA0NiwyNDM1OCwyMzI0NCwyNjE3NCwzODUwNSwyOTYxNiwyOTQ4NiwyMTQzOSwzMzE0NiwzOTMwMSwzMjY3MywyMzQ2NiwzODUxOSwzODQ4MCwzMjQ0NywzMDQ1NiwyMTQxMCwzODI2MiwzOTMyMSwzMTY2NSwzNTE0MCwyODI0OCwyMDA2NSwzMjcyNCwzMTA3NywzNTgxNCwyNDgxOSwyMTcwOSwyMDEzOSwzOTAzMywyNDA1NSwyNzIzMywyMDY4NywyMTUyMSwzNTkzNywzMzgzMSwzMDgxMywzODY2MCwyMTA2NiwyMTc0MiwyMjE3OSwzODE0NCwyODA0MCwyMzQ3NywyODEwMiwyNjE5NSwzNDg1MiwzNDg1MywzNDg1NCwzNDg1NSwzNDg1NiwzNDg1NywzNDg1OCwzNDg1OSwzNDg2MCwzNDg2MSwzNDg2MiwzNDg2MywzNDg2NCwzNDg2NSwzNDg2NywzNDg2OCwzNDg2OSwzNDg3MCwzNDg3MSwzNDg3MiwzNDg3NCwzNDg3NSwzNDg3NywzNDg3OCwzNDg3OSwzNDg4MSwzNDg4MiwzNDg4MywzNDg4NiwzNDg4NywzNDg4OCwzNDg4OSwzNDg5MCwzNDg5MSwzNDg5NCwzNDg5NSwzNDg5NiwzNDg5NywzNDg5OCwzNDg5OSwzNDkwMSwzNDkwMiwzNDkwNCwzNDkwNiwzNDkwNywzNDkwOCwzNDkwOSwzNDkxMCwzNDkxMSwzNDkxMiwzNDkxOCwzNDkxOSwzNDkyMiwzNDkyNSwzNDkyNywzNDkyOSwzNDkzMSwzNDkzMiwzNDkzMywzNDkzNCwzNDkzNiwzNDkzNywzNDkzOCwzNDkzOSwzNDk0MCwzNDk0NCwzNDk0NywzNDk1MCwzNDk1MSwzNDk1MywzNDk1NCwzNDk1NiwzNDk1OCwzNDk1OSwzNDk2MCwzNDk2MSwzNDk2MywzNDk2NCwzNDk2NSwzNDk2NywzNDk2OCwzNDk2OSwzNDk3MCwzNDk3MSwzNDk3MywzNDk3NCwzNDk3NSwzNDk3NiwzNDk3NywzNDk3OSwzNDk4MSwzNDk4MiwzNDk4MywzNDk4NCwzNDk4NSwzNDk4NiwyMzU2NywyMzM4OSwyNjY1NywzMjkxOCwyMTg4MCwzMTUwNSwyNTkyOCwyNjk2NCwyMDEyMywyNzQ2MywzNDYzOCwzODc5NSwyMTMyNywyNTM3NSwyNTY1OCwzNzAzNCwyNjAxMiwzMjk2MSwzNTg1NiwyMDg4OSwyNjgwMCwyMTM2OCwzNDgwOSwyNTAzMiwyNzg0NCwyNzg5OSwzNTg3NCwyMzYzMywzNDIxOCwzMzQ1NSwzODE1NiwyNzQyNywzNjc2MywyNjAzMiwyNDU3MSwyNDUxNSwyMDQ0OSwzNDg4NSwyNjE0MywzMzEyNSwyOTQ4MSwyNDgyNiwyMDg1MiwyMTAwOSwyMjQxMSwyNDQxOCwzNzAyNiwzNDg5MiwzNzI2NiwyNDE4NCwyNjQ0NywyNDYxNSwyMjk5NSwyMDgwNCwyMDk4MiwzMzAxNiwyMTI1NiwyNzc2OSwzODU5NiwyOTA2NiwyMDI0MSwyMDQ2MiwzMjY3MCwyNjQyOSwyMTk1NywzODE1MiwzMTE2OCwzNDk2NiwzMjQ4MywyMjY4NywyNTEwMCwzODY1NiwzNDM5NCwyMjA0MCwzOTAzNSwyNDQ2NCwzNTc2OCwzMzk4OCwzNzIwNywyMTQ2NSwyNjA5MywyNDIwNywzMDA0NCwyNDY3NiwzMjExMCwyMzE2NywzMjQ5MCwzMjQ5MywzNjcxMywyMTkyNywyMzQ1OSwyNDc0OCwyNjA1OSwyOTU3MiwzNDk4OCwzNDk5MCwzNDk5MSwzNDk5MiwzNDk5NCwzNDk5NSwzNDk5NiwzNDk5NywzNDk5OCwzNTAwMCwzNTAwMSwzNTAwMiwzNTAwMywzNTAwNSwzNTAwNiwzNTAwNywzNTAwOCwzNTAxMSwzNTAxMiwzNTAxNSwzNTAxNiwzNTAxOCwzNTAxOSwzNTAyMCwzNTAyMSwzNTAyMywzNTAyNCwzNTAyNSwzNTAyNywzNTAzMCwzNTAzMSwzNTAzNCwzNTAzNSwzNTAzNiwzNTAzNywzNTAzOCwzNTA0MCwzNTA0MSwzNTA0NiwzNTA0NywzNTA0OSwzNTA1MCwzNTA1MSwzNTA1MiwzNTA1MywzNTA1NCwzNTA1NSwzNTA1OCwzNTA2MSwzNTA2MiwzNTA2MywzNTA2NiwzNTA2NywzNTA2OSwzNTA3MSwzNTA3MiwzNTA3MywzNTA3NSwzNTA3NiwzNTA3NywzNTA3OCwzNTA3OSwzNTA4MCwzNTA4MSwzNTA4MywzNTA4NCwzNTA4NSwzNTA4NiwzNTA4NywzNTA4OSwzNTA5MiwzNTA5MywzNTA5NCwzNTA5NSwzNTA5NiwzNTEwMCwzNTEwMSwzNTEwMiwzNTEwMywzNTEwNCwzNTEwNiwzNTEwNywzNTEwOCwzNTExMCwzNTExMSwzNTExMiwzNTExMywzNTExNiwzNTExNywzNTExOCwzNTExOSwzNTEyMSwzNTEyMiwzNTEyMywzNTEyNSwzNTEyNywzNjg3MywzMDMwNywzMDUwNSwzMjQ3NCwzODc3MiwzNDIwMywyMzM5OCwzMTM0OCwzODYzNCwzNDg4MCwyMTE5NSwyOTA3MSwyNDQ5MCwyNjA5MiwzNTgxMCwyMzU0NywzOTUzNSwyNDAzMywyNzUyOSwyNzczOSwzNTc1NywzNTc1OSwzNjg3NCwzNjgwNSwyMTM4NywyNTI3Niw0MDQ4Niw0MDQ5MywyMTU2OCwyMDAxMSwzMzQ2OSwyOTI3MywzNDQ2MCwyMzgzMCwzNDkwNSwyODA3OSwzODU5NywyMTcxMywyMDEyMiwzNTc2NiwyODkzNywyMTY5MywzODQwOSwyODg5NSwyODE1MywzMDQxNiwyMDAwNSwzMDc0MCwzNDU3OCwyMzcyMSwyNDMxMCwzNTMyOCwzOTA2OCwzODQxNCwyODgxNCwyNzgzOSwyMjg1MiwyNTUxMywzMDUyNCwzNDg5MywyODQzNiwzMzM5NSwyMjU3NiwyOTE0MSwyMTM4OCwzMDc0NiwzODU5MywyMTc2MSwyNDQyMiwyODk3NiwyMzQ3NiwzNTg2NiwzOTU2NCwyNzUyMywyMjgzMCw0MDQ5NSwzMTIwNywyNjQ3MiwyNTE5NiwyMDMzNSwzMDExMywzMjY1MCwyNzkxNSwzODQ1MSwyNzY4NywyMDIwOCwzMDE2MiwyMDg1OSwyNjY3OSwyODQ3OCwzNjk5MiwzMzEzNiwyMjkzNCwyOTgxNCwzNTEyOCwzNTEyOSwzNTEzMCwzNTEzMSwzNTEzMiwzNTEzMywzNTEzNCwzNTEzNSwzNTEzNiwzNTEzOCwzNTEzOSwzNTE0MSwzNTE0MiwzNTE0MywzNTE0NCwzNTE0NSwzNTE0NiwzNTE0NywzNTE0OCwzNTE0OSwzNTE1MCwzNTE1MSwzNTE1MiwzNTE1MywzNTE1NCwzNTE1NSwzNTE1NiwzNTE1NywzNTE1OCwzNTE1OSwzNTE2MCwzNTE2MSwzNTE2MiwzNTE2MywzNTE2NCwzNTE2NSwzNTE2OCwzNTE2OSwzNTE3MCwzNTE3MSwzNTE3MiwzNTE3MywzNTE3NSwzNTE3NiwzNTE3NywzNTE3OCwzNTE3OSwzNTE4MCwzNTE4MSwzNTE4MiwzNTE4MywzNTE4NCwzNTE4NSwzNTE4NiwzNTE4NywzNTE4OCwzNTE4OSwzNTE5MCwzNTE5MSwzNTE5MiwzNTE5MywzNTE5NCwzNTE5NiwzNTE5NywzNTE5OCwzNTIwMCwzNTIwMiwzNTIwNCwzNTIwNSwzNTIwNywzNTIwOCwzNTIwOSwzNTIxMCwzNTIxMSwzNTIxMiwzNTIxMywzNTIxNCwzNTIxNSwzNTIxNiwzNTIxNywzNTIxOCwzNTIxOSwzNTIyMCwzNTIyMSwzNTIyMiwzNTIyMywzNTIyNCwzNTIyNSwzNTIyNiwzNTIyNywzNTIyOCwzNTIyOSwzNTIzMCwzNTIzMSwzNTIzMiwzNTIzMywyNTY3MSwyMzU5MSwzNjk2NSwzMTM3NywzNTg3NSwyMzAwMiwyMTY3NiwzMzI4MCwzMzY0NywzNTIwMSwzMjc2OCwyNjkyOCwyMjA5NCwzMjgyMiwyOTIzOSwzNzMyNiwyMDkxOCwyMDA2MywzOTAyOSwyNTQ5NCwxOTk5NCwyMTQ5NCwyNjM1NSwzMzA5OSwyMjgxMiwyODA4MiwxOTk2OCwyMjc3NywyMTMwNywyNTU1OCwzODEyOSwyMDM4MSwyMDIzNCwzNDkxNSwzOTA1NiwyMjgzOSwzNjk1MSwzMTIyNywyMDIwMiwzMzAwOCwzMDA5NywyNzc3OCwyMzQ1MiwyMzAxNiwyNDQxMywyNjg4NSwzNDQzMywyMDUwNiwyNDA1MCwyMDA1NywzMDY5MSwyMDE5NywzMzQwMiwyNTIzMywyNjEzMSwzNzAwOSwyMzY3MywyMDE1OSwyNDQ0MSwzMzIyMiwzNjkyMCwzMjkwMCwzMDEyMywyMDEzNCwzNTAyOCwyNDg0NywyNzU4OSwyNDUxOCwyMDA0MSwzMDQxMCwyODMyMiwzNTgxMSwzNTc1OCwzNTg1MCwzNTc5MywyNDMyMiwzMjc2NCwzMjcxNiwzMjQ2MiwzMzU4OSwzMzY0MywyMjI0MCwyNzU3NSwzODg5OSwzODQ1MiwyMzAzNSwyMTUzNSwzODEzNCwyODEzOSwyMzQ5MywzOTI3OCwyMzYwOSwyNDM0MSwzODU0NCwzNTIzNCwzNTIzNSwzNTIzNiwzNTIzNywzNTIzOCwzNTIzOSwzNTI0MCwzNTI0MSwzNTI0MiwzNTI0MywzNTI0NCwzNTI0NSwzNTI0NiwzNTI0NywzNTI0OCwzNTI0OSwzNTI1MCwzNTI1MSwzNTI1MiwzNTI1MywzNTI1NCwzNTI1NSwzNTI1NiwzNTI1NywzNTI1OCwzNTI1OSwzNTI2MCwzNTI2MSwzNTI2MiwzNTI2MywzNTI2NCwzNTI2NywzNTI3NywzNTI4MywzNTI4NCwzNTI4NSwzNTI4NywzNTI4OCwzNTI4OSwzNTI5MSwzNTI5MywzNTI5NSwzNTI5NiwzNTI5NywzNTI5OCwzNTMwMCwzNTMwMywzNTMwNCwzNTMwNSwzNTMwNiwzNTMwOCwzNTMwOSwzNTMxMCwzNTMxMiwzNTMxMywzNTMxNCwzNTMxNiwzNTMxNywzNTMxOCwzNTMxOSwzNTMyMCwzNTMyMSwzNTMyMiwzNTMyMywzNTMyNCwzNTMyNSwzNTMyNiwzNTMyNywzNTMyOSwzNTMzMCwzNTMzMSwzNTMzMiwzNTMzMywzNTMzNCwzNTMzNiwzNTMzNywzNTMzOCwzNTMzOSwzNTM0MCwzNTM0MSwzNTM0MiwzNTM0MywzNTM0NCwzNTM0NSwzNTM0NiwzNTM0NywzNTM0OCwzNTM0OSwzNTM1MCwzNTM1MSwzNTM1MiwzNTM1MywzNTM1NCwzNTM1NSwzNTM1NiwzNTM1NywyMTM2MCwzMzUyMSwyNzE4NSwyMzE1Niw0MDU2MCwyNDIxMiwzMjU1MiwzMzcyMSwzMzgyOCwzMzgyOSwzMzYzOSwzNDYzMSwzNjgxNCwzNjE5NCwzMDQwOCwyNDQzMywzOTA2MiwzMDgyOCwyNjE0NCwyMTcyNywyNTMxNywyMDMyMywzMzIxOSwzMDE1MiwyNDI0OCwzODYwNSwzNjM2MiwzNDU1MywyMTY0NywyNzg5MSwyODA0NCwyNzcwNCwyNDcwMywyMTE5MSwyOTk5MiwyNDE4OSwyMDI0OCwyNDczNiwyNDU1MSwyMzU4OCwzMDAwMSwzNzAzOCwzODA4MCwyOTM2OSwyNzgzMywyODIxNiwzNzE5MywyNjM3NywyMTQ1MSwyMTQ5MSwyMDMwNSwzNzMyMSwzNTgyNSwyMTQ0OCwyNDE4OCwzNjgwMiwyODEzMiwyMDExMCwzMDQwMiwyNzAxNCwzNDM5OCwyNDg1OCwzMzI4NiwyMDMxMywyMDQ0NiwzNjkyNiw0MDA2MCwyNDg0MSwyODE4OSwyODE4MCwzODUzMywyMDEwNCwyMzA4OSwzODYzMiwxOTk4MiwyMzY3OSwzMTE2MSwyMzQzMSwzNTgyMSwzMjcwMSwyOTU3NywyMjQ5NSwzMzQxOSwzNzA1NywyMTUwNSwzNjkzNSwyMTk0NywyMzc4NiwyNDQ4MSwyNDg0MCwyNzQ0MiwyOTQyNSwzMjk0NiwzNTQ2NSwzNTM1OCwzNTM1OSwzNTM2MCwzNTM2MSwzNTM2MiwzNTM2MywzNTM2NCwzNTM2NSwzNTM2NiwzNTM2NywzNTM2OCwzNTM2OSwzNTM3MCwzNTM3MSwzNTM3MiwzNTM3MywzNTM3NCwzNTM3NSwzNTM3NiwzNTM3NywzNTM3OCwzNTM3OSwzNTM4MCwzNTM4MSwzNTM4MiwzNTM4MywzNTM4NCwzNTM4NSwzNTM4NiwzNTM4NywzNTM4OCwzNTM4OSwzNTM5MSwzNTM5MiwzNTM5MywzNTM5NCwzNTM5NSwzNTM5NiwzNTM5NywzNTM5OCwzNTM5OSwzNTQwMSwzNTQwMiwzNTQwMywzNTQwNCwzNTQwNSwzNTQwNiwzNTQwNywzNTQwOCwzNTQwOSwzNTQxMCwzNTQxMSwzNTQxMiwzNTQxMywzNTQxNCwzNTQxNSwzNTQxNiwzNTQxNywzNTQxOCwzNTQxOSwzNTQyMCwzNTQyMSwzNTQyMiwzNTQyMywzNTQyNCwzNTQyNSwzNTQyNiwzNTQyNywzNTQyOCwzNTQyOSwzNTQzMCwzNTQzMSwzNTQzMiwzNTQzMywzNTQzNCwzNTQzNSwzNTQzNiwzNTQzNywzNTQzOCwzNTQzOSwzNTQ0MCwzNTQ0MSwzNTQ0MiwzNTQ0MywzNTQ0NCwzNTQ0NSwzNTQ0NiwzNTQ0NywzNTQ0OCwzNTQ1MCwzNTQ1MSwzNTQ1MiwzNTQ1MywzNTQ1NCwzNTQ1NSwzNTQ1NiwyODAyMCwyMzUwNywzNTAyOSwzOTA0NCwzNTk0NywzOTUzMyw0MDQ5OSwyODE3MCwyMDkwMCwyMDgwMywyMjQzNSwzNDk0NSwyMTQwNywyNTU4OCwzNjc1NywyMjI1MywyMTU5MiwyMjI3OCwyOTUwMywyODMwNCwzMjUzNiwzNjgyOCwzMzQ4OSwyNDg5NSwyNDYxNiwzODQ5OCwyNjM1MiwzMjQyMiwzNjIzNCwzNjI5MSwzODA1MywyMzczMSwzMTkwOCwyNjM3NiwyNDc0MiwzODQwNSwzMjc5MiwyMDExMywzNzA5NSwyMTI0OCwzODUwNCwyMDgwMSwzNjgxNiwzNDE2NCwzNzIxMywyNjE5NywzODkwMSwyMzM4MSwyMTI3NywzMDc3NiwyNjQzNCwyNjY4NSwyMTcwNSwyODc5OCwyMzQ3MiwzNjczMywyMDg3NywyMjMxMiwyMTY4MSwyNTg3NCwyNjI0MiwzNjE5MCwzNjE2MywzMzAzOSwzMzkwMCwzNjk3MywzMTk2NywyMDk5MSwzNDI5OSwyNjUzMSwyNjA4OSwyODU3NywzNDQ2OCwzNjQ4MSwyMjEyMiwzNjg5NiwzMDMzOCwyODc5MCwyOTE1NywzNjEzMSwyNTMyMSwyMTAxNywyNzkwMSwzNjE1NiwyNDU5MCwyMjY4NiwyNDk3NCwyNjM2NiwzNjE5MiwyNTE2NiwyMTkzOSwyODE5NSwyNjQxMywzNjcxMSwzNTQ1NywzNTQ1OCwzNTQ1OSwzNTQ2MCwzNTQ2MSwzNTQ2MiwzNTQ2MywzNTQ2NCwzNTQ2NywzNTQ2OCwzNTQ2OSwzNTQ3MCwzNTQ3MSwzNTQ3MiwzNTQ3MywzNTQ3NCwzNTQ3NiwzNTQ3NywzNTQ3OCwzNTQ3OSwzNTQ4MCwzNTQ4MSwzNTQ4MiwzNTQ4MywzNTQ4NCwzNTQ4NSwzNTQ4NiwzNTQ4NywzNTQ4OCwzNTQ4OSwzNTQ5MCwzNTQ5MSwzNTQ5MiwzNTQ5MywzNTQ5NCwzNTQ5NSwzNTQ5NiwzNTQ5NywzNTQ5OCwzNTQ5OSwzNTUwMCwzNTUwMSwzNTUwMiwzNTUwMywzNTUwNCwzNTUwNSwzNTUwNiwzNTUwNywzNTUwOCwzNTUwOSwzNTUxMCwzNTUxMSwzNTUxMiwzNTUxMywzNTUxNCwzNTUxNSwzNTUxNiwzNTUxNywzNTUxOCwzNTUxOSwzNTUyMCwzNTUyMSwzNTUyMiwzNTUyMywzNTUyNCwzNTUyNSwzNTUyNiwzNTUyNywzNTUyOCwzNTUyOSwzNTUzMCwzNTUzMSwzNTUzMiwzNTUzMywzNTUzNCwzNTUzNSwzNTUzNiwzNTUzNywzNTUzOCwzNTUzOSwzNTU0MCwzNTU0MSwzNTU0MiwzNTU0MywzNTU0NCwzNTU0NSwzNTU0NiwzNTU0NywzNTU0OCwzNTU0OSwzNTU1MCwzNTU1MSwzNTU1MiwzNTU1MywzNTU1NCwzNTU1NSwzODExMywzODM5MiwzMDUwNCwyNjYyOSwyNzA0OCwyMTY0MywyMDA0NSwyODg1NiwzNTc4NCwyNTY4OCwyNTk5NSwyMzQyOSwzMTM2NCwyMDUzOCwyMzUyOCwzMDY1MSwyNzYxNywzNTQ0OSwzMTg5NiwyNzgzOCwzMDQxNSwyNjAyNSwzNjc1OSwyMzg1MywyMzYzNywzNDM2MCwyNjYzMiwyMTM0NCwyNTExMiwzMTQ0OSwyODI1MSwzMjUwOSwyNzE2NywzMTQ1NiwyNDQzMiwyODQ2NywyNDM1MiwyNTQ4NCwyODA3MiwyNjQ1NCwxOTk3NiwyNDA4MCwzNjEzNCwyMDE4MywzMjk2MCwzMDI2MCwzODU1NiwyNTMwNywyNjE1NywyNTIxNCwyNzgzNiwzNjIxMywyOTAzMSwzMjYxNywyMDgwNiwzMjkwMywyMTQ4NCwzNjk3NCwyNTI0MCwyMTc0NiwzNDU0NCwzNjc2MSwzMjc3MywzODE2NywzNDA3MSwzNjgyNSwyNzk5MywyOTY0NSwyNjAxNSwzMDQ5NSwyOTk1NiwzMDc1OSwzMzI3NSwzNjEyNiwzODAyNCwyMDM5MCwyNjUxNywzMDEzNywzNTc4NiwzODY2MywyNTM5MSwzODIxNSwzODQ1MywzMzk3NiwyNTM3OSwzMDUyOSwyNDQ0OSwyOTQyNCwyMDEwNSwyNDU5NiwyNTk3MiwyNTMyNywyNzQ5MSwyNTkxOSwzNTU1NiwzNTU1NywzNTU1OCwzNTU1OSwzNTU2MCwzNTU2MSwzNTU2MiwzNTU2MywzNTU2NCwzNTU2NSwzNTU2NiwzNTU2NywzNTU2OCwzNTU2OSwzNTU3MCwzNTU3MSwzNTU3MiwzNTU3MywzNTU3NCwzNTU3NSwzNTU3NiwzNTU3NywzNTU3OCwzNTU3OSwzNTU4MCwzNTU4MSwzNTU4MiwzNTU4MywzNTU4NCwzNTU4NSwzNTU4NiwzNTU4NywzNTU4OCwzNTU4OSwzNTU5MCwzNTU5MiwzNTU5MywzNTU5NCwzNTU5NSwzNTU5NiwzNTU5NywzNTU5OCwzNTU5OSwzNTYwMCwzNTYwMSwzNTYwMiwzNTYwMywzNTYwNCwzNTYwNSwzNTYwNiwzNTYwNywzNTYwOCwzNTYwOSwzNTYxMCwzNTYxMSwzNTYxMiwzNTYxMywzNTYxNCwzNTYxNSwzNTYxNiwzNTYxNywzNTYxOCwzNTYxOSwzNTYyMCwzNTYyMSwzNTYyMywzNTYyNCwzNTYyNSwzNTYyNiwzNTYyNywzNTYyOCwzNTYyOSwzNTYzMCwzNTYzMSwzNTYzMiwzNTYzMywzNTYzNCwzNTYzNSwzNTYzNiwzNTYzNywzNTYzOCwzNTYzOSwzNTY0MCwzNTY0MSwzNTY0MiwzNTY0MywzNTY0NCwzNTY0NSwzNTY0NiwzNTY0NywzNTY0OCwzNTY0OSwzNTY1MCwzNTY1MSwzNTY1MiwzNTY1MywyNDEwMywzMDE1MSwzNzA3MywzNTc3NywzMzQzNywyNjUyNSwyNTkwMywyMTU1MywzNDU4NCwzMDY5MywzMjkzMCwzMzAyNiwyNzcxMywyMDA0MywzMjQ1NSwzMjg0NCwzMDQ1MiwyNjg5MywyNzU0MiwyNTE5MSwyMDU0MCwyMDM1NiwyMjMzNiwyNTM1MSwyNzQ5MCwzNjI4NiwyMTQ4MiwyNjA4OCwzMjQ0MCwyNDUzNSwyNTM3MCwyNTUyNywzMzI2NywzMzI2OCwzMjYyMiwyNDA5MiwyMzc2OSwyMTA0NiwyNjIzNCwzMTIwOSwzMTI1OCwzNjEzNiwyODgyNSwzMDE2NCwyODM4MiwyNzgzNSwzMTM3OCwyMDAxMywzMDQwNSwyNDU0NCwzODA0NywzNDkzNSwzMjQ1NiwzMTE4MSwzMjk1OSwzNzMyNSwyMDIxMCwyMDI0NywzMzMxMSwyMTYwOCwyNDAzMCwyNzk1NCwzNTc4OCwzMTkwOSwzNjcyNCwzMjkyMCwyNDA5MCwyMTY1MCwzMDM4NSwyMzQ0OSwyNjE3MiwzOTU4OCwyOTY2NCwyNjY2NiwzNDUyMywyNjQxNywyOTQ4MiwzNTgzMiwzNTgwMywzNjg4MCwzMTQ4MSwyODg5MSwyOTAzOCwyNTI4NCwzMDYzMywyMjA2NSwyMDAyNywzMzg3OSwyNjYwOSwyMTE2MSwzNDQ5NiwzNjE0MiwzODEzNiwzMTU2OSwzNTY1NCwzNTY1NSwzNTY1NiwzNTY1NywzNTY1OCwzNTY1OSwzNTY2MCwzNTY2MSwzNTY2MiwzNTY2MywzNTY2NCwzNTY2NSwzNTY2NiwzNTY2NywzNTY2OCwzNTY2OSwzNTY3MCwzNTY3MSwzNTY3MiwzNTY3MywzNTY3NCwzNTY3NSwzNTY3NiwzNTY3NywzNTY3OCwzNTY3OSwzNTY4MCwzNTY4MSwzNTY4MiwzNTY4MywzNTY4NCwzNTY4NSwzNTY4NywzNTY4OCwzNTY4OSwzNTY5MCwzNTY5MSwzNTY5MywzNTY5NCwzNTY5NSwzNTY5NiwzNTY5NywzNTY5OCwzNTY5OSwzNTcwMCwzNTcwMSwzNTcwMiwzNTcwMywzNTcwNCwzNTcwNSwzNTcwNiwzNTcwNywzNTcwOCwzNTcwOSwzNTcxMCwzNTcxMSwzNTcxMiwzNTcxMywzNTcxNCwzNTcxNSwzNTcxNiwzNTcxNywzNTcxOCwzNTcxOSwzNTcyMCwzNTcyMSwzNTcyMiwzNTcyMywzNTcyNCwzNTcyNSwzNTcyNiwzNTcyNywzNTcyOCwzNTcyOSwzNTczMCwzNTczMSwzNTczMiwzNTczMywzNTczNCwzNTczNSwzNTczNiwzNTczNywzNTczOCwzNTczOSwzNTc0MCwzNTc0MSwzNTc0MiwzNTc0MywzNTc1NiwzNTc2MSwzNTc3MSwzNTc4MywzNTc5MiwzNTgxOCwzNTg0OSwzNTg3MCwyMDMwMywyNzg4MCwzMTA2OSwzOTU0NywyNTIzNSwyOTIyNiwyNTM0MSwxOTk4NywzMDc0MiwzNjcxNiwyNTc3NiwzNjE4NiwzMTY4NiwyNjcyOSwyNDE5NiwzNTAxMywyMjkxOCwyNTc1OCwyMjc2NiwyOTM2NiwyNjg5NCwzODE4MSwzNjg2MSwzNjE4NCwyMjM2OCwzMjUxMiwzNTg0NiwyMDkzNCwyNTQxNywyNTMwNSwyMTMzMSwyNjcwMCwyOTczMCwzMzUzNywzNzE5NiwyMTgyOCwzMDUyOCwyODc5NiwyNzk3OCwyMDg1NywyMTY3MiwzNjE2NCwyMzAzOSwyODM2MywyODEwMCwyMzM4OCwzMjA0MywyMDE4MCwzMTg2OSwyODM3MSwyMzM3NiwzMzI1OCwyODE3MywyMzM4MywzOTY4MywyNjgzNywzNjM5NCwyMzQ0NywzMjUwOCwyNDYzNSwzMjQzNywzNzA0OSwzNjIwOCwyMjg2MywyNTU0OSwzMTE5OSwzNjI3NSwyMTMzMCwyNjA2MywzMTA2MiwzNTc4MSwzODQ1OSwzMjQ1MiwzODA3NSwzMjM4NiwyMjA2OCwzNzI1NywyNjM2OCwzMjYxOCwyMzU2MiwzNjk4MSwyNjE1MiwyNDAzOCwyMDMwNCwyNjU5MCwyMDU3MCwyMDMxNiwyMjM1MiwyNDIzMSw1OTQwOCw1OTQwOSw1OTQxMCw1OTQxMSw1OTQxMiwzNTg5NiwzNTg5NywzNTg5OCwzNTg5OSwzNTkwMCwzNTkwMSwzNTkwMiwzNTkwMywzNTkwNCwzNTkwNiwzNTkwNywzNTkwOCwzNTkwOSwzNTkxMiwzNTkxNCwzNTkxNSwzNTkxNywzNTkxOCwzNTkxOSwzNTkyMCwzNTkyMSwzNTkyMiwzNTkyMywzNTkyNCwzNTkyNiwzNTkyNywzNTkyOCwzNTkyOSwzNTkzMSwzNTkzMiwzNTkzMywzNTkzNCwzNTkzNSwzNTkzNiwzNTkzOSwzNTk0MCwzNTk0MSwzNTk0MiwzNTk0MywzNTk0NCwzNTk0NSwzNTk0OCwzNTk0OSwzNTk1MCwzNTk1MSwzNTk1MiwzNTk1MywzNTk1NCwzNTk1NiwzNTk1NywzNTk1OCwzNTk1OSwzNTk2MywzNTk2NCwzNTk2NSwzNTk2NiwzNTk2NywzNTk2OCwzNTk2OSwzNTk3MSwzNTk3MiwzNTk3NCwzNTk3NSwzNTk3NiwzNTk3OSwzNTk4MSwzNTk4MiwzNTk4MywzNTk4NCwzNTk4NSwzNTk4NiwzNTk4NywzNTk4OSwzNTk5MCwzNTk5MSwzNTk5MywzNTk5NCwzNTk5NSwzNTk5NiwzNTk5NywzNTk5OCwzNTk5OSwzNjAwMCwzNjAwMSwzNjAwMiwzNjAwMywzNjAwNCwzNjAwNSwzNjAwNiwzNjAwNywzNjAwOCwzNjAwOSwzNjAxMCwzNjAxMSwzNjAxMiwzNjAxMywyMDEwOSwxOTk4MCwyMDgwMCwxOTk4NCwyNDMxOSwyMTMxNywxOTk4OSwyMDEyMCwxOTk5OCwzOTczMCwyMzQwNCwyMjEyMSwyMDAwOCwzMTE2MiwyMDAzMSwyMTI2OSwyMDAzOSwyMjgyOSwyOTI0MywyMTM1OCwyNzY2NCwyMjIzOSwzMjk5NiwzOTMxOSwyNzYwMywzMDU5MCw0MDcyNywyMDAyMiwyMDEyNyw0MDcyMCwyMDA2MCwyMDA3MywyMDExNSwzMzQxNiwyMzM4NywyMTg2OCwyMjAzMSwyMDE2NCwyMTM4OSwyMTQwNSwyMTQxMSwyMTQxMywyMTQyMiwzODc1NywzNjE4OSwyMTI3NCwyMTQ5MywyMTI4NiwyMTI5NCwyMTMxMCwzNjE4OCwyMTM1MCwyMTM0NywyMDk5NCwyMTAwMCwyMTAwNiwyMTAzNywyMTA0MywyMTA1NSwyMTA1NiwyMTA2OCwyMTA4NiwyMTA4OSwyMTA4NCwzMzk2NywyMTExNywyMTEyMiwyMTEyMSwyMTEzNiwyMTEzOSwyMDg2NiwzMjU5NiwyMDE1NSwyMDE2MywyMDE2OSwyMDE2MiwyMDIwMCwyMDE5MywyMDIwMywyMDE5MCwyMDI1MSwyMDIxMSwyMDI1OCwyMDMyNCwyMDIxMywyMDI2MSwyMDI2MywyMDIzMywyMDI2NywyMDMxOCwyMDMyNywyNTkxMiwyMDMxNCwyMDMxNywzNjAxNCwzNjAxNSwzNjAxNiwzNjAxNywzNjAxOCwzNjAxOSwzNjAyMCwzNjAyMSwzNjAyMiwzNjAyMywzNjAyNCwzNjAyNSwzNjAyNiwzNjAyNywzNjAyOCwzNjAyOSwzNjAzMCwzNjAzMSwzNjAzMiwzNjAzMywzNjAzNCwzNjAzNSwzNjAzNiwzNjAzNywzNjAzOCwzNjAzOSwzNjA0MCwzNjA0MSwzNjA0MiwzNjA0MywzNjA0NCwzNjA0NSwzNjA0NiwzNjA0NywzNjA0OCwzNjA0OSwzNjA1MCwzNjA1MSwzNjA1MiwzNjA1MywzNjA1NCwzNjA1NSwzNjA1NiwzNjA1NywzNjA1OCwzNjA1OSwzNjA2MCwzNjA2MSwzNjA2MiwzNjA2MywzNjA2NCwzNjA2NSwzNjA2NiwzNjA2NywzNjA2OCwzNjA2OSwzNjA3MCwzNjA3MSwzNjA3MiwzNjA3MywzNjA3NCwzNjA3NSwzNjA3NiwzNjA3NywzNjA3OCwzNjA3OSwzNjA4MCwzNjA4MSwzNjA4MiwzNjA4MywzNjA4NCwzNjA4NSwzNjA4NiwzNjA4NywzNjA4OCwzNjA4OSwzNjA5MCwzNjA5MSwzNjA5MiwzNjA5MywzNjA5NCwzNjA5NSwzNjA5NiwzNjA5NywzNjA5OCwzNjA5OSwzNjEwMCwzNjEwMSwzNjEwMiwzNjEwMywzNjEwNCwzNjEwNSwzNjEwNiwzNjEwNywzNjEwOCwzNjEwOSwyMDMxOSwyMDMxMSwyMDI3NCwyMDI4NSwyMDM0MiwyMDM0MCwyMDM2OSwyMDM2MSwyMDM1NSwyMDM2NywyMDM1MCwyMDM0NywyMDM5NCwyMDM0OCwyMDM5NiwyMDM3MiwyMDQ1NCwyMDQ1NiwyMDQ1OCwyMDQyMSwyMDQ0MiwyMDQ1MSwyMDQ0NCwyMDQzMywyMDQ0NywyMDQ3MiwyMDUyMSwyMDU1NiwyMDQ2NywyMDUyNCwyMDQ5NSwyMDUyNiwyMDUyNSwyMDQ3OCwyMDUwOCwyMDQ5MiwyMDUxNywyMDUyMCwyMDYwNiwyMDU0NywyMDU2NSwyMDU1MiwyMDU1OCwyMDU4OCwyMDYwMywyMDY0NSwyMDY0NywyMDY0OSwyMDY2NiwyMDY5NCwyMDc0MiwyMDcxNywyMDcxNiwyMDcxMCwyMDcxOCwyMDc0MywyMDc0NywyMDE4OSwyNzcwOSwyMDMxMiwyMDMyNSwyMDQzMCw0MDg2NCwyNzcxOCwzMTg2MCwyMDg0NiwyNDA2MSw0MDY0OSwzOTMyMCwyMDg2NSwyMjgwNCwyMTI0MSwyMTI2MSwzNTMzNSwyMTI2NCwyMDk3MSwyMjgwOSwyMDgyMSwyMDEyOCwyMDgyMiwyMDE0NywzNDkyNiwzNDk4MCwyMDE0OSwzMzA0NCwzNTAyNiwzMTEwNCwyMzM0OCwzNDgxOSwzMjY5NiwyMDkwNywyMDkxMywyMDkyNSwyMDkyNCwzNjExMCwzNjExMSwzNjExMiwzNjExMywzNjExNCwzNjExNSwzNjExNiwzNjExNywzNjExOCwzNjExOSwzNjEyMCwzNjEyMSwzNjEyMiwzNjEyMywzNjEyNCwzNjEyOCwzNjE3NywzNjE3OCwzNjE4MywzNjE5MSwzNjE5NywzNjIwMCwzNjIwMSwzNjIwMiwzNjIwNCwzNjIwNiwzNjIwNywzNjIwOSwzNjIxMCwzNjIxNiwzNjIxNywzNjIxOCwzNjIxOSwzNjIyMCwzNjIyMSwzNjIyMiwzNjIyMywzNjIyNCwzNjIyNiwzNjIyNywzNjIzMCwzNjIzMSwzNjIzMiwzNjIzMywzNjIzNiwzNjIzNywzNjIzOCwzNjIzOSwzNjI0MCwzNjI0MiwzNjI0MywzNjI0NSwzNjI0NiwzNjI0NywzNjI0OCwzNjI0OSwzNjI1MCwzNjI1MSwzNjI1MiwzNjI1MywzNjI1NCwzNjI1NiwzNjI1NywzNjI1OCwzNjI2MCwzNjI2MSwzNjI2MiwzNjI2MywzNjI2NCwzNjI2NSwzNjI2NiwzNjI2NywzNjI2OCwzNjI2OSwzNjI3MCwzNjI3MSwzNjI3MiwzNjI3NCwzNjI3OCwzNjI3OSwzNjI4MSwzNjI4MywzNjI4NSwzNjI4OCwzNjI4OSwzNjI5MCwzNjI5MywzNjI5NSwzNjI5NiwzNjI5NywzNjI5OCwzNjMwMSwzNjMwNCwzNjMwNiwzNjMwNywzNjMwOCwyMDkzNSwyMDg4NiwyMDg5OCwyMDkwMSwzNTc0NCwzNTc1MCwzNTc1MSwzNTc1NCwzNTc2NCwzNTc2NSwzNTc2NywzNTc3OCwzNTc3OSwzNTc4NywzNTc5MSwzNTc5MCwzNTc5NCwzNTc5NSwzNTc5NiwzNTc5OCwzNTgwMCwzNTgwMSwzNTgwNCwzNTgwNywzNTgwOCwzNTgxMiwzNTgxNiwzNTgxNywzNTgyMiwzNTgyNCwzNTgyNywzNTgzMCwzNTgzMywzNTgzNiwzNTgzOSwzNTg0MCwzNTg0MiwzNTg0NCwzNTg0NywzNTg1MiwzNTg1NSwzNTg1NywzNTg1OCwzNTg2MCwzNTg2MSwzNTg2MiwzNTg2NSwzNTg2NywzNTg2NCwzNTg2OSwzNTg3MSwzNTg3MiwzNTg3MywzNTg3NywzNTg3OSwzNTg4MiwzNTg4MywzNTg4NiwzNTg4NywzNTg5MCwzNTg5MSwzNTg5MywzNTg5NCwyMTM1MywyMTM3MCwzODQyOSwzODQzNCwzODQzMywzODQ0OSwzODQ0MiwzODQ2MSwzODQ2MCwzODQ2NiwzODQ3MywzODQ4NCwzODQ5NSwzODUwMywzODUwOCwzODUxNCwzODUxNiwzODUzNiwzODU0MSwzODU1MSwzODU3NiwzNzAxNSwzNzAxOSwzNzAyMSwzNzAxNywzNzAzNiwzNzAyNSwzNzA0NCwzNzA0MywzNzA0NiwzNzA1MCwzNjMwOSwzNjMxMiwzNjMxMywzNjMxNiwzNjMyMCwzNjMyMSwzNjMyMiwzNjMyNSwzNjMyNiwzNjMyNywzNjMyOSwzNjMzMywzNjMzNCwzNjMzNiwzNjMzNywzNjMzOCwzNjM0MCwzNjM0MiwzNjM0OCwzNjM1MCwzNjM1MSwzNjM1MiwzNjM1MywzNjM1NCwzNjM1NSwzNjM1NiwzNjM1OCwzNjM1OSwzNjM2MCwzNjM2MywzNjM2NSwzNjM2NiwzNjM2OCwzNjM2OSwzNjM3MCwzNjM3MSwzNjM3MywzNjM3NCwzNjM3NSwzNjM3NiwzNjM3NywzNjM3OCwzNjM3OSwzNjM4MCwzNjM4NCwzNjM4NSwzNjM4OCwzNjM4OSwzNjM5MCwzNjM5MSwzNjM5MiwzNjM5NSwzNjM5NywzNjQwMCwzNjQwMiwzNjQwMywzNjQwNCwzNjQwNiwzNjQwNywzNjQwOCwzNjQxMSwzNjQxMiwzNjQxNCwzNjQxNSwzNjQxOSwzNjQyMSwzNjQyMiwzNjQyOCwzNjQyOSwzNjQzMCwzNjQzMSwzNjQzMiwzNjQzNSwzNjQzNiwzNjQzNywzNjQzOCwzNjQzOSwzNjQ0MCwzNjQ0MiwzNjQ0MywzNjQ0NCwzNjQ0NSwzNjQ0NiwzNjQ0NywzNjQ0OCwzNjQ0OSwzNjQ1MCwzNjQ1MSwzNjQ1MiwzNjQ1MywzNjQ1NSwzNjQ1NiwzNjQ1OCwzNjQ1OSwzNjQ2MiwzNjQ2NSwzNzA0OCwzNzA0MCwzNzA3MSwzNzA2MSwzNzA1NCwzNzA3MiwzNzA2MCwzNzA2MywzNzA3NSwzNzA5NCwzNzA5MCwzNzA4NCwzNzA3OSwzNzA4MywzNzA5OSwzNzEwMywzNzExOCwzNzEyNCwzNzE1NCwzNzE1MCwzNzE1NSwzNzE2OSwzNzE2NywzNzE3NywzNzE4NywzNzE5MCwyMTAwNSwyMjg1MCwyMTE1NCwyMTE2NCwyMTE2NSwyMTE4MiwyMTc1OSwyMTIwMCwyMTIwNiwyMTIzMiwyMTQ3MSwyOTE2NiwzMDY2OSwyNDMwOCwyMDk4MSwyMDk4OCwzOTcyNywyMTQzMCwyNDMyMSwzMDA0MiwyNDA0NywyMjM0OCwyMjQ0MSwyMjQzMywyMjY1NCwyMjcxNiwyMjcyNSwyMjczNywyMjMxMywyMjMxNiwyMjMxNCwyMjMyMywyMjMyOSwyMjMxOCwyMjMxOSwyMjM2NCwyMjMzMSwyMjMzOCwyMjM3NywyMjQwNSwyMjM3OSwyMjQwNiwyMjM5NiwyMjM5NSwyMjM3NiwyMjM4MSwyMjM5MCwyMjM4NywyMjQ0NSwyMjQzNiwyMjQxMiwyMjQ1MCwyMjQ3OSwyMjQzOSwyMjQ1MiwyMjQxOSwyMjQzMiwyMjQ4NSwyMjQ4OCwyMjQ5MCwyMjQ4OSwyMjQ4MiwyMjQ1NiwyMjUxNiwyMjUxMSwyMjUyMCwyMjUwMCwyMjQ5MywzNjQ2NywzNjQ2OSwzNjQ3MSwzNjQ3MiwzNjQ3MywzNjQ3NCwzNjQ3NSwzNjQ3NywzNjQ3OCwzNjQ4MCwzNjQ4MiwzNjQ4MywzNjQ4NCwzNjQ4NiwzNjQ4OCwzNjQ4OSwzNjQ5MCwzNjQ5MSwzNjQ5MiwzNjQ5MywzNjQ5NCwzNjQ5NywzNjQ5OCwzNjQ5OSwzNjUwMSwzNjUwMiwzNjUwMywzNjUwNCwzNjUwNSwzNjUwNiwzNjUwNywzNjUwOSwzNjUxMSwzNjUxMiwzNjUxMywzNjUxNCwzNjUxNSwzNjUxNiwzNjUxNywzNjUxOCwzNjUxOSwzNjUyMCwzNjUyMSwzNjUyMiwzNjUyNSwzNjUyNiwzNjUyOCwzNjUyOSwzNjUzMSwzNjUzMiwzNjUzMywzNjUzNCwzNjUzNSwzNjUzNiwzNjUzNywzNjUzOSwzNjU0MCwzNjU0MSwzNjU0MiwzNjU0MywzNjU0NCwzNjU0NSwzNjU0NiwzNjU0NywzNjU0OCwzNjU0OSwzNjU1MCwzNjU1MSwzNjU1MiwzNjU1MywzNjU1NCwzNjU1NSwzNjU1NiwzNjU1NywzNjU1OSwzNjU2MCwzNjU2MSwzNjU2MiwzNjU2MywzNjU2NCwzNjU2NSwzNjU2NiwzNjU2NywzNjU2OCwzNjU2OSwzNjU3MCwzNjU3MSwzNjU3MiwzNjU3MywzNjU3NCwzNjU3NSwzNjU3NiwzNjU3NywzNjU3OCwzNjU3OSwzNjU4MCwyMjUzOSwyMjU0MSwyMjUyNSwyMjUwOSwyMjUyOCwyMjU1OCwyMjU1MywyMjU5NiwyMjU2MCwyMjYyOSwyMjYzNiwyMjY1NywyMjY2NSwyMjY4MiwyMjY1NiwzOTMzNiw0MDcyOSwyNTA4NywzMzQwMSwzMzQwNSwzMzQwNywzMzQyMywzMzQxOCwzMzQ0OCwzMzQxMiwzMzQyMiwzMzQyNSwzMzQzMSwzMzQzMywzMzQ1MSwzMzQ2NCwzMzQ3MCwzMzQ1NiwzMzQ4MCwzMzQ4MiwzMzUwNywzMzQzMiwzMzQ2MywzMzQ1NCwzMzQ4MywzMzQ4NCwzMzQ3MywzMzQ0OSwzMzQ2MCwzMzQ0MSwzMzQ1MCwzMzQzOSwzMzQ3NiwzMzQ4NiwzMzQ0NCwzMzUwNSwzMzU0NSwzMzUyNywzMzUwOCwzMzU1MSwzMzU0MywzMzUwMCwzMzUyNCwzMzQ5MCwzMzQ5NiwzMzU0OCwzMzUzMSwzMzQ5MSwzMzU1MywzMzU2MiwzMzU0MiwzMzU1NiwzMzU1NywzMzUwNCwzMzQ5MywzMzU2NCwzMzYxNywzMzYyNywzMzYyOCwzMzU0NCwzMzY4MiwzMzU5NiwzMzU4OCwzMzU4NSwzMzY5MSwzMzYzMCwzMzU4MywzMzYxNSwzMzYwNywzMzYwMywzMzYzMSwzMzYwMCwzMzU1OSwzMzYzMiwzMzU4MSwzMzU5NCwzMzU4NywzMzYzOCwzMzYzNywzNjU4MSwzNjU4MiwzNjU4MywzNjU4NCwzNjU4NSwzNjU4NiwzNjU4NywzNjU4OCwzNjU4OSwzNjU5MCwzNjU5MSwzNjU5MiwzNjU5MywzNjU5NCwzNjU5NSwzNjU5NiwzNjU5NywzNjU5OCwzNjU5OSwzNjYwMCwzNjYwMSwzNjYwMiwzNjYwMywzNjYwNCwzNjYwNSwzNjYwNiwzNjYwNywzNjYwOCwzNjYwOSwzNjYxMCwzNjYxMSwzNjYxMiwzNjYxMywzNjYxNCwzNjYxNSwzNjYxNiwzNjYxNywzNjYxOCwzNjYxOSwzNjYyMCwzNjYyMSwzNjYyMiwzNjYyMywzNjYyNCwzNjYyNSwzNjYyNiwzNjYyNywzNjYyOCwzNjYyOSwzNjYzMCwzNjYzMSwzNjYzMiwzNjYzMywzNjYzNCwzNjYzNSwzNjYzNiwzNjYzNywzNjYzOCwzNjYzOSwzNjY0MCwzNjY0MSwzNjY0MiwzNjY0MywzNjY0NCwzNjY0NSwzNjY0NiwzNjY0NywzNjY0OCwzNjY0OSwzNjY1MCwzNjY1MSwzNjY1MiwzNjY1MywzNjY1NCwzNjY1NSwzNjY1NiwzNjY1NywzNjY1OCwzNjY1OSwzNjY2MCwzNjY2MSwzNjY2MiwzNjY2MywzNjY2NCwzNjY2NSwzNjY2NiwzNjY2NywzNjY2OCwzNjY2OSwzNjY3MCwzNjY3MSwzNjY3MiwzNjY3MywzNjY3NCwzNjY3NSwzNjY3NiwzMzY0MCwzMzU2MywzMzY0MSwzMzY0NCwzMzY0MiwzMzY0NSwzMzY0NiwzMzcxMiwzMzY1NiwzMzcxNSwzMzcxNiwzMzY5NiwzMzcwNiwzMzY4MywzMzY5MiwzMzY2OSwzMzY2MCwzMzcxOCwzMzcwNSwzMzY2MSwzMzcyMCwzMzY1OSwzMzY4OCwzMzY5NCwzMzcwNCwzMzcyMiwzMzcyNCwzMzcyOSwzMzc5MywzMzc2NSwzMzc1MiwyMjUzNSwzMzgxNiwzMzgwMywzMzc1NywzMzc4OSwzMzc1MCwzMzgyMCwzMzg0OCwzMzgwOSwzMzc5OCwzMzc0OCwzMzc1OSwzMzgwNywzMzc5NSwzMzc4NCwzMzc4NSwzMzc3MCwzMzczMywzMzcyOCwzMzgzMCwzMzc3NiwzMzc2MSwzMzg4NCwzMzg3MywzMzg4MiwzMzg4MSwzMzkwNywzMzkyNywzMzkyOCwzMzkxNCwzMzkyOSwzMzkxMiwzMzg1MiwzMzg2MiwzMzg5NywzMzkxMCwzMzkzMiwzMzkzNCwzMzg0MSwzMzkwMSwzMzk4NSwzMzk5NywzNDAwMCwzNDAyMiwzMzk4MSwzNDAwMywzMzk5NCwzMzk4MywzMzk3OCwzNDAxNiwzMzk1MywzMzk3NywzMzk3MiwzMzk0MywzNDAyMSwzNDAxOSwzNDA2MCwyOTk2NSwzNDEwNCwzNDAzMiwzNDEwNSwzNDA3OSwzNDEwNiwzNjY3NywzNjY3OCwzNjY3OSwzNjY4MCwzNjY4MSwzNjY4MiwzNjY4MywzNjY4NCwzNjY4NSwzNjY4NiwzNjY4NywzNjY4OCwzNjY4OSwzNjY5MCwzNjY5MSwzNjY5MiwzNjY5MywzNjY5NCwzNjY5NSwzNjY5NiwzNjY5NywzNjY5OCwzNjY5OSwzNjcwMCwzNjcwMSwzNjcwMiwzNjcwMywzNjcwNCwzNjcwNSwzNjcwNiwzNjcwNywzNjcwOCwzNjcwOSwzNjcxNCwzNjczNiwzNjc0OCwzNjc1NCwzNjc2NSwzNjc2OCwzNjc2OSwzNjc3MCwzNjc3MiwzNjc3MywzNjc3NCwzNjc3NSwzNjc3OCwzNjc4MCwzNjc4MSwzNjc4MiwzNjc4MywzNjc4NiwzNjc4NywzNjc4OCwzNjc4OSwzNjc5MSwzNjc5MiwzNjc5NCwzNjc5NSwzNjc5NiwzNjc5OSwzNjgwMCwzNjgwMywzNjgwNiwzNjgwOSwzNjgxMCwzNjgxMSwzNjgxMiwzNjgxMywzNjgxNSwzNjgxOCwzNjgyMiwzNjgyMywzNjgyNiwzNjgzMiwzNjgzMywzNjgzNSwzNjgzOSwzNjg0NCwzNjg0NywzNjg0OSwzNjg1MCwzNjg1MiwzNjg1MywzNjg1NCwzNjg1OCwzNjg1OSwzNjg2MCwzNjg2MiwzNjg2MywzNjg3MSwzNjg3MiwzNjg3NiwzNjg3OCwzNjg4MywzNjg4NSwzNjg4OCwzNDEzNCwzNDEwNywzNDA0NywzNDA0NCwzNDEzNywzNDEyMCwzNDE1MiwzNDE0OCwzNDE0MiwzNDE3MCwzMDYyNiwzNDExNSwzNDE2MiwzNDE3MSwzNDIxMiwzNDIxNiwzNDE4MywzNDE5MSwzNDE2OSwzNDIyMiwzNDIwNCwzNDE4MSwzNDIzMywzNDIzMSwzNDIyNCwzNDI1OSwzNDI0MSwzNDI2OCwzNDMwMywzNDM0MywzNDMwOSwzNDM0NSwzNDMyNiwzNDM2NCwyNDMxOCwyNDMyOCwyMjg0NCwyMjg0OSwzMjgyMywyMjg2OSwyMjg3NCwyMjg3MiwyMTI2MywyMzU4NiwyMzU4OSwyMzU5NiwyMzYwNCwyNTE2NCwyNTE5NCwyNTI0NywyNTI3NSwyNTI5MCwyNTMwNiwyNTMwMywyNTMyNiwyNTM3OCwyNTMzNCwyNTQwMSwyNTQxOSwyNTQxMSwyNTUxNywyNTU5MCwyNTQ1NywyNTQ2NiwyNTQ4NiwyNTUyNCwyNTQ1MywyNTUxNiwyNTQ4MiwyNTQ0OSwyNTUxOCwyNTUzMiwyNTU4NiwyNTU5MiwyNTU2OCwyNTU5OSwyNTU0MCwyNTU2NiwyNTU1MCwyNTY4MiwyNTU0MiwyNTUzNCwyNTY2OSwyNTY2NSwyNTYxMSwyNTYyNywyNTYzMiwyNTYxMiwyNTYzOCwyNTYzMywyNTY5NCwyNTczMiwyNTcwOSwyNTc1MCwzNjg4OSwzNjg5MiwzNjg5OSwzNjkwMCwzNjkwMSwzNjkwMywzNjkwNCwzNjkwNSwzNjkwNiwzNjkwNywzNjkwOCwzNjkxMiwzNjkxMywzNjkxNCwzNjkxNSwzNjkxNiwzNjkxOSwzNjkyMSwzNjkyMiwzNjkyNSwzNjkyNywzNjkyOCwzNjkzMSwzNjkzMywzNjkzNCwzNjkzNiwzNjkzNywzNjkzOCwzNjkzOSwzNjk0MCwzNjk0MiwzNjk0OCwzNjk0OSwzNjk1MCwzNjk1MywzNjk1NCwzNjk1NiwzNjk1NywzNjk1OCwzNjk1OSwzNjk2MCwzNjk2MSwzNjk2NCwzNjk2NiwzNjk2NywzNjk2OSwzNjk3MCwzNjk3MSwzNjk3MiwzNjk3NSwzNjk3NiwzNjk3NywzNjk3OCwzNjk3OSwzNjk4MiwzNjk4MywzNjk4NCwzNjk4NSwzNjk4NiwzNjk4NywzNjk4OCwzNjk5MCwzNjk5MywzNjk5NiwzNjk5NywzNjk5OCwzNjk5OSwzNzAwMSwzNzAwMiwzNzAwNCwzNzAwNSwzNzAwNiwzNzAwNywzNzAwOCwzNzAxMCwzNzAxMiwzNzAxNCwzNzAxNiwzNzAxOCwzNzAyMCwzNzAyMiwzNzAyMywzNzAyNCwzNzAyOCwzNzAyOSwzNzAzMSwzNzAzMiwzNzAzMywzNzAzNSwzNzAzNywzNzA0MiwzNzA0NywzNzA1MiwzNzA1MywzNzA1NSwzNzA1NiwyNTcyMiwyNTc4MywyNTc4NCwyNTc1MywyNTc4NiwyNTc5MiwyNTgwOCwyNTgxNSwyNTgyOCwyNTgyNiwyNTg2NSwyNTg5MywyNTkwMiwyNDMzMSwyNDUzMCwyOTk3NywyNDMzNywyMTM0MywyMTQ4OSwyMTUwMSwyMTQ4MSwyMTQ4MCwyMTQ5OSwyMTUyMiwyMTUyNiwyMTUxMCwyMTU3OSwyMTU4NiwyMTU4NywyMTU4OCwyMTU5MCwyMTU3MSwyMTUzNywyMTU5MSwyMTU5MywyMTUzOSwyMTU1NCwyMTYzNCwyMTY1MiwyMTYyMywyMTYxNywyMTYwNCwyMTY1OCwyMTY1OSwyMTYzNiwyMTYyMiwyMTYwNiwyMTY2MSwyMTcxMiwyMTY3NywyMTY5OCwyMTY4NCwyMTcxNCwyMTY3MSwyMTY3MCwyMTcxNSwyMTcxNiwyMTYxOCwyMTY2NywyMTcxNywyMTY5MSwyMTY5NSwyMTcwOCwyMTcyMSwyMTcyMiwyMTcyNCwyMTY3MywyMTY3NCwyMTY2OCwyMTcyNSwyMTcxMSwyMTcyNiwyMTc4NywyMTczNSwyMTc5MiwyMTc1NywyMTc4MCwyMTc0NywyMTc5NCwyMTc5NSwyMTc3NSwyMTc3NywyMTc5OSwyMTgwMiwyMTg2MywyMTkwMywyMTk0MSwyMTgzMywyMTg2OSwyMTgyNSwyMTg0NSwyMTgyMywyMTg0MCwyMTgyMCwzNzA1OCwzNzA1OSwzNzA2MiwzNzA2NCwzNzA2NSwzNzA2NywzNzA2OCwzNzA2OSwzNzA3NCwzNzA3NiwzNzA3NywzNzA3OCwzNzA4MCwzNzA4MSwzNzA4MiwzNzA4NiwzNzA4NywzNzA4OCwzNzA5MSwzNzA5MiwzNzA5MywzNzA5NywzNzA5OCwzNzEwMCwzNzEwMiwzNzEwNCwzNzEwNSwzNzEwNiwzNzEwNywzNzEwOSwzNzExMCwzNzExMSwzNzExMywzNzExNCwzNzExNSwzNzExNiwzNzExOSwzNzEyMCwzNzEyMSwzNzEyMywzNzEyNSwzNzEyNiwzNzEyNywzNzEyOCwzNzEyOSwzNzEzMCwzNzEzMSwzNzEzMiwzNzEzMywzNzEzNCwzNzEzNSwzNzEzNiwzNzEzNywzNzEzOCwzNzEzOSwzNzE0MCwzNzE0MSwzNzE0MiwzNzE0MywzNzE0NCwzNzE0NiwzNzE0NywzNzE0OCwzNzE0OSwzNzE1MSwzNzE1MiwzNzE1MywzNzE1NiwzNzE1NywzNzE1OCwzNzE1OSwzNzE2MCwzNzE2MSwzNzE2MiwzNzE2MywzNzE2NCwzNzE2NSwzNzE2NiwzNzE2OCwzNzE3MCwzNzE3MSwzNzE3MiwzNzE3MywzNzE3NCwzNzE3NSwzNzE3NiwzNzE3OCwzNzE3OSwzNzE4MCwzNzE4MSwzNzE4MiwzNzE4MywzNzE4NCwzNzE4NSwzNzE4NiwzNzE4OCwyMTgxNSwyMTg0NiwyMTg3NywyMTg3OCwyMTg3OSwyMTgxMSwyMTgwOCwyMTg1MiwyMTg5OSwyMTk3MCwyMTg5MSwyMTkzNywyMTk0NSwyMTg5NiwyMTg4OSwyMTkxOSwyMTg4NiwyMTk3NCwyMTkwNSwyMTg4MywyMTk4MywyMTk0OSwyMTk1MCwyMTkwOCwyMTkxMywyMTk5NCwyMjAwNywyMTk2MSwyMjA0NywyMTk2OSwyMTk5NSwyMTk5NiwyMTk3MiwyMTk5MCwyMTk4MSwyMTk1NiwyMTk5OSwyMTk4OSwyMjAwMiwyMjAwMywyMTk2NCwyMTk2NSwyMTk5MiwyMjAwNSwyMTk4OCwzNjc1NiwyMjA0NiwyMjAyNCwyMjAyOCwyMjAxNywyMjA1MiwyMjA1MSwyMjAxNCwyMjAxNiwyMjA1NSwyMjA2MSwyMjEwNCwyMjA3MywyMjEwMywyMjA2MCwyMjA5MywyMjExNCwyMjEwNSwyMjEwOCwyMjA5MiwyMjEwMCwyMjE1MCwyMjExNiwyMjEyOSwyMjEyMywyMjEzOSwyMjE0MCwyMjE0OSwyMjE2MywyMjE5MSwyMjIyOCwyMjIzMSwyMjIzNywyMjI0MSwyMjI2MSwyMjI1MSwyMjI2NSwyMjI3MSwyMjI3NiwyMjI4MiwyMjI4MSwyMjMwMCwyNDA3OSwyNDA4OSwyNDA4NCwyNDA4MSwyNDExMywyNDEyMywyNDEyNCwzNzE4OSwzNzE5MSwzNzE5MiwzNzIwMSwzNzIwMywzNzIwNCwzNzIwNSwzNzIwNiwzNzIwOCwzNzIwOSwzNzIxMSwzNzIxMiwzNzIxNSwzNzIxNiwzNzIyMiwzNzIyMywzNzIyNCwzNzIyNywzNzIyOSwzNzIzNSwzNzI0MiwzNzI0MywzNzI0NCwzNzI0OCwzNzI0OSwzNzI1MCwzNzI1MSwzNzI1MiwzNzI1NCwzNzI1NiwzNzI1OCwzNzI2MiwzNzI2MywzNzI2NywzNzI2OCwzNzI2OSwzNzI3MCwzNzI3MSwzNzI3MiwzNzI3MywzNzI3NiwzNzI3NywzNzI3OCwzNzI3OSwzNzI4MCwzNzI4MSwzNzI4NCwzNzI4NSwzNzI4NiwzNzI4NywzNzI4OCwzNzI4OSwzNzI5MSwzNzI5MiwzNzI5NiwzNzI5NywzNzI5OCwzNzI5OSwzNzMwMiwzNzMwMywzNzMwNCwzNzMwNSwzNzMwNywzNzMwOCwzNzMwOSwzNzMxMCwzNzMxMSwzNzMxMiwzNzMxMywzNzMxNCwzNzMxNSwzNzMxNiwzNzMxNywzNzMxOCwzNzMyMCwzNzMyMywzNzMyOCwzNzMzMCwzNzMzMSwzNzMzMiwzNzMzMywzNzMzNCwzNzMzNSwzNzMzNiwzNzMzNywzNzMzOCwzNzMzOSwzNzM0MSwzNzM0MiwzNzM0MywzNzM0NCwzNzM0NSwzNzM0NiwzNzM0NywzNzM0OCwzNzM0OSwyNDExOSwyNDEzMiwyNDE0OCwyNDE1NSwyNDE1OCwyNDE2MSwyMzY5MiwyMzY3NCwyMzY5MywyMzY5NiwyMzcwMiwyMzY4OCwyMzcwNCwyMzcwNSwyMzY5NywyMzcwNiwyMzcwOCwyMzczMywyMzcxNCwyMzc0MSwyMzcyNCwyMzcyMywyMzcyOSwyMzcxNSwyMzc0NSwyMzczNSwyMzc0OCwyMzc2MiwyMzc4MCwyMzc1NSwyMzc4MSwyMzgxMCwyMzgxMSwyMzg0NywyMzg0NiwyMzg1NCwyMzg0NCwyMzgzOCwyMzgxNCwyMzgzNSwyMzg5NiwyMzg3MCwyMzg2MCwyMzg2OSwyMzkxNiwyMzg5OSwyMzkxOSwyMzkwMSwyMzkxNSwyMzg4MywyMzg4MiwyMzkxMywyMzkyNCwyMzkzOCwyMzk2MSwyMzk2NSwzNTk1NSwyMzk5MSwyNDAwNSwyNDQzNSwyNDQzOSwyNDQ1MCwyNDQ1NSwyNDQ1NywyNDQ2MCwyNDQ2OSwyNDQ3MywyNDQ3NiwyNDQ4OCwyNDQ5MywyNDUwMSwyNDUwOCwzNDkxNCwyNDQxNywyOTM1NywyOTM2MCwyOTM2NCwyOTM2NywyOTM2OCwyOTM3OSwyOTM3NywyOTM5MCwyOTM4OSwyOTM5NCwyOTQxNiwyOTQyMywyOTQxNywyOTQyNiwyOTQyOCwyOTQzMSwyOTQ0MSwyOTQyNywyOTQ0MywyOTQzNCwzNzM1MCwzNzM1MSwzNzM1MiwzNzM1MywzNzM1NCwzNzM1NSwzNzM1NiwzNzM1NywzNzM1OCwzNzM1OSwzNzM2MCwzNzM2MSwzNzM2MiwzNzM2MywzNzM2NCwzNzM2NSwzNzM2NiwzNzM2NywzNzM2OCwzNzM2OSwzNzM3MCwzNzM3MSwzNzM3MiwzNzM3MywzNzM3NCwzNzM3NSwzNzM3NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM4NywzNzM4OCwzNzM4OSwzNzM5MCwzNzM5MSwzNzM5MiwzNzM5MywzNzM5NCwzNzM5NSwzNzM5NiwzNzM5NywzNzM5OCwzNzM5OSwzNzQwMCwzNzQwMSwzNzQwMiwzNzQwMywzNzQwNCwzNzQwNSwzNzQwNiwzNzQwNywzNzQwOCwzNzQwOSwzNzQxMCwzNzQxMSwzNzQxMiwzNzQxMywzNzQxNCwzNzQxNSwzNzQxNiwzNzQxNywzNzQxOCwzNzQxOSwzNzQyMCwzNzQyMSwzNzQyMiwzNzQyMywzNzQyNCwzNzQyNSwzNzQyNiwzNzQyNywzNzQyOCwzNzQyOSwzNzQzMCwzNzQzMSwzNzQzMiwzNzQzMywzNzQzNCwzNzQzNSwzNzQzNiwzNzQzNywzNzQzOCwzNzQzOSwzNzQ0MCwzNzQ0MSwzNzQ0MiwzNzQ0MywzNzQ0NCwzNzQ0NSwyOTQzNSwyOTQ2MywyOTQ1OSwyOTQ3MywyOTQ1MCwyOTQ3MCwyOTQ2OSwyOTQ2MSwyOTQ3NCwyOTQ5NywyOTQ3NywyOTQ4NCwyOTQ5NiwyOTQ4OSwyOTUyMCwyOTUxNywyOTUyNywyOTUzNiwyOTU0OCwyOTU1MSwyOTU2NiwzMzMwNywyMjgyMSwzOTE0MywyMjgyMCwyMjc4NiwzOTI2NywzOTI3MSwzOTI3MiwzOTI3MywzOTI3NCwzOTI3NSwzOTI3NiwzOTI4NCwzOTI4NywzOTI5MywzOTI5NiwzOTMwMCwzOTMwMywzOTMwNiwzOTMwOSwzOTMxMiwzOTMxMywzOTMxNSwzOTMxNiwzOTMxNywyNDE5MiwyNDIwOSwyNDIwMywyNDIxNCwyNDIyOSwyNDIyNCwyNDI0OSwyNDI0NSwyNDI1NCwyNDI0MywzNjE3OSwyNDI3NCwyNDI3MywyNDI4MywyNDI5NiwyNDI5OCwzMzIxMCwyNDUxNiwyNDUyMSwyNDUzNCwyNDUyNywyNDU3OSwyNDU1OCwyNDU4MCwyNDU0NSwyNDU0OCwyNDU3NCwyNDU4MSwyNDU4MiwyNDU1NCwyNDU1NywyNDU2OCwyNDYwMSwyNDYyOSwyNDYxNCwyNDYwMywyNDU5MSwyNDU4OSwyNDYxNywyNDYxOSwyNDU4NiwyNDYzOSwyNDYwOSwyNDY5NiwyNDY5NywyNDY5OSwyNDY5OCwyNDY0MiwzNzQ0NiwzNzQ0NywzNzQ0OCwzNzQ0OSwzNzQ1MCwzNzQ1MSwzNzQ1MiwzNzQ1MywzNzQ1NCwzNzQ1NSwzNzQ1NiwzNzQ1NywzNzQ1OCwzNzQ1OSwzNzQ2MCwzNzQ2MSwzNzQ2MiwzNzQ2MywzNzQ2NCwzNzQ2NSwzNzQ2NiwzNzQ2NywzNzQ2OCwzNzQ2OSwzNzQ3MCwzNzQ3MSwzNzQ3MiwzNzQ3MywzNzQ3NCwzNzQ3NSwzNzQ3NiwzNzQ3NywzNzQ3OCwzNzQ3OSwzNzQ4MCwzNzQ4MSwzNzQ4MiwzNzQ4MywzNzQ4NCwzNzQ4NSwzNzQ4NiwzNzQ4NywzNzQ4OCwzNzQ4OSwzNzQ5MCwzNzQ5MSwzNzQ5MywzNzQ5NCwzNzQ5NSwzNzQ5NiwzNzQ5NywzNzQ5OCwzNzQ5OSwzNzUwMCwzNzUwMSwzNzUwMiwzNzUwMywzNzUwNCwzNzUwNSwzNzUwNiwzNzUwNywzNzUwOCwzNzUwOSwzNzUxMCwzNzUxMSwzNzUxMiwzNzUxMywzNzUxNCwzNzUxNSwzNzUxNiwzNzUxNywzNzUxOSwzNzUyMCwzNzUyMSwzNzUyMiwzNzUyMywzNzUyNCwzNzUyNSwzNzUyNiwzNzUyNywzNzUyOCwzNzUyOSwzNzUzMCwzNzUzMSwzNzUzMiwzNzUzMywzNzUzNCwzNzUzNSwzNzUzNiwzNzUzNywzNzUzOCwzNzUzOSwzNzU0MCwzNzU0MSwzNzU0MiwzNzU0MywyNDY4MiwyNDcwMSwyNDcyNiwyNDczMCwyNDc0OSwyNDczMywyNDcwNywyNDcyMiwyNDcxNiwyNDczMSwyNDgxMiwyNDc2MywyNDc1MywyNDc5NywyNDc5MiwyNDc3NCwyNDc5NCwyNDc1NiwyNDg2NCwyNDg3MCwyNDg1MywyNDg2NywyNDgyMCwyNDgzMiwyNDg0NiwyNDg3NSwyNDkwNiwyNDk0OSwyNTAwNCwyNDk4MCwyNDk5OSwyNTAxNSwyNTA0NCwyNTA3NywyNDU0MSwzODU3OSwzODM3NywzODM3OSwzODM4NSwzODM4NywzODM4OSwzODM5MCwzODM5NiwzODM5OCwzODQwMywzODQwNCwzODQwNiwzODQwOCwzODQxMCwzODQxMSwzODQxMiwzODQxMywzODQxNSwzODQxOCwzODQyMSwzODQyMiwzODQyMywzODQyNSwzODQyNiwyMDAxMiwyOTI0NywyNTEwOSwyNzcwMSwyNzczMiwyNzc0MCwyNzcyMiwyNzgxMSwyNzc4MSwyNzc5MiwyNzc5NiwyNzc4OCwyNzc1MiwyNzc1MywyNzc2NCwyNzc2NiwyNzc4MiwyNzgxNywyNzg1NiwyNzg2MCwyNzgyMSwyNzg5NSwyNzg5NiwyNzg4OSwyNzg2MywyNzgyNiwyNzg3MiwyNzg2MiwyNzg5OCwyNzg4MywyNzg4NiwyNzgyNSwyNzg1OSwyNzg4NywyNzkwMiwzNzU0NCwzNzU0NSwzNzU0NiwzNzU0NywzNzU0OCwzNzU0OSwzNzU1MSwzNzU1MiwzNzU1MywzNzU1NCwzNzU1NSwzNzU1NiwzNzU1NywzNzU1OCwzNzU1OSwzNzU2MCwzNzU2MSwzNzU2MiwzNzU2MywzNzU2NCwzNzU2NSwzNzU2NiwzNzU2NywzNzU2OCwzNzU2OSwzNzU3MCwzNzU3MSwzNzU3MiwzNzU3MywzNzU3NCwzNzU3NSwzNzU3NywzNzU3OCwzNzU3OSwzNzU4MCwzNzU4MSwzNzU4MiwzNzU4MywzNzU4NCwzNzU4NSwzNzU4NiwzNzU4NywzNzU4OCwzNzU4OSwzNzU5MCwzNzU5MSwzNzU5MiwzNzU5MywzNzU5NCwzNzU5NSwzNzU5NiwzNzU5NywzNzU5OCwzNzU5OSwzNzYwMCwzNzYwMSwzNzYwMiwzNzYwMywzNzYwNCwzNzYwNSwzNzYwNiwzNzYwNywzNzYwOCwzNzYwOSwzNzYxMCwzNzYxMSwzNzYxMiwzNzYxMywzNzYxNCwzNzYxNSwzNzYxNiwzNzYxNywzNzYxOCwzNzYxOSwzNzYyMCwzNzYyMSwzNzYyMiwzNzYyMywzNzYyNCwzNzYyNSwzNzYyNiwzNzYyNywzNzYyOCwzNzYyOSwzNzYzMCwzNzYzMSwzNzYzMiwzNzYzMywzNzYzNCwzNzYzNSwzNzYzNiwzNzYzNywzNzYzOCwzNzYzOSwzNzY0MCwzNzY0MSwyNzk2MSwyNzk0MywyNzkxNiwyNzk3MSwyNzk3NiwyNzkxMSwyNzkwOCwyNzkyOSwyNzkxOCwyNzk0NywyNzk4MSwyNzk1MCwyNzk1NywyNzkzMCwyNzk4MywyNzk4NiwyNzk4OCwyNzk1NSwyODA0OSwyODAxNSwyODA2MiwyODA2NCwyNzk5OCwyODA1MSwyODA1MiwyNzk5NiwyODAwMCwyODAyOCwyODAwMywyODE4NiwyODEwMywyODEwMSwyODEyNiwyODE3NCwyODA5NSwyODEyOCwyODE3NywyODEzNCwyODEyNSwyODEyMSwyODE4MiwyODA3NSwyODE3MiwyODA3OCwyODIwMywyODI3MCwyODIzOCwyODI2NywyODMzOCwyODI1NSwyODI5NCwyODI0MywyODI0NCwyODIxMCwyODE5NywyODIyOCwyODM4MywyODMzNywyODMxMiwyODM4NCwyODQ2MSwyODM4NiwyODMyNSwyODMyNywyODM0OSwyODM0NywyODM0MywyODM3NSwyODM0MCwyODM2NywyODMwMywyODM1NCwyODMxOSwyODUxNCwyODQ4NiwyODQ4NywyODQ1MiwyODQzNywyODQwOSwyODQ2MywyODQ3MCwyODQ5MSwyODUzMiwyODQ1OCwyODQyNSwyODQ1NywyODU1MywyODU1NywyODU1NiwyODUzNiwyODUzMCwyODU0MCwyODUzOCwyODYyNSwzNzY0MiwzNzY0MywzNzY0NCwzNzY0NSwzNzY0NiwzNzY0NywzNzY0OCwzNzY0OSwzNzY1MCwzNzY1MSwzNzY1MiwzNzY1MywzNzY1NCwzNzY1NSwzNzY1NiwzNzY1NywzNzY1OCwzNzY1OSwzNzY2MCwzNzY2MSwzNzY2MiwzNzY2MywzNzY2NCwzNzY2NSwzNzY2NiwzNzY2NywzNzY2OCwzNzY2OSwzNzY3MCwzNzY3MSwzNzY3MiwzNzY3MywzNzY3NCwzNzY3NSwzNzY3NiwzNzY3NywzNzY3OCwzNzY3OSwzNzY4MCwzNzY4MSwzNzY4MiwzNzY4MywzNzY4NCwzNzY4NSwzNzY4NiwzNzY4NywzNzY4OCwzNzY4OSwzNzY5MCwzNzY5MSwzNzY5MiwzNzY5MywzNzY5NSwzNzY5NiwzNzY5NywzNzY5OCwzNzY5OSwzNzcwMCwzNzcwMSwzNzcwMiwzNzcwMywzNzcwNCwzNzcwNSwzNzcwNiwzNzcwNywzNzcwOCwzNzcwOSwzNzcxMCwzNzcxMSwzNzcxMiwzNzcxMywzNzcxNCwzNzcxNSwzNzcxNiwzNzcxNywzNzcxOCwzNzcxOSwzNzcyMCwzNzcyMSwzNzcyMiwzNzcyMywzNzcyNCwzNzcyNSwzNzcyNiwzNzcyNywzNzcyOCwzNzcyOSwzNzczMCwzNzczMSwzNzczMiwzNzczMywzNzczNCwzNzczNSwzNzczNiwzNzczNywzNzczOSwyODYxNywyODU4MywyODYwMSwyODU5OCwyODYxMCwyODY0MSwyODY1NCwyODYzOCwyODY0MCwyODY1NSwyODY5OCwyODcwNywyODY5OSwyODcyOSwyODcyNSwyODc1MSwyODc2NiwyMzQyNCwyMzQyOCwyMzQ0NSwyMzQ0MywyMzQ2MSwyMzQ4MCwyOTk5OSwzOTU4MiwyNTY1MiwyMzUyNCwyMzUzNCwzNTEyMCwyMzUzNiwzNjQyMywzNTU5MSwzNjc5MCwzNjgxOSwzNjgyMSwzNjgzNywzNjg0NiwzNjgzNiwzNjg0MSwzNjgzOCwzNjg1MSwzNjg0MCwzNjg2OSwzNjg2OCwzNjg3NSwzNjkwMiwzNjg4MSwzNjg3NywzNjg4NiwzNjg5NywzNjkxNywzNjkxOCwzNjkwOSwzNjkxMSwzNjkzMiwzNjk0NSwzNjk0NiwzNjk0NCwzNjk2OCwzNjk1MiwzNjk2MiwzNjk1NSwyNjI5NywzNjk4MCwzNjk4OSwzNjk5NCwzNzAwMCwzNjk5NSwzNzAwMywyNDQwMCwyNDQwNywyNDQwNiwyNDQwOCwyMzYxMSwyMTY3NSwyMzYzMiwyMzY0MSwyMzQwOSwyMzY1MSwyMzY1NCwzMjcwMCwyNDM2MiwyNDM2MSwyNDM2NSwzMzM5NiwyNDM4MCwzOTczOSwyMzY2MiwyMjkxMywyMjkxNSwyMjkyNSwyMjk1MywyMjk1NCwyMjk0NywzNzc0MCwzNzc0MSwzNzc0MiwzNzc0MywzNzc0NCwzNzc0NSwzNzc0NiwzNzc0NywzNzc0OCwzNzc0OSwzNzc1MCwzNzc1MSwzNzc1MiwzNzc1MywzNzc1NCwzNzc1NSwzNzc1NiwzNzc1NywzNzc1OCwzNzc1OSwzNzc2MCwzNzc2MSwzNzc2MiwzNzc2MywzNzc2NCwzNzc2NSwzNzc2NiwzNzc2NywzNzc2OCwzNzc2OSwzNzc3MCwzNzc3MSwzNzc3MiwzNzc3MywzNzc3NCwzNzc3NiwzNzc3NywzNzc3OCwzNzc3OSwzNzc4MCwzNzc4MSwzNzc4MiwzNzc4MywzNzc4NCwzNzc4NSwzNzc4NiwzNzc4NywzNzc4OCwzNzc4OSwzNzc5MCwzNzc5MSwzNzc5MiwzNzc5MywzNzc5NCwzNzc5NSwzNzc5NiwzNzc5NywzNzc5OCwzNzc5OSwzNzgwMCwzNzgwMSwzNzgwMiwzNzgwMywzNzgwNCwzNzgwNSwzNzgwNiwzNzgwNywzNzgwOCwzNzgwOSwzNzgxMCwzNzgxMSwzNzgxMiwzNzgxMywzNzgxNCwzNzgxNSwzNzgxNiwzNzgxNywzNzgxOCwzNzgxOSwzNzgyMCwzNzgyMSwzNzgyMiwzNzgyMywzNzgyNCwzNzgyNSwzNzgyNiwzNzgyNywzNzgyOCwzNzgyOSwzNzgzMCwzNzgzMSwzNzgzMiwzNzgzMywzNzgzNSwzNzgzNiwzNzgzNywyMjkzNSwyMjk4NiwyMjk1NSwyMjk0MiwyMjk0OCwyMjk5NCwyMjk2MiwyMjk1OSwyMjk5OSwyMjk3NCwyMzA0NSwyMzA0NiwyMzAwNSwyMzA0OCwyMzAxMSwyMzAwMCwyMzAzMywyMzA1MiwyMzA0OSwyMzA5MCwyMzA5MiwyMzA1NywyMzA3NSwyMzA1OSwyMzEwNCwyMzE0MywyMzExNCwyMzEyNSwyMzEwMCwyMzEzOCwyMzE1NywzMzAwNCwyMzIxMCwyMzE5NSwyMzE1OSwyMzE2MiwyMzIzMCwyMzI3NSwyMzIxOCwyMzI1MCwyMzI1MiwyMzIyNCwyMzI2NCwyMzI2NywyMzI4MSwyMzI1NCwyMzI3MCwyMzI1NiwyMzI2MCwyMzMwNSwyMzMxOSwyMzMxOCwyMzM0NiwyMzM1MSwyMzM2MCwyMzU3MywyMzU4MCwyMzM4NiwyMzM5NywyMzQxMSwyMzM3NywyMzM3OSwyMzM5NCwzOTU0MSwzOTU0MywzOTU0NCwzOTU0NiwzOTU1MSwzOTU0OSwzOTU1MiwzOTU1MywzOTU1NywzOTU2MCwzOTU2MiwzOTU2OCwzOTU3MCwzOTU3MSwzOTU3NCwzOTU3NiwzOTU3OSwzOTU4MCwzOTU4MSwzOTU4MywzOTU4NCwzOTU4NiwzOTU4NywzOTU4OSwzOTU5MSwzMjQxNSwzMjQxNywzMjQxOSwzMjQyMSwzMjQyNCwzMjQyNSwzNzgzOCwzNzgzOSwzNzg0MCwzNzg0MSwzNzg0MiwzNzg0MywzNzg0NCwzNzg0NSwzNzg0NywzNzg0OCwzNzg0OSwzNzg1MCwzNzg1MSwzNzg1MiwzNzg1MywzNzg1NCwzNzg1NSwzNzg1NiwzNzg1NywzNzg1OCwzNzg1OSwzNzg2MCwzNzg2MSwzNzg2MiwzNzg2MywzNzg2NCwzNzg2NSwzNzg2NiwzNzg2NywzNzg2OCwzNzg2OSwzNzg3MCwzNzg3MSwzNzg3MiwzNzg3MywzNzg3NCwzNzg3NSwzNzg3NiwzNzg3NywzNzg3OCwzNzg3OSwzNzg4MCwzNzg4MSwzNzg4MiwzNzg4MywzNzg4NCwzNzg4NSwzNzg4NiwzNzg4NywzNzg4OCwzNzg4OSwzNzg5MCwzNzg5MSwzNzg5MiwzNzg5MywzNzg5NCwzNzg5NSwzNzg5NiwzNzg5NywzNzg5OCwzNzg5OSwzNzkwMCwzNzkwMSwzNzkwMiwzNzkwMywzNzkwNCwzNzkwNSwzNzkwNiwzNzkwNywzNzkwOCwzNzkwOSwzNzkxMCwzNzkxMSwzNzkxMiwzNzkxMywzNzkxNCwzNzkxNSwzNzkxNiwzNzkxNywzNzkxOCwzNzkxOSwzNzkyMCwzNzkyMSwzNzkyMiwzNzkyMywzNzkyNCwzNzkyNSwzNzkyNiwzNzkyNywzNzkyOCwzNzkyOSwzNzkzMCwzNzkzMSwzNzkzMiwzNzkzMywzNzkzNCwzMjQyOSwzMjQzMiwzMjQ0NiwzMjQ0OCwzMjQ0OSwzMjQ1MCwzMjQ1NywzMjQ1OSwzMjQ2MCwzMjQ2NCwzMjQ2OCwzMjQ3MSwzMjQ3NSwzMjQ4MCwzMjQ4MSwzMjQ4OCwzMjQ5MSwzMjQ5NCwzMjQ5NSwzMjQ5NywzMjQ5OCwzMjUyNSwzMjUwMiwzMjUwNiwzMjUwNywzMjUxMCwzMjUxMywzMjUxNCwzMjUxNSwzMjUxOSwzMjUyMCwzMjUyMywzMjUyNCwzMjUyNywzMjUyOSwzMjUzMCwzMjUzNSwzMjUzNywzMjU0MCwzMjUzOSwzMjU0MywzMjU0NSwzMjU0NiwzMjU0NywzMjU0OCwzMjU0OSwzMjU1MCwzMjU1MSwzMjU1NCwzMjU1NSwzMjU1NiwzMjU1NywzMjU1OSwzMjU2MCwzMjU2MSwzMjU2MiwzMjU2MywzMjU2NSwyNDE4NiwzMDA3OSwyNDAyNywzMDAxNCwzNzAxMywyOTU4MiwyOTU4NSwyOTYxNCwyOTYwMiwyOTU5OSwyOTY0NywyOTYzNCwyOTY0OSwyOTYyMywyOTYxOSwyOTYzMiwyOTY0MSwyOTY0MCwyOTY2OSwyOTY1NywzOTAzNiwyOTcwNiwyOTY3MywyOTY3MSwyOTY2MiwyOTYyNiwyOTY4MiwyOTcxMSwyOTczOCwyOTc4NywyOTczNCwyOTczMywyOTczNiwyOTc0NCwyOTc0MiwyOTc0MCwzNzkzNSwzNzkzNiwzNzkzNywzNzkzOCwzNzkzOSwzNzk0MCwzNzk0MSwzNzk0MiwzNzk0MywzNzk0NCwzNzk0NSwzNzk0NiwzNzk0NywzNzk0OCwzNzk0OSwzNzk1MSwzNzk1MiwzNzk1MywzNzk1NCwzNzk1NSwzNzk1NiwzNzk1NywzNzk1OCwzNzk1OSwzNzk2MCwzNzk2MSwzNzk2MiwzNzk2MywzNzk2NCwzNzk2NSwzNzk2NiwzNzk2NywzNzk2OCwzNzk2OSwzNzk3MCwzNzk3MSwzNzk3MiwzNzk3MywzNzk3NCwzNzk3NSwzNzk3NiwzNzk3NywzNzk3OCwzNzk3OSwzNzk4MCwzNzk4MSwzNzk4MiwzNzk4MywzNzk4NCwzNzk4NSwzNzk4NiwzNzk4NywzNzk4OCwzNzk4OSwzNzk5MCwzNzk5MSwzNzk5MiwzNzk5MywzNzk5NCwzNzk5NiwzNzk5NywzNzk5OCwzNzk5OSwzODAwMCwzODAwMSwzODAwMiwzODAwMywzODAwNCwzODAwNSwzODAwNiwzODAwNywzODAwOCwzODAwOSwzODAxMCwzODAxMSwzODAxMiwzODAxMywzODAxNCwzODAxNSwzODAxNiwzODAxNywzODAxOCwzODAxOSwzODAyMCwzODAzMywzODAzOCwzODA0MCwzODA4NywzODA5NSwzODA5OSwzODEwMCwzODEwNiwzODExOCwzODEzOSwzODE3MiwzODE3NiwyOTcyMywyOTcyMiwyOTc2MSwyOTc4OCwyOTc4MywyOTc4MSwyOTc4NSwyOTgxNSwyOTgwNSwyOTgyMiwyOTg1MiwyOTgzOCwyOTgyNCwyOTgyNSwyOTgzMSwyOTgzNSwyOTg1NCwyOTg2NCwyOTg2NSwyOTg0MCwyOTg2MywyOTkwNiwyOTg4MiwzODg5MCwzODg5MSwzODg5MiwyNjQ0NCwyNjQ1MSwyNjQ2MiwyNjQ0MCwyNjQ3MywyNjUzMywyNjUwMywyNjQ3NCwyNjQ4MywyNjUyMCwyNjUzNSwyNjQ4NSwyNjUzNiwyNjUyNiwyNjU0MSwyNjUwNywyNjQ4NywyNjQ5MiwyNjYwOCwyNjYzMywyNjU4NCwyNjYzNCwyNjYwMSwyNjU0NCwyNjYzNiwyNjU4NSwyNjU0OSwyNjU4NiwyNjU0NywyNjU4OSwyNjYyNCwyNjU2MywyNjU1MiwyNjU5NCwyNjYzOCwyNjU2MSwyNjYyMSwyNjY3NCwyNjY3NSwyNjcyMCwyNjcyMSwyNjcwMiwyNjcyMiwyNjY5MiwyNjcyNCwyNjc1NSwyNjY1MywyNjcwOSwyNjcyNiwyNjY4OSwyNjcyNywyNjY4OCwyNjY4NiwyNjY5OCwyNjY5NywyNjY2NSwyNjgwNSwyNjc2NywyNjc0MCwyNjc0MywyNjc3MSwyNjczMSwyNjgxOCwyNjk5MCwyNjg3NiwyNjkxMSwyNjkxMiwyNjg3MywzODE4MywzODE5NSwzODIwNSwzODIxMSwzODIxNiwzODIxOSwzODIyOSwzODIzNCwzODI0MCwzODI1NCwzODI2MCwzODI2MSwzODI2MywzODI2NCwzODI2NSwzODI2NiwzODI2NywzODI2OCwzODI2OSwzODI3MCwzODI3MiwzODI3MywzODI3NCwzODI3NSwzODI3NiwzODI3NywzODI3OCwzODI3OSwzODI4MCwzODI4MSwzODI4MiwzODI4MywzODI4NCwzODI4NSwzODI4NiwzODI4NywzODI4OCwzODI4OSwzODI5MCwzODI5MSwzODI5MiwzODI5MywzODI5NCwzODI5NSwzODI5NiwzODI5NywzODI5OCwzODI5OSwzODMwMCwzODMwMSwzODMwMiwzODMwMywzODMwNCwzODMwNSwzODMwNiwzODMwNywzODMwOCwzODMwOSwzODMxMCwzODMxMSwzODMxMiwzODMxMywzODMxNCwzODMxNSwzODMxNiwzODMxNywzODMxOCwzODMxOSwzODMyMCwzODMyMSwzODMyMiwzODMyMywzODMyNCwzODMyNSwzODMyNiwzODMyNywzODMyOCwzODMyOSwzODMzMCwzODMzMSwzODMzMiwzODMzMywzODMzNCwzODMzNSwzODMzNiwzODMzNywzODMzOCwzODMzOSwzODM0MCwzODM0MSwzODM0MiwzODM0MywzODM0NCwzODM0NSwzODM0NiwzODM0NywyNjkxNiwyNjg2NCwyNjg5MSwyNjg4MSwyNjk2NywyNjg1MSwyNjg5NiwyNjk5MywyNjkzNywyNjk3NiwyNjk0NiwyNjk3MywyNzAxMiwyNjk4NywyNzAwOCwyNzAzMiwyNzAwMCwyNjkzMiwyNzA4NCwyNzAxNSwyNzAxNiwyNzA4NiwyNzAxNywyNjk4MiwyNjk3OSwyNzAwMSwyNzAzNSwyNzA0NywyNzA2NywyNzA1MSwyNzA1MywyNzA5MiwyNzA1NywyNzA3MywyNzA4MiwyNzEwMywyNzAyOSwyNzEwNCwyNzAyMSwyNzEzNSwyNzE4MywyNzExNywyNzE1OSwyNzE2MCwyNzIzNywyNzEyMiwyNzIwNCwyNzE5OCwyNzI5NiwyNzIxNiwyNzIyNywyNzE4OSwyNzI3OCwyNzI1NywyNzE5NywyNzE3NiwyNzIyNCwyNzI2MCwyNzI4MSwyNzI4MCwyNzMwNSwyNzI4NywyNzMwNywyOTQ5NSwyOTUyMiwyNzUyMSwyNzUyMiwyNzUyNywyNzUyNCwyNzUzOCwyNzUzOSwyNzUzMywyNzU0NiwyNzU0NywyNzU1MywyNzU2MiwzNjcxNSwzNjcxNywzNjcyMSwzNjcyMiwzNjcyMywzNjcyNSwzNjcyNiwzNjcyOCwzNjcyNywzNjcyOSwzNjczMCwzNjczMiwzNjczNCwzNjczNywzNjczOCwzNjc0MCwzNjc0MywzNjc0NywzODM0OCwzODM0OSwzODM1MCwzODM1MSwzODM1MiwzODM1MywzODM1NCwzODM1NSwzODM1NiwzODM1NywzODM1OCwzODM1OSwzODM2MCwzODM2MSwzODM2MiwzODM2MywzODM2NCwzODM2NSwzODM2NiwzODM2NywzODM2OCwzODM2OSwzODM3MCwzODM3MSwzODM3MiwzODM3MywzODM3NCwzODM3NSwzODM4MCwzODM5OSwzODQwNywzODQxOSwzODQyNCwzODQyNywzODQzMCwzODQzMiwzODQzNSwzODQzNiwzODQzNywzODQzOCwzODQzOSwzODQ0MCwzODQ0MSwzODQ0MywzODQ0NCwzODQ0NSwzODQ0NywzODQ0OCwzODQ1NSwzODQ1NiwzODQ1NywzODQ1OCwzODQ2MiwzODQ2NSwzODQ2NywzODQ3NCwzODQ3OCwzODQ3OSwzODQ4MSwzODQ4MiwzODQ4MywzODQ4NiwzODQ4NywzODQ4OCwzODQ4OSwzODQ5MCwzODQ5MiwzODQ5MywzODQ5NCwzODQ5NiwzODQ5OSwzODUwMSwzODUwMiwzODUwNywzODUwOSwzODUxMCwzODUxMSwzODUxMiwzODUxMywzODUxNSwzODUyMCwzODUyMSwzODUyMiwzODUyMywzODUyNCwzODUyNSwzODUyNiwzODUyNywzODUyOCwzODUyOSwzODUzMCwzODUzMSwzODUzMiwzODUzNSwzODUzNywzODUzOCwzNjc0OSwzNjc1MCwzNjc1MSwzNjc2MCwzNjc2MiwzNjU1OCwyNTA5OSwyNTExMSwyNTExNSwyNTExOSwyNTEyMiwyNTEyMSwyNTEyNSwyNTEyNCwyNTEzMiwzMzI1NSwyOTkzNSwyOTk0MCwyOTk1MSwyOTk2NywyOTk2OSwyOTk3MSwyNTkwOCwyNjA5NCwyNjA5NSwyNjA5NiwyNjEyMiwyNjEzNywyNjQ4MiwyNjExNSwyNjEzMywyNjExMiwyODgwNSwyNjM1OSwyNjE0MSwyNjE2NCwyNjE2MSwyNjE2NiwyNjE2NSwzMjc3NCwyNjIwNywyNjE5NiwyNjE3NywyNjE5MSwyNjE5OCwyNjIwOSwyNjE5OSwyNjIzMSwyNjI0NCwyNjI1MiwyNjI3OSwyNjI2OSwyNjMwMiwyNjMzMSwyNjMzMiwyNjM0MiwyNjM0NSwzNjE0NiwzNjE0NywzNjE1MCwzNjE1NSwzNjE1NywzNjE2MCwzNjE2NSwzNjE2NiwzNjE2OCwzNjE2OSwzNjE2NywzNjE3MywzNjE4MSwzNjE4NSwzNTI3MSwzNTI3NCwzNTI3NSwzNTI3NiwzNTI3OCwzNTI3OSwzNTI4MCwzNTI4MSwyOTI5NCwyOTM0MywyOTI3NywyOTI4NiwyOTI5NSwyOTMxMCwyOTMxMSwyOTMxNiwyOTMyMywyOTMyNSwyOTMyNywyOTMzMCwyNTM1MiwyNTM5NCwyNTUyMCwzODU0MCwzODU0MiwzODU0NSwzODU0NiwzODU0NywzODU0OSwzODU1MCwzODU1NCwzODU1NSwzODU1NywzODU1OCwzODU1OSwzODU2MCwzODU2MSwzODU2MiwzODU2MywzODU2NCwzODU2NSwzODU2NiwzODU2OCwzODU2OSwzODU3MCwzODU3MSwzODU3MiwzODU3MywzODU3NCwzODU3NSwzODU3NywzODU3OCwzODU4MCwzODU4MSwzODU4MywzODU4NCwzODU4NiwzODU4NywzODU5MSwzODU5NCwzODU5NSwzODYwMCwzODYwMiwzODYwMywzODYwOCwzODYwOSwzODYxMSwzODYxMiwzODYxNCwzODYxNSwzODYxNiwzODYxNywzODYxOCwzODYxOSwzODYyMCwzODYyMSwzODYyMiwzODYyMywzODYyNSwzODYyNiwzODYyNywzODYyOCwzODYyOSwzODYzMCwzODYzMSwzODYzNSwzODYzNiwzODYzNywzODYzOCwzODY0MCwzODY0MSwzODY0MiwzODY0NCwzODY0NSwzODY0OCwzODY1MCwzODY1MSwzODY1MiwzODY1MywzODY1NSwzODY1OCwzODY1OSwzODY2MSwzODY2NiwzODY2NywzODY2OCwzODY3MiwzODY3MywzODY3NCwzODY3NiwzODY3NywzODY3OSwzODY4MCwzODY4MSwzODY4MiwzODY4MywzODY4NSwzODY4NywzODY4OCwyNTY2MywyNTgxNiwzMjc3MiwyNzYyNiwyNzYzNSwyNzY0NSwyNzYzNywyNzY0MSwyNzY1MywyNzY1NSwyNzY1NCwyNzY2MSwyNzY2OSwyNzY3MiwyNzY3MywyNzY3NCwyNzY4MSwyNzY4OSwyNzY4NCwyNzY5MCwyNzY5OCwyNTkwOSwyNTk0MSwyNTk2MywyOTI2MSwyOTI2NiwyOTI3MCwyOTIzMiwzNDQwMiwyMTAxNCwzMjkyNywzMjkyNCwzMjkxNSwzMjk1NiwyNjM3OCwzMjk1NywzMjk0NSwzMjkzOSwzMjk0MSwzMjk0OCwzMjk1MSwzMjk5OSwzMzAwMCwzMzAwMSwzMzAwMiwzMjk4NywzMjk2MiwzMjk2NCwzMjk4NSwzMjk3MywzMjk4MywyNjM4NCwzMjk4OSwzMzAwMywzMzAwOSwzMzAxMiwzMzAwNSwzMzAzNywzMzAzOCwzMzAxMCwzMzAyMCwyNjM4OSwzMzA0MiwzNTkzMCwzMzA3OCwzMzA1NCwzMzA2OCwzMzA0OCwzMzA3NCwzMzA5NiwzMzEwMCwzMzEwNywzMzE0MCwzMzExMywzMzExNCwzMzEzNywzMzEyMCwzMzEyOSwzMzE0OCwzMzE0OSwzMzEzMywzMzEyNywyMjYwNSwyMzIyMSwzMzE2MCwzMzE1NCwzMzE2OSwyODM3MywzMzE4NywzMzE5NCwzMzIyOCwyNjQwNiwzMzIyNiwzMzIxMSwzODY4OSwzODY5MCwzODY5MSwzODY5MiwzODY5MywzODY5NCwzODY5NSwzODY5NiwzODY5NywzODY5OSwzODcwMCwzODcwMiwzODcwMywzODcwNSwzODcwNywzODcwOCwzODcwOSwzODcxMCwzODcxMSwzODcxNCwzODcxNSwzODcxNiwzODcxNywzODcxOSwzODcyMCwzODcyMSwzODcyMiwzODcyMywzODcyNCwzODcyNSwzODcyNiwzODcyNywzODcyOCwzODcyOSwzODczMCwzODczMSwzODczMiwzODczMywzODczNCwzODczNSwzODczNiwzODczNywzODc0MCwzODc0MSwzODc0MywzODc0NCwzODc0NiwzODc0OCwzODc0OSwzODc1MSwzODc1NSwzODc1NiwzODc1OCwzODc1OSwzODc2MCwzODc2MiwzODc2MywzODc2NCwzODc2NSwzODc2NiwzODc2NywzODc2OCwzODc2OSwzODc3MCwzODc3MywzODc3NSwzODc3NiwzODc3NywzODc3OCwzODc3OSwzODc4MSwzODc4MiwzODc4MywzODc4NCwzODc4NSwzODc4NiwzODc4NywzODc4OCwzODc5MCwzODc5MSwzODc5MiwzODc5MywzODc5NCwzODc5NiwzODc5OCwzODc5OSwzODgwMCwzODgwMywzODgwNSwzODgwNiwzODgwNywzODgwOSwzODgxMCwzODgxMSwzODgxMiwzODgxMywzMzIxNywzMzE5MCwyNzQyOCwyNzQ0NywyNzQ0OSwyNzQ1OSwyNzQ2MiwyNzQ4MSwzOTEyMSwzOTEyMiwzOTEyMywzOTEyNSwzOTEyOSwzOTEzMCwyNzU3MSwyNDM4NCwyNzU4NiwzNTMxNSwyNjAwMCw0MDc4NSwyNjAwMywyNjA0NCwyNjA1NCwyNjA1MiwyNjA1MSwyNjA2MCwyNjA2MiwyNjA2NiwyNjA3MCwyODgwMCwyODgyOCwyODgyMiwyODgyOSwyODg1OSwyODg2NCwyODg1NSwyODg0MywyODg0OSwyODkwNCwyODg3NCwyODk0NCwyODk0NywyODk1MCwyODk3NSwyODk3NywyOTA0MywyOTAyMCwyOTAzMiwyODk5NywyOTA0MiwyOTAwMiwyOTA0OCwyOTA1MCwyOTA4MCwyOTEwNywyOTEwOSwyOTA5NiwyOTA4OCwyOTE1MiwyOTE0MCwyOTE1OSwyOTE3NywyOTIxMywyOTIyNCwyODc4MCwyODk1MiwyOTAzMCwyOTExMywyNTE1MCwyNTE0OSwyNTE1NSwyNTE2MCwyNTE2MSwzMTAzNSwzMTA0MCwzMTA0NiwzMTA0OSwzMTA2NywzMTA2OCwzMTA1OSwzMTA2NiwzMTA3NCwzMTA2MywzMTA3MiwzMTA4NywzMTA3OSwzMTA5OCwzMTEwOSwzMTExNCwzMTEzMCwzMTE0MywzMTE1NSwyNDUyOSwyNDUyOCwzODgxNCwzODgxNSwzODgxNywzODgxOCwzODgyMCwzODgyMSwzODgyMiwzODgyMywzODgyNCwzODgyNSwzODgyNiwzODgyOCwzODgzMCwzODgzMiwzODgzMywzODgzNSwzODgzNywzODgzOCwzODgzOSwzODg0MCwzODg0MSwzODg0MiwzODg0MywzODg0NCwzODg0NSwzODg0NiwzODg0NywzODg0OCwzODg0OSwzODg1MCwzODg1MSwzODg1MiwzODg1MywzODg1NCwzODg1NSwzODg1NiwzODg1NywzODg1OCwzODg1OSwzODg2MCwzODg2MSwzODg2MiwzODg2MywzODg2NCwzODg2NSwzODg2NiwzODg2NywzODg2OCwzODg2OSwzODg3MCwzODg3MSwzODg3MiwzODg3MywzODg3NCwzODg3NSwzODg3NiwzODg3NywzODg3OCwzODg3OSwzODg4MCwzODg4MSwzODg4MiwzODg4MywzODg4NCwzODg4NSwzODg4OCwzODg5NCwzODg5NSwzODg5NiwzODg5NywzODg5OCwzODkwMCwzODkwMywzODkwNCwzODkwNSwzODkwNiwzODkwNywzODkwOCwzODkwOSwzODkxMCwzODkxMSwzODkxMiwzODkxMywzODkxNCwzODkxNSwzODkxNiwzODkxNywzODkxOCwzODkxOSwzODkyMCwzODkyMSwzODkyMiwzODkyMywzODkyNCwzODkyNSwzODkyNiwyNDYzNiwyNDY2OSwyNDY2NiwyNDY3OSwyNDY0MSwyNDY2NSwyNDY3NSwyNDc0NywyNDgzOCwyNDg0NSwyNDkyNSwyNTAwMSwyNDk4OSwyNTAzNSwyNTA0MSwyNTA5NCwzMjg5NiwzMjg5NSwyNzc5NSwyNzg5NCwyODE1NiwzMDcxMCwzMDcxMiwzMDcyMCwzMDcyOSwzMDc0MywzMDc0NCwzMDczNywyNjAyNywzMDc2NSwzMDc0OCwzMDc0OSwzMDc3NywzMDc3OCwzMDc3OSwzMDc1MSwzMDc4MCwzMDc1NywzMDc2NCwzMDc1NSwzMDc2MSwzMDc5OCwzMDgyOSwzMDgwNiwzMDgwNywzMDc1OCwzMDgwMCwzMDc5MSwzMDc5NiwzMDgyNiwzMDg3NSwzMDg2NywzMDg3NCwzMDg1NSwzMDg3NiwzMDg4MSwzMDg4MywzMDg5OCwzMDkwNSwzMDg4NSwzMDkzMiwzMDkzNywzMDkyMSwzMDk1NiwzMDk2MiwzMDk4MSwzMDk2NCwzMDk5NSwzMTAxMiwzMTAwNiwzMTAyOCw0MDg1OSw0MDY5Nyw0MDY5OSw0MDcwMCwzMDQ0OSwzMDQ2OCwzMDQ3NywzMDQ1NywzMDQ3MSwzMDQ3MiwzMDQ5MCwzMDQ5OCwzMDQ4OSwzMDUwOSwzMDUwMiwzMDUxNywzMDUyMCwzMDU0NCwzMDU0NSwzMDUzNSwzMDUzMSwzMDU1NCwzMDU2OCwzODkyNywzODkyOCwzODkyOSwzODkzMCwzODkzMSwzODkzMiwzODkzMywzODkzNCwzODkzNSwzODkzNiwzODkzNywzODkzOCwzODkzOSwzODk0MCwzODk0MSwzODk0MiwzODk0MywzODk0NCwzODk0NSwzODk0NiwzODk0NywzODk0OCwzODk0OSwzODk1MCwzODk1MSwzODk1MiwzODk1MywzODk1NCwzODk1NSwzODk1NiwzODk1NywzODk1OCwzODk1OSwzODk2MCwzODk2MSwzODk2MiwzODk2MywzODk2NCwzODk2NSwzODk2NiwzODk2NywzODk2OCwzODk2OSwzODk3MCwzODk3MSwzODk3MiwzODk3MywzODk3NCwzODk3NSwzODk3NiwzODk3NywzODk3OCwzODk3OSwzODk4MCwzODk4MSwzODk4MiwzODk4MywzODk4NCwzODk4NSwzODk4NiwzODk4NywzODk4OCwzODk4OSwzODk5MCwzODk5MSwzODk5MiwzODk5MywzODk5NCwzODk5NSwzODk5NiwzODk5NywzODk5OCwzODk5OSwzOTAwMCwzOTAwMSwzOTAwMiwzOTAwMywzOTAwNCwzOTAwNSwzOTAwNiwzOTAwNywzOTAwOCwzOTAwOSwzOTAxMCwzOTAxMSwzOTAxMiwzOTAxMywzOTAxNCwzOTAxNSwzOTAxNiwzOTAxNywzOTAxOCwzOTAxOSwzOTAyMCwzOTAyMSwzOTAyMiwzMDU2MiwzMDU2NSwzMDU5MSwzMDYwNSwzMDU4OSwzMDU5MiwzMDYwNCwzMDYwOSwzMDYyMywzMDYyNCwzMDY0MCwzMDY0NSwzMDY1MywzMDAxMCwzMDAxNiwzMDAzMCwzMDAyNywzMDAyNCwzMDA0MywzMDA2NiwzMDA3MywzMDA4MywzMjYwMCwzMjYwOSwzMjYwNywzNTQwMCwzMjYxNiwzMjYyOCwzMjYyNSwzMjYzMywzMjY0MSwzMjYzOCwzMDQxMywzMDQzNywzNDg2NiwzODAyMSwzODAyMiwzODAyMywzODAyNywzODAyNiwzODAyOCwzODAyOSwzODAzMSwzODAzMiwzODAzNiwzODAzOSwzODAzNywzODA0MiwzODA0MywzODA0NCwzODA1MSwzODA1MiwzODA1OSwzODA1OCwzODA2MSwzODA2MCwzODA2MywzODA2NCwzODA2NiwzODA2OCwzODA3MCwzODA3MSwzODA3MiwzODA3MywzODA3NCwzODA3NiwzODA3NywzODA3OSwzODA4NCwzODA4OCwzODA4OSwzODA5MCwzODA5MSwzODA5MiwzODA5MywzODA5NCwzODA5NiwzODA5NywzODA5OCwzODEwMSwzODEwMiwzODEwMywzODEwNSwzODEwNCwzODEwNywzODExMCwzODExMSwzODExMiwzODExNCwzODExNiwzODExNywzODExOSwzODEyMCwzODEyMiwzOTAyMywzOTAyNCwzOTAyNSwzOTAyNiwzOTAyNywzOTAyOCwzOTA1MSwzOTA1NCwzOTA1OCwzOTA2MSwzOTA2NSwzOTA3NSwzOTA4MCwzOTA4MSwzOTA4MiwzOTA4MywzOTA4NCwzOTA4NSwzOTA4NiwzOTA4NywzOTA4OCwzOTA4OSwzOTA5MCwzOTA5MSwzOTA5MiwzOTA5MywzOTA5NCwzOTA5NSwzOTA5NiwzOTA5NywzOTA5OCwzOTA5OSwzOTEwMCwzOTEwMSwzOTEwMiwzOTEwMywzOTEwNCwzOTEwNSwzOTEwNiwzOTEwNywzOTEwOCwzOTEwOSwzOTExMCwzOTExMSwzOTExMiwzOTExMywzOTExNCwzOTExNSwzOTExNiwzOTExNywzOTExOSwzOTEyMCwzOTEyNCwzOTEyNiwzOTEyNywzOTEzMSwzOTEzMiwzOTEzMywzOTEzNiwzOTEzNywzOTEzOCwzOTEzOSwzOTE0MCwzOTE0MSwzOTE0MiwzOTE0NSwzOTE0NiwzOTE0NywzOTE0OCwzOTE0OSwzOTE1MCwzOTE1MSwzOTE1MiwzOTE1MywzOTE1NCwzOTE1NSwzOTE1NiwzOTE1NywzOTE1OCwzOTE1OSwzOTE2MCwzOTE2MSwzOTE2MiwzOTE2MywzOTE2NCwzOTE2NSwzOTE2NiwzOTE2NywzOTE2OCwzOTE2OSwzOTE3MCwzOTE3MSwzOTE3MiwzOTE3MywzOTE3NCwzOTE3NSwzODEyMSwzODEyMywzODEyNiwzODEyNywzODEzMSwzODEzMiwzODEzMywzODEzNSwzODEzNywzODE0MCwzODE0MSwzODE0MywzODE0NywzODE0NiwzODE1MCwzODE1MSwzODE1MywzODE1NCwzODE1NywzODE1OCwzODE1OSwzODE2MiwzODE2MywzODE2NCwzODE2NSwzODE2NiwzODE2OCwzODE3MSwzODE3MywzODE3NCwzODE3NSwzODE3OCwzODE4NiwzODE4NywzODE4NSwzODE4OCwzODE5MywzODE5NCwzODE5NiwzODE5OCwzODE5OSwzODIwMCwzODIwNCwzODIwNiwzODIwNywzODIxMCwzODE5NywzODIxMiwzODIxMywzODIxNCwzODIxNywzODIyMCwzODIyMiwzODIyMywzODIyNiwzODIyNywzODIyOCwzODIzMCwzODIzMSwzODIzMiwzODIzMywzODIzNSwzODIzOCwzODIzOSwzODIzNywzODI0MSwzODI0MiwzODI0NCwzODI0NSwzODI0NiwzODI0NywzODI0OCwzODI0OSwzODI1MCwzODI1MSwzODI1MiwzODI1NSwzODI1NywzODI1OCwzODI1OSwzODIwMiwzMDY5NSwzMDcwMCwzODYwMSwzMTE4OSwzMTIxMywzMTIwMywzMTIxMSwzMTIzOCwyMzg3OSwzMTIzNSwzMTIzNCwzMTI2MiwzMTI1MiwzOTE3NiwzOTE3NywzOTE3OCwzOTE3OSwzOTE4MCwzOTE4MiwzOTE4MywzOTE4NSwzOTE4NiwzOTE4NywzOTE4OCwzOTE4OSwzOTE5MCwzOTE5MSwzOTE5MiwzOTE5MywzOTE5NCwzOTE5NSwzOTE5NiwzOTE5NywzOTE5OCwzOTE5OSwzOTIwMCwzOTIwMSwzOTIwMiwzOTIwMywzOTIwNCwzOTIwNSwzOTIwNiwzOTIwNywzOTIwOCwzOTIwOSwzOTIxMCwzOTIxMSwzOTIxMiwzOTIxMywzOTIxNSwzOTIxNiwzOTIxNywzOTIxOCwzOTIxOSwzOTIyMCwzOTIyMSwzOTIyMiwzOTIyMywzOTIyNCwzOTIyNSwzOTIyNiwzOTIyNywzOTIyOCwzOTIyOSwzOTIzMCwzOTIzMSwzOTIzMiwzOTIzMywzOTIzNCwzOTIzNSwzOTIzNiwzOTIzNywzOTIzOCwzOTIzOSwzOTI0MCwzOTI0MSwzOTI0MiwzOTI0MywzOTI0NCwzOTI0NSwzOTI0NiwzOTI0NywzOTI0OCwzOTI0OSwzOTI1MCwzOTI1MSwzOTI1NCwzOTI1NSwzOTI1NiwzOTI1NywzOTI1OCwzOTI1OSwzOTI2MCwzOTI2MSwzOTI2MiwzOTI2MywzOTI2NCwzOTI2NSwzOTI2NiwzOTI2OCwzOTI3MCwzOTI4MywzOTI4OCwzOTI4OSwzOTI5MSwzOTI5NCwzOTI5OCwzOTI5OSwzOTMwNSwzMTI4OSwzMTI4NywzMTMxMyw0MDY1NSwzOTMzMywzMTM0NCwzMDM0NCwzMDM1MCwzMDM1NSwzMDM2MSwzMDM3MiwyOTkxOCwyOTkyMCwyOTk5Niw0MDQ4MCw0MDQ4Miw0MDQ4OCw0MDQ4OSw0MDQ5MCw0MDQ5MSw0MDQ5Miw0MDQ5OCw0MDQ5Nyw0MDUwMiw0MDUwNCw0MDUwMyw0MDUwNSw0MDUwNiw0MDUxMCw0MDUxMyw0MDUxNCw0MDUxNiw0MDUxOCw0MDUxOSw0MDUyMCw0MDUyMSw0MDUyMyw0MDUyNCw0MDUyNiw0MDUyOSw0MDUzMyw0MDUzNSw0MDUzOCw0MDUzOSw0MDU0MCw0MDU0Miw0MDU0Nyw0MDU1MCw0MDU1MSw0MDU1Miw0MDU1Myw0MDU1NCw0MDU1NSw0MDU1Niw0MDU2MSw0MDU1Nyw0MDU2MywzMDA5OCwzMDEwMCwzMDEwMiwzMDExMiwzMDEwOSwzMDEyNCwzMDExNSwzMDEzMSwzMDEzMiwzMDEzNiwzMDE0OCwzMDEyOSwzMDEyOCwzMDE0NywzMDE0NiwzMDE2NiwzMDE1NywzMDE3OSwzMDE4NCwzMDE4MiwzMDE4MCwzMDE4NywzMDE4MywzMDIxMSwzMDE5MywzMDIwNCwzMDIwNywzMDIyNCwzMDIwOCwzMDIxMywzMDIyMCwzMDIzMSwzMDIxOCwzMDI0NSwzMDIzMiwzMDIyOSwzMDIzMywzOTMwOCwzOTMxMCwzOTMyMiwzOTMyMywzOTMyNCwzOTMyNSwzOTMyNiwzOTMyNywzOTMyOCwzOTMyOSwzOTMzMCwzOTMzMSwzOTMzMiwzOTMzNCwzOTMzNSwzOTMzNywzOTMzOCwzOTMzOSwzOTM0MCwzOTM0MSwzOTM0MiwzOTM0MywzOTM0NCwzOTM0NSwzOTM0NiwzOTM0NywzOTM0OCwzOTM0OSwzOTM1MCwzOTM1MSwzOTM1MiwzOTM1MywzOTM1NCwzOTM1NSwzOTM1NiwzOTM1NywzOTM1OCwzOTM1OSwzOTM2MCwzOTM2MSwzOTM2MiwzOTM2MywzOTM2NCwzOTM2NSwzOTM2NiwzOTM2NywzOTM2OCwzOTM2OSwzOTM3MCwzOTM3MSwzOTM3MiwzOTM3MywzOTM3NCwzOTM3NSwzOTM3NiwzOTM3NywzOTM3OCwzOTM3OSwzOTM4MCwzOTM4MSwzOTM4MiwzOTM4MywzOTM4NCwzOTM4NSwzOTM4NiwzOTM4NywzOTM4OCwzOTM4OSwzOTM5MCwzOTM5MSwzOTM5MiwzOTM5MywzOTM5NCwzOTM5NSwzOTM5NiwzOTM5NywzOTM5OCwzOTM5OSwzOTQwMCwzOTQwMSwzOTQwMiwzOTQwMywzOTQwNCwzOTQwNSwzOTQwNiwzOTQwNywzOTQwOCwzOTQwOSwzOTQxMCwzOTQxMSwzOTQxMiwzOTQxMywzOTQxNCwzOTQxNSwzOTQxNiwzOTQxNywzMDIzNSwzMDI2OCwzMDI0MiwzMDI0MCwzMDI3MiwzMDI1MywzMDI1NiwzMDI3MSwzMDI2MSwzMDI3NSwzMDI3MCwzMDI1OSwzMDI4NSwzMDMwMiwzMDI5MiwzMDMwMCwzMDI5NCwzMDMxNSwzMDMxOSwzMjcxNCwzMTQ2MiwzMTM1MiwzMTM1MywzMTM2MCwzMTM2NiwzMTM2OCwzMTM4MSwzMTM5OCwzMTM5MiwzMTQwNCwzMTQwMCwzMTQwNSwzMTQxMSwzNDkxNiwzNDkyMSwzNDkzMCwzNDk0MSwzNDk0MywzNDk0NiwzNDk3OCwzNTAxNCwzNDk5OSwzNTAwNCwzNTAxNywzNTA0MiwzNTAyMiwzNTA0MywzNTA0NSwzNTA1NywzNTA5OCwzNTA2OCwzNTA0OCwzNTA3MCwzNTA1NiwzNTEwNSwzNTA5NywzNTA5MSwzNTA5OSwzNTA4MiwzNTEyNCwzNTExNSwzNTEyNiwzNTEzNywzNTE3NCwzNTE5NSwzMDA5MSwzMjk5NywzMDM4NiwzMDM4OCwzMDY4NCwzMjc4NiwzMjc4OCwzMjc5MCwzMjc5NiwzMjgwMCwzMjgwMiwzMjgwNSwzMjgwNiwzMjgwNywzMjgwOSwzMjgwOCwzMjgxNywzMjc3OSwzMjgyMSwzMjgzNSwzMjgzOCwzMjg0NSwzMjg1MCwzMjg3MywzMjg4MSwzNTIwMywzOTAzMiwzOTA0MCwzOTA0MywzOTQxOCwzOTQxOSwzOTQyMCwzOTQyMSwzOTQyMiwzOTQyMywzOTQyNCwzOTQyNSwzOTQyNiwzOTQyNywzOTQyOCwzOTQyOSwzOTQzMCwzOTQzMSwzOTQzMiwzOTQzMywzOTQzNCwzOTQzNSwzOTQzNiwzOTQzNywzOTQzOCwzOTQzOSwzOTQ0MCwzOTQ0MSwzOTQ0MiwzOTQ0MywzOTQ0NCwzOTQ0NSwzOTQ0NiwzOTQ0NywzOTQ0OCwzOTQ0OSwzOTQ1MCwzOTQ1MSwzOTQ1MiwzOTQ1MywzOTQ1NCwzOTQ1NSwzOTQ1NiwzOTQ1NywzOTQ1OCwzOTQ1OSwzOTQ2MCwzOTQ2MSwzOTQ2MiwzOTQ2MywzOTQ2NCwzOTQ2NSwzOTQ2NiwzOTQ2NywzOTQ2OCwzOTQ2OSwzOTQ3MCwzOTQ3MSwzOTQ3MiwzOTQ3MywzOTQ3NCwzOTQ3NSwzOTQ3NiwzOTQ3NywzOTQ3OCwzOTQ3OSwzOTQ4MCwzOTQ4MSwzOTQ4MiwzOTQ4MywzOTQ4NCwzOTQ4NSwzOTQ4NiwzOTQ4NywzOTQ4OCwzOTQ4OSwzOTQ5MCwzOTQ5MSwzOTQ5MiwzOTQ5MywzOTQ5NCwzOTQ5NSwzOTQ5NiwzOTQ5NywzOTQ5OCwzOTQ5OSwzOTUwMCwzOTUwMSwzOTUwMiwzOTUwMywzOTUwNCwzOTUwNSwzOTUwNiwzOTUwNywzOTUwOCwzOTUwOSwzOTUxMCwzOTUxMSwzOTUxMiwzOTUxMywzOTA0OSwzOTA1MiwzOTA1MywzOTA1NSwzOTA2MCwzOTA2NiwzOTA2NywzOTA3MCwzOTA3MSwzOTA3MywzOTA3NCwzOTA3NywzOTA3OCwzNDM4MSwzNDM4OCwzNDQxMiwzNDQxNCwzNDQzMSwzNDQyNiwzNDQyOCwzNDQyNywzNDQ3MiwzNDQ0NSwzNDQ0MywzNDQ3NiwzNDQ2MSwzNDQ3MSwzNDQ2NywzNDQ3NCwzNDQ1MSwzNDQ3MywzNDQ4NiwzNDUwMCwzNDQ4NSwzNDUxMCwzNDQ4MCwzNDQ5MCwzNDQ4MSwzNDQ3OSwzNDUwNSwzNDUxMSwzNDQ4NCwzNDUzNywzNDU0NSwzNDU0NiwzNDU0MSwzNDU0NywzNDUxMiwzNDU3OSwzNDUyNiwzNDU0OCwzNDUyNywzNDUyMCwzNDUxMywzNDU2MywzNDU2NywzNDU1MiwzNDU2OCwzNDU3MCwzNDU3MywzNDU2OSwzNDU5NSwzNDYxOSwzNDU5MCwzNDU5NywzNDYwNiwzNDU4NiwzNDYyMiwzNDYzMiwzNDYxMiwzNDYwOSwzNDYwMSwzNDYxNSwzNDYyMywzNDY5MCwzNDU5NCwzNDY4NSwzNDY4NiwzNDY4MywzNDY1NiwzNDY3MiwzNDYzNiwzNDY3MCwzNDY5OSwzNDY0MywzNDY1OSwzNDY4NCwzNDY2MCwzNDY0OSwzNDY2MSwzNDcwNywzNDczNSwzNDcyOCwzNDc3MCwzOTUxNCwzOTUxNSwzOTUxNiwzOTUxNywzOTUxOCwzOTUxOSwzOTUyMCwzOTUyMSwzOTUyMiwzOTUyMywzOTUyNCwzOTUyNSwzOTUyNiwzOTUyNywzOTUyOCwzOTUyOSwzOTUzMCwzOTUzMSwzOTUzOCwzOTU1NSwzOTU2MSwzOTU2NSwzOTU2NiwzOTU3MiwzOTU3MywzOTU3NywzOTU5MCwzOTU5MywzOTU5NCwzOTU5NSwzOTU5NiwzOTU5NywzOTU5OCwzOTU5OSwzOTYwMiwzOTYwMywzOTYwNCwzOTYwNSwzOTYwOSwzOTYxMSwzOTYxMywzOTYxNCwzOTYxNSwzOTYxOSwzOTYyMCwzOTYyMiwzOTYyMywzOTYyNCwzOTYyNSwzOTYyNiwzOTYyOSwzOTYzMCwzOTYzMSwzOTYzMiwzOTYzNCwzOTYzNiwzOTYzNywzOTYzOCwzOTYzOSwzOTY0MSwzOTY0MiwzOTY0MywzOTY0NCwzOTY0NSwzOTY0NiwzOTY0OCwzOTY1MCwzOTY1MSwzOTY1MiwzOTY1MywzOTY1NSwzOTY1NiwzOTY1NywzOTY1OCwzOTY2MCwzOTY2MiwzOTY2NCwzOTY2NSwzOTY2NiwzOTY2NywzOTY2OCwzOTY2OSwzOTY3MCwzOTY3MSwzOTY3MiwzOTY3NCwzOTY3NiwzOTY3NywzOTY3OCwzOTY3OSwzOTY4MCwzOTY4MSwzOTY4MiwzOTY4NCwzOTY4NSwzOTY4NiwzNDc1OCwzNDY5NiwzNDY5MywzNDczMywzNDcxMSwzNDY5MSwzNDczMSwzNDc4OSwzNDczMiwzNDc0MSwzNDczOSwzNDc2MywzNDc3MSwzNDc0OSwzNDc2OSwzNDc1MiwzNDc2MiwzNDc3OSwzNDc5NCwzNDc4NCwzNDc5OCwzNDgzOCwzNDgzNSwzNDgxNCwzNDgyNiwzNDg0MywzNDg0OSwzNDg3MywzNDg3NiwzMjU2NiwzMjU3OCwzMjU4MCwzMjU4MSwzMzI5NiwzMTQ4MiwzMTQ4NSwzMTQ5NiwzMTQ5MSwzMTQ5MiwzMTUwOSwzMTQ5OCwzMTUzMSwzMTUwMywzMTU1OSwzMTU0NCwzMTUzMCwzMTUxMywzMTUzNCwzMTUzNywzMTUyMCwzMTUyNSwzMTUyNCwzMTUzOSwzMTU1MCwzMTUxOCwzMTU3NiwzMTU3OCwzMTU1NywzMTYwNSwzMTU2NCwzMTU4MSwzMTU4NCwzMTU5OCwzMTYxMSwzMTU4NiwzMTYwMiwzMTYwMSwzMTYzMiwzMTY1NCwzMTY1NSwzMTY3MiwzMTY2MCwzMTY0NSwzMTY1NiwzMTYyMSwzMTY1OCwzMTY0NCwzMTY1MCwzMTY1OSwzMTY2OCwzMTY5NywzMTY4MSwzMTY5MiwzMTcwOSwzMTcwNiwzMTcxNywzMTcxOCwzMTcyMiwzMTc1NiwzMTc0MiwzMTc0MCwzMTc1OSwzMTc2NiwzMTc1NSwzOTY4NywzOTY4OSwzOTY5MCwzOTY5MSwzOTY5MiwzOTY5MywzOTY5NCwzOTY5NiwzOTY5NywzOTY5OCwzOTcwMCwzOTcwMSwzOTcwMiwzOTcwMywzOTcwNCwzOTcwNSwzOTcwNiwzOTcwNywzOTcwOCwzOTcwOSwzOTcxMCwzOTcxMiwzOTcxMywzOTcxNCwzOTcxNiwzOTcxNywzOTcxOCwzOTcxOSwzOTcyMCwzOTcyMSwzOTcyMiwzOTcyMywzOTcyNCwzOTcyNSwzOTcyNiwzOTcyOCwzOTcyOSwzOTczMSwzOTczMiwzOTczMywzOTczNCwzOTczNSwzOTczNiwzOTczNywzOTczOCwzOTc0MSwzOTc0MiwzOTc0MywzOTc0NCwzOTc1MCwzOTc1NCwzOTc1NSwzOTc1NiwzOTc1OCwzOTc2MCwzOTc2MiwzOTc2MywzOTc2NSwzOTc2NiwzOTc2NywzOTc2OCwzOTc2OSwzOTc3MCwzOTc3MSwzOTc3MiwzOTc3MywzOTc3NCwzOTc3NSwzOTc3NiwzOTc3NywzOTc3OCwzOTc3OSwzOTc4MCwzOTc4MSwzOTc4MiwzOTc4MywzOTc4NCwzOTc4NSwzOTc4NiwzOTc4NywzOTc4OCwzOTc4OSwzOTc5MCwzOTc5MSwzOTc5MiwzOTc5MywzOTc5NCwzOTc5NSwzOTc5NiwzOTc5NywzOTc5OCwzOTc5OSwzOTgwMCwzOTgwMSwzOTgwMiwzOTgwMywzMTc3NSwzMTc4NiwzMTc4MiwzMTgwMCwzMTgwOSwzMTgwOCwzMzI3OCwzMzI4MSwzMzI4MiwzMzI4NCwzMzI2MCwzNDg4NCwzMzMxMywzMzMxNCwzMzMxNSwzMzMyNSwzMzMyNywzMzMyMCwzMzMyMywzMzMzNiwzMzMzOSwzMzMzMSwzMzMzMiwzMzM0MiwzMzM0OCwzMzM1MywzMzM1NSwzMzM1OSwzMzM3MCwzMzM3NSwzMzM4NCwzNDk0MiwzNDk0OSwzNDk1MiwzNTAzMiwzNTAzOSwzNTE2NiwzMjY2OSwzMjY3MSwzMjY3OSwzMjY4NywzMjY4OCwzMjY5MCwzMTg2OCwyNTkyOSwzMTg4OSwzMTkwMSwzMTkwMCwzMTkwMiwzMTkwNiwzMTkyMiwzMTkzMiwzMTkzMywzMTkzNywzMTk0MywzMTk0OCwzMTk0OSwzMTk0NCwzMTk0MSwzMTk1OSwzMTk3NiwzMzM5MCwyNjI4MCwzMjcwMywzMjcxOCwzMjcyNSwzMjc0MSwzMjczNywzMjc0MiwzMjc0NSwzMjc1MCwzMjc1NSwzMTk5MiwzMjExOSwzMjE2NiwzMjE3NCwzMjMyNywzMjQxMSw0MDYzMiw0MDYyOCwzNjIxMSwzNjIyOCwzNjI0NCwzNjI0MSwzNjI3MywzNjE5OSwzNjIwNSwzNTkxMSwzNTkxMywzNzE5NCwzNzIwMCwzNzE5OCwzNzE5OSwzNzIyMCwzOTgwNCwzOTgwNSwzOTgwNiwzOTgwNywzOTgwOCwzOTgwOSwzOTgxMCwzOTgxMSwzOTgxMiwzOTgxMywzOTgxNCwzOTgxNSwzOTgxNiwzOTgxNywzOTgxOCwzOTgxOSwzOTgyMCwzOTgyMSwzOTgyMiwzOTgyMywzOTgyNCwzOTgyNSwzOTgyNiwzOTgyNywzOTgyOCwzOTgyOSwzOTgzMCwzOTgzMSwzOTgzMiwzOTgzMywzOTgzNCwzOTgzNSwzOTgzNiwzOTgzNywzOTgzOCwzOTgzOSwzOTg0MCwzOTg0MSwzOTg0MiwzOTg0MywzOTg0NCwzOTg0NSwzOTg0NiwzOTg0NywzOTg0OCwzOTg0OSwzOTg1MCwzOTg1MSwzOTg1MiwzOTg1MywzOTg1NCwzOTg1NSwzOTg1NiwzOTg1NywzOTg1OCwzOTg1OSwzOTg2MCwzOTg2MSwzOTg2MiwzOTg2MywzOTg2NCwzOTg2NSwzOTg2NiwzOTg2NywzOTg2OCwzOTg2OSwzOTg3MCwzOTg3MSwzOTg3MiwzOTg3MywzOTg3NCwzOTg3NSwzOTg3NiwzOTg3NywzOTg3OCwzOTg3OSwzOTg4MCwzOTg4MSwzOTg4MiwzOTg4MywzOTg4NCwzOTg4NSwzOTg4NiwzOTg4NywzOTg4OCwzOTg4OSwzOTg5MCwzOTg5MSwzOTg5MiwzOTg5MywzOTg5NCwzOTg5NSwzOTg5NiwzOTg5NywzOTg5OCwzOTg5OSwzNzIxOCwzNzIxNywzNzIzMiwzNzIyNSwzNzIzMSwzNzI0NSwzNzI0NiwzNzIzNCwzNzIzNiwzNzI0MSwzNzI2MCwzNzI1MywzNzI2NCwzNzI2MSwzNzI2NSwzNzI4MiwzNzI4MywzNzI5MCwzNzI5MywzNzI5NCwzNzI5NSwzNzMwMSwzNzMwMCwzNzMwNiwzNTkyNSw0MDU3NCwzNjI4MCwzNjMzMSwzNjM1NywzNjQ0MSwzNjQ1NywzNjI3NywzNjI4NywzNjI4NCwzNjI4MiwzNjI5MiwzNjMxMCwzNjMxMSwzNjMxNCwzNjMxOCwzNjMwMiwzNjMwMywzNjMxNSwzNjI5NCwzNjMzMiwzNjM0MywzNjM0NCwzNjMyMywzNjM0NSwzNjM0NywzNjMyNCwzNjM2MSwzNjM0OSwzNjM3MiwzNjM4MSwzNjM4MywzNjM5NiwzNjM5OCwzNjM4NywzNjM5OSwzNjQxMCwzNjQxNiwzNjQwOSwzNjQwNSwzNjQxMywzNjQwMSwzNjQyNSwzNjQxNywzNjQxOCwzNjQzMywzNjQzNCwzNjQyNiwzNjQ2NCwzNjQ3MCwzNjQ3NiwzNjQ2MywzNjQ2OCwzNjQ4NSwzNjQ5NSwzNjUwMCwzNjQ5NiwzNjUwOCwzNjUxMCwzNTk2MCwzNTk3MCwzNTk3OCwzNTk3MywzNTk5MiwzNTk4OCwyNjAxMSwzNTI4NiwzNTI5NCwzNTI5MCwzNTI5MiwzOTkwMCwzOTkwMSwzOTkwMiwzOTkwMywzOTkwNCwzOTkwNSwzOTkwNiwzOTkwNywzOTkwOCwzOTkwOSwzOTkxMCwzOTkxMSwzOTkxMiwzOTkxMywzOTkxNCwzOTkxNSwzOTkxNiwzOTkxNywzOTkxOCwzOTkxOSwzOTkyMCwzOTkyMSwzOTkyMiwzOTkyMywzOTkyNCwzOTkyNSwzOTkyNiwzOTkyNywzOTkyOCwzOTkyOSwzOTkzMCwzOTkzMSwzOTkzMiwzOTkzMywzOTkzNCwzOTkzNSwzOTkzNiwzOTkzNywzOTkzOCwzOTkzOSwzOTk0MCwzOTk0MSwzOTk0MiwzOTk0MywzOTk0NCwzOTk0NSwzOTk0NiwzOTk0NywzOTk0OCwzOTk0OSwzOTk1MCwzOTk1MSwzOTk1MiwzOTk1MywzOTk1NCwzOTk1NSwzOTk1NiwzOTk1NywzOTk1OCwzOTk1OSwzOTk2MCwzOTk2MSwzOTk2MiwzOTk2MywzOTk2NCwzOTk2NSwzOTk2NiwzOTk2NywzOTk2OCwzOTk2OSwzOTk3MCwzOTk3MSwzOTk3MiwzOTk3MywzOTk3NCwzOTk3NSwzOTk3NiwzOTk3NywzOTk3OCwzOTk3OSwzOTk4MCwzOTk4MSwzOTk4MiwzOTk4MywzOTk4NCwzOTk4NSwzOTk4NiwzOTk4NywzOTk4OCwzOTk4OSwzOTk5MCwzOTk5MSwzOTk5MiwzOTk5MywzOTk5NCwzOTk5NSwzNTMwMSwzNTMwNywzNTMxMSwzNTM5MCwzNTYyMiwzODczOSwzODYzMywzODY0MywzODYzOSwzODY2MiwzODY1NywzODY2NCwzODY3MSwzODY3MCwzODY5OCwzODcwMSwzODcwNCwzODcxOCw0MDgzMiw0MDgzNSw0MDgzNyw0MDgzOCw0MDgzOSw0MDg0MCw0MDg0MSw0MDg0Miw0MDg0NCw0MDcwMiw0MDcxNSw0MDcxNywzODU4NSwzODU4OCwzODU4OSwzODYwNiwzODYxMCwzMDY1NSwzODYyNCwzNzUxOCwzNzU1MCwzNzU3NiwzNzY5NCwzNzczOCwzNzgzNCwzNzc3NSwzNzk1MCwzNzk5NSw0MDA2Myw0MDA2Niw0MDA2OSw0MDA3MCw0MDA3MSw0MDA3MiwzMTI2Nyw0MDA3NSw0MDA3OCw0MDA4MCw0MDA4MSw0MDA4Miw0MDA4NCw0MDA4NSw0MDA5MCw0MDA5MSw0MDA5NCw0MDA5NSw0MDA5Niw0MDA5Nyw0MDA5OCw0MDA5OSw0MDEwMSw0MDEwMiw0MDEwMyw0MDEwNCw0MDEwNSw0MDEwNyw0MDEwOSw0MDExMCw0MDExMiw0MDExMyw0MDExNCw0MDExNSw0MDExNiw0MDExNyw0MDExOCw0MDExOSw0MDEyMiw0MDEyMyw0MDEyNCw0MDEyNSw0MDEzMiw0MDEzMyw0MDEzNCw0MDEzNSw0MDEzOCw0MDEzOSwzOTk5NiwzOTk5NywzOTk5OCwzOTk5OSw0MDAwMCw0MDAwMSw0MDAwMiw0MDAwMyw0MDAwNCw0MDAwNSw0MDAwNiw0MDAwNyw0MDAwOCw0MDAwOSw0MDAxMCw0MDAxMSw0MDAxMiw0MDAxMyw0MDAxNCw0MDAxNSw0MDAxNiw0MDAxNyw0MDAxOCw0MDAxOSw0MDAyMCw0MDAyMSw0MDAyMiw0MDAyMyw0MDAyNCw0MDAyNSw0MDAyNiw0MDAyNyw0MDAyOCw0MDAyOSw0MDAzMCw0MDAzMSw0MDAzMiw0MDAzMyw0MDAzNCw0MDAzNSw0MDAzNiw0MDAzNyw0MDAzOCw0MDAzOSw0MDA0MCw0MDA0MSw0MDA0Miw0MDA0Myw0MDA0NCw0MDA0NSw0MDA0Niw0MDA0Nyw0MDA0OCw0MDA0OSw0MDA1MCw0MDA1MSw0MDA1Miw0MDA1Myw0MDA1NCw0MDA1NSw0MDA1Niw0MDA1Nyw0MDA1OCw0MDA1OSw0MDA2MSw0MDA2Miw0MDA2NCw0MDA2Nyw0MDA2OCw0MDA3Myw0MDA3NCw0MDA3Niw0MDA3OSw0MDA4Myw0MDA4Niw0MDA4Nyw0MDA4OCw0MDA4OSw0MDA5Myw0MDEwNiw0MDEwOCw0MDExMSw0MDEyMSw0MDEyNiw0MDEyNyw0MDEyOCw0MDEyOSw0MDEzMCw0MDEzNiw0MDEzNyw0MDE0NSw0MDE0Niw0MDE1NCw0MDE1NSw0MDE2MCw0MDE2MSw0MDE0MCw0MDE0MSw0MDE0Miw0MDE0Myw0MDE0NCw0MDE0Nyw0MDE0OCw0MDE0OSw0MDE1MSw0MDE1Miw0MDE1Myw0MDE1Niw0MDE1Nyw0MDE1OSw0MDE2MiwzODc4MCwzODc4OSwzODgwMSwzODgwMiwzODgwNCwzODgzMSwzODgyNywzODgxOSwzODgzNCwzODgzNiwzOTYwMSwzOTYwMCwzOTYwNyw0MDUzNiwzOTYwNiwzOTYxMCwzOTYxMiwzOTYxNywzOTYxNiwzOTYyMSwzOTYxOCwzOTYyNywzOTYyOCwzOTYzMywzOTc0OSwzOTc0NywzOTc1MSwzOTc1MywzOTc1MiwzOTc1NywzOTc2MSwzOTE0NCwzOTE4MSwzOTIxNCwzOTI1MywzOTI1MiwzOTY0NywzOTY0OSwzOTY1NCwzOTY2MywzOTY1OSwzOTY3NSwzOTY2MSwzOTY3MywzOTY4OCwzOTY5NSwzOTY5OSwzOTcxMSwzOTcxNSw0MDYzNyw0MDYzOCwzMjMxNSw0MDU3OCw0MDU4Myw0MDU4NCw0MDU4Nyw0MDU5NCwzNzg0Niw0MDYwNSw0MDYwNyw0MDY2Nyw0MDY2OCw0MDY2OSw0MDY3Miw0MDY3MSw0MDY3NCw0MDY4MSw0MDY3OSw0MDY3Nyw0MDY4Miw0MDY4Nyw0MDczOCw0MDc0OCw0MDc1MSw0MDc2MSw0MDc1OSw0MDc2NSw0MDc2Niw0MDc3Miw0MDE2Myw0MDE2NCw0MDE2NSw0MDE2Niw0MDE2Nyw0MDE2OCw0MDE2OSw0MDE3MCw0MDE3MSw0MDE3Miw0MDE3Myw0MDE3NCw0MDE3NSw0MDE3Niw0MDE3Nyw0MDE3OCw0MDE3OSw0MDE4MCw0MDE4MSw0MDE4Miw0MDE4Myw0MDE4NCw0MDE4NSw0MDE4Niw0MDE4Nyw0MDE4OCw0MDE4OSw0MDE5MCw0MDE5MSw0MDE5Miw0MDE5Myw0MDE5NCw0MDE5NSw0MDE5Niw0MDE5Nyw0MDE5OCw0MDE5OSw0MDIwMCw0MDIwMSw0MDIwMiw0MDIwMyw0MDIwNCw0MDIwNSw0MDIwNiw0MDIwNyw0MDIwOCw0MDIwOSw0MDIxMCw0MDIxMSw0MDIxMiw0MDIxMyw0MDIxNCw0MDIxNSw0MDIxNiw0MDIxNyw0MDIxOCw0MDIxOSw0MDIyMCw0MDIyMSw0MDIyMiw0MDIyMyw0MDIyNCw0MDIyNSw0MDIyNiw0MDIyNyw0MDIyOCw0MDIyOSw0MDIzMCw0MDIzMSw0MDIzMiw0MDIzMyw0MDIzNCw0MDIzNSw0MDIzNiw0MDIzNyw0MDIzOCw0MDIzOSw0MDI0MCw0MDI0MSw0MDI0Miw0MDI0Myw0MDI0NCw0MDI0NSw0MDI0Niw0MDI0Nyw0MDI0OCw0MDI0OSw0MDI1MCw0MDI1MSw0MDI1Miw0MDI1Myw0MDI1NCw0MDI1NSw0MDI1Niw0MDI1Nyw0MDI1OCw1NzkwOCw1NzkwOSw1NzkxMCw1NzkxMSw1NzkxMiw1NzkxMyw1NzkxNCw1NzkxNSw1NzkxNiw1NzkxNyw1NzkxOCw1NzkxOSw1NzkyMCw1NzkyMSw1NzkyMiw1NzkyMyw1NzkyNCw1NzkyNSw1NzkyNiw1NzkyNyw1NzkyOCw1NzkyOSw1NzkzMCw1NzkzMSw1NzkzMiw1NzkzMyw1NzkzNCw1NzkzNSw1NzkzNiw1NzkzNyw1NzkzOCw1NzkzOSw1Nzk0MCw1Nzk0MSw1Nzk0Miw1Nzk0Myw1Nzk0NCw1Nzk0NSw1Nzk0Niw1Nzk0Nyw1Nzk0OCw1Nzk0OSw1Nzk1MCw1Nzk1MSw1Nzk1Miw1Nzk1Myw1Nzk1NCw1Nzk1NSw1Nzk1Niw1Nzk1Nyw1Nzk1OCw1Nzk1OSw1Nzk2MCw1Nzk2MSw1Nzk2Miw1Nzk2Myw1Nzk2NCw1Nzk2NSw1Nzk2Niw1Nzk2Nyw1Nzk2OCw1Nzk2OSw1Nzk3MCw1Nzk3MSw1Nzk3Miw1Nzk3Myw1Nzk3NCw1Nzk3NSw1Nzk3Niw1Nzk3Nyw1Nzk3OCw1Nzk3OSw1Nzk4MCw1Nzk4MSw1Nzk4Miw1Nzk4Myw1Nzk4NCw1Nzk4NSw1Nzk4Niw1Nzk4Nyw1Nzk4OCw1Nzk4OSw1Nzk5MCw1Nzk5MSw1Nzk5Miw1Nzk5Myw1Nzk5NCw1Nzk5NSw1Nzk5Niw1Nzk5Nyw1Nzk5OCw1Nzk5OSw1ODAwMCw1ODAwMSw0MDI1OSw0MDI2MCw0MDI2MSw0MDI2Miw0MDI2Myw0MDI2NCw0MDI2NSw0MDI2Niw0MDI2Nyw0MDI2OCw0MDI2OSw0MDI3MCw0MDI3MSw0MDI3Miw0MDI3Myw0MDI3NCw0MDI3NSw0MDI3Niw0MDI3Nyw0MDI3OCw0MDI3OSw0MDI4MCw0MDI4MSw0MDI4Miw0MDI4Myw0MDI4NCw0MDI4NSw0MDI4Niw0MDI4Nyw0MDI4OCw0MDI4OSw0MDI5MCw0MDI5MSw0MDI5Miw0MDI5Myw0MDI5NCw0MDI5NSw0MDI5Niw0MDI5Nyw0MDI5OCw0MDI5OSw0MDMwMCw0MDMwMSw0MDMwMiw0MDMwMyw0MDMwNCw0MDMwNSw0MDMwNiw0MDMwNyw0MDMwOCw0MDMwOSw0MDMxMCw0MDMxMSw0MDMxMiw0MDMxMyw0MDMxNCw0MDMxNSw0MDMxNiw0MDMxNyw0MDMxOCw0MDMxOSw0MDMyMCw0MDMyMSw0MDMyMiw0MDMyMyw0MDMyNCw0MDMyNSw0MDMyNiw0MDMyNyw0MDMyOCw0MDMyOSw0MDMzMCw0MDMzMSw0MDMzMiw0MDMzMyw0MDMzNCw0MDMzNSw0MDMzNiw0MDMzNyw0MDMzOCw0MDMzOSw0MDM0MCw0MDM0MSw0MDM0Miw0MDM0Myw0MDM0NCw0MDM0NSw0MDM0Niw0MDM0Nyw0MDM0OCw0MDM0OSw0MDM1MCw0MDM1MSw0MDM1Miw0MDM1Myw0MDM1NCw1ODAwMiw1ODAwMyw1ODAwNCw1ODAwNSw1ODAwNiw1ODAwNyw1ODAwOCw1ODAwOSw1ODAxMCw1ODAxMSw1ODAxMiw1ODAxMyw1ODAxNCw1ODAxNSw1ODAxNiw1ODAxNyw1ODAxOCw1ODAxOSw1ODAyMCw1ODAyMSw1ODAyMiw1ODAyMyw1ODAyNCw1ODAyNSw1ODAyNiw1ODAyNyw1ODAyOCw1ODAyOSw1ODAzMCw1ODAzMSw1ODAzMiw1ODAzMyw1ODAzNCw1ODAzNSw1ODAzNiw1ODAzNyw1ODAzOCw1ODAzOSw1ODA0MCw1ODA0MSw1ODA0Miw1ODA0Myw1ODA0NCw1ODA0NSw1ODA0Niw1ODA0Nyw1ODA0OCw1ODA0OSw1ODA1MCw1ODA1MSw1ODA1Miw1ODA1Myw1ODA1NCw1ODA1NSw1ODA1Niw1ODA1Nyw1ODA1OCw1ODA1OSw1ODA2MCw1ODA2MSw1ODA2Miw1ODA2Myw1ODA2NCw1ODA2NSw1ODA2Niw1ODA2Nyw1ODA2OCw1ODA2OSw1ODA3MCw1ODA3MSw1ODA3Miw1ODA3Myw1ODA3NCw1ODA3NSw1ODA3Niw1ODA3Nyw1ODA3OCw1ODA3OSw1ODA4MCw1ODA4MSw1ODA4Miw1ODA4Myw1ODA4NCw1ODA4NSw1ODA4Niw1ODA4Nyw1ODA4OCw1ODA4OSw1ODA5MCw1ODA5MSw1ODA5Miw1ODA5Myw1ODA5NCw1ODA5NSw0MDM1NSw0MDM1Niw0MDM1Nyw0MDM1OCw0MDM1OSw0MDM2MCw0MDM2MSw0MDM2Miw0MDM2Myw0MDM2NCw0MDM2NSw0MDM2Niw0MDM2Nyw0MDM2OCw0MDM2OSw0MDM3MCw0MDM3MSw0MDM3Miw0MDM3Myw0MDM3NCw0MDM3NSw0MDM3Niw0MDM3Nyw0MDM3OCw0MDM3OSw0MDM4MCw0MDM4MSw0MDM4Miw0MDM4Myw0MDM4NCw0MDM4NSw0MDM4Niw0MDM4Nyw0MDM4OCw0MDM4OSw0MDM5MCw0MDM5MSw0MDM5Miw0MDM5Myw0MDM5NCw0MDM5NSw0MDM5Niw0MDM5Nyw0MDM5OCw0MDM5OSw0MDQwMCw0MDQwMSw0MDQwMiw0MDQwMyw0MDQwNCw0MDQwNSw0MDQwNiw0MDQwNyw0MDQwOCw0MDQwOSw0MDQxMCw0MDQxMSw0MDQxMiw0MDQxMyw0MDQxNCw0MDQxNSw0MDQxNiw0MDQxNyw0MDQxOCw0MDQxOSw0MDQyMCw0MDQyMSw0MDQyMiw0MDQyMyw0MDQyNCw0MDQyNSw0MDQyNiw0MDQyNyw0MDQyOCw0MDQyOSw0MDQzMCw0MDQzMSw0MDQzMiw0MDQzMyw0MDQzNCw0MDQzNSw0MDQzNiw0MDQzNyw0MDQzOCw0MDQzOSw0MDQ0MCw0MDQ0MSw0MDQ0Miw0MDQ0Myw0MDQ0NCw0MDQ0NSw0MDQ0Niw0MDQ0Nyw0MDQ0OCw0MDQ0OSw0MDQ1MCw1ODA5Niw1ODA5Nyw1ODA5OCw1ODA5OSw1ODEwMCw1ODEwMSw1ODEwMiw1ODEwMyw1ODEwNCw1ODEwNSw1ODEwNiw1ODEwNyw1ODEwOCw1ODEwOSw1ODExMCw1ODExMSw1ODExMiw1ODExMyw1ODExNCw1ODExNSw1ODExNiw1ODExNyw1ODExOCw1ODExOSw1ODEyMCw1ODEyMSw1ODEyMiw1ODEyMyw1ODEyNCw1ODEyNSw1ODEyNiw1ODEyNyw1ODEyOCw1ODEyOSw1ODEzMCw1ODEzMSw1ODEzMiw1ODEzMyw1ODEzNCw1ODEzNSw1ODEzNiw1ODEzNyw1ODEzOCw1ODEzOSw1ODE0MCw1ODE0MSw1ODE0Miw1ODE0Myw1ODE0NCw1ODE0NSw1ODE0Niw1ODE0Nyw1ODE0OCw1ODE0OSw1ODE1MCw1ODE1MSw1ODE1Miw1ODE1Myw1ODE1NCw1ODE1NSw1ODE1Niw1ODE1Nyw1ODE1OCw1ODE1OSw1ODE2MCw1ODE2MSw1ODE2Miw1ODE2Myw1ODE2NCw1ODE2NSw1ODE2Niw1ODE2Nyw1ODE2OCw1ODE2OSw1ODE3MCw1ODE3MSw1ODE3Miw1ODE3Myw1ODE3NCw1ODE3NSw1ODE3Niw1ODE3Nyw1ODE3OCw1ODE3OSw1ODE4MCw1ODE4MSw1ODE4Miw1ODE4Myw1ODE4NCw1ODE4NSw1ODE4Niw1ODE4Nyw1ODE4OCw1ODE4OSw0MDQ1MSw0MDQ1Miw0MDQ1Myw0MDQ1NCw0MDQ1NSw0MDQ1Niw0MDQ1Nyw0MDQ1OCw0MDQ1OSw0MDQ2MCw0MDQ2MSw0MDQ2Miw0MDQ2Myw0MDQ2NCw0MDQ2NSw0MDQ2Niw0MDQ2Nyw0MDQ2OCw0MDQ2OSw0MDQ3MCw0MDQ3MSw0MDQ3Miw0MDQ3Myw0MDQ3NCw0MDQ3NSw0MDQ3Niw0MDQ3Nyw0MDQ3OCw0MDQ4NCw0MDQ4Nyw0MDQ5NCw0MDQ5Niw0MDUwMCw0MDUwNyw0MDUwOCw0MDUxMiw0MDUyNSw0MDUyOCw0MDUzMCw0MDUzMSw0MDUzMiw0MDUzNCw0MDUzNyw0MDU0MSw0MDU0Myw0MDU0NCw0MDU0NSw0MDU0Niw0MDU0OSw0MDU1OCw0MDU1OSw0MDU2Miw0MDU2NCw0MDU2NSw0MDU2Niw0MDU2Nyw0MDU2OCw0MDU2OSw0MDU3MCw0MDU3MSw0MDU3Miw0MDU3Myw0MDU3Niw0MDU3Nyw0MDU3OSw0MDU4MCw0MDU4MSw0MDU4Miw0MDU4NSw0MDU4Niw0MDU4OCw0MDU4OSw0MDU5MCw0MDU5MSw0MDU5Miw0MDU5Myw0MDU5Niw0MDU5Nyw0MDU5OCw0MDU5OSw0MDYwMCw0MDYwMSw0MDYwMiw0MDYwMyw0MDYwNCw0MDYwNiw0MDYwOCw0MDYwOSw0MDYxMCw0MDYxMSw0MDYxMiw0MDYxMyw0MDYxNSw0MDYxNiw0MDYxNyw0MDYxOCw1ODE5MCw1ODE5MSw1ODE5Miw1ODE5Myw1ODE5NCw1ODE5NSw1ODE5Niw1ODE5Nyw1ODE5OCw1ODE5OSw1ODIwMCw1ODIwMSw1ODIwMiw1ODIwMyw1ODIwNCw1ODIwNSw1ODIwNiw1ODIwNyw1ODIwOCw1ODIwOSw1ODIxMCw1ODIxMSw1ODIxMiw1ODIxMyw1ODIxNCw1ODIxNSw1ODIxNiw1ODIxNyw1ODIxOCw1ODIxOSw1ODIyMCw1ODIyMSw1ODIyMiw1ODIyMyw1ODIyNCw1ODIyNSw1ODIyNiw1ODIyNyw1ODIyOCw1ODIyOSw1ODIzMCw1ODIzMSw1ODIzMiw1ODIzMyw1ODIzNCw1ODIzNSw1ODIzNiw1ODIzNyw1ODIzOCw1ODIzOSw1ODI0MCw1ODI0MSw1ODI0Miw1ODI0Myw1ODI0NCw1ODI0NSw1ODI0Niw1ODI0Nyw1ODI0OCw1ODI0OSw1ODI1MCw1ODI1MSw1ODI1Miw1ODI1Myw1ODI1NCw1ODI1NSw1ODI1Niw1ODI1Nyw1ODI1OCw1ODI1OSw1ODI2MCw1ODI2MSw1ODI2Miw1ODI2Myw1ODI2NCw1ODI2NSw1ODI2Niw1ODI2Nyw1ODI2OCw1ODI2OSw1ODI3MCw1ODI3MSw1ODI3Miw1ODI3Myw1ODI3NCw1ODI3NSw1ODI3Niw1ODI3Nyw1ODI3OCw1ODI3OSw1ODI4MCw1ODI4MSw1ODI4Miw1ODI4Myw0MDYxOSw0MDYyMCw0MDYyMSw0MDYyMiw0MDYyMyw0MDYyNCw0MDYyNSw0MDYyNiw0MDYyNyw0MDYyOSw0MDYzMCw0MDYzMSw0MDYzMyw0MDYzNCw0MDYzNiw0MDYzOSw0MDY0MCw0MDY0MSw0MDY0Miw0MDY0Myw0MDY0NSw0MDY0Niw0MDY0Nyw0MDY0OCw0MDY1MCw0MDY1MSw0MDY1Miw0MDY1Niw0MDY1OCw0MDY1OSw0MDY2MSw0MDY2Miw0MDY2Myw0MDY2NSw0MDY2Niw0MDY3MCw0MDY3Myw0MDY3NSw0MDY3Niw0MDY3OCw0MDY4MCw0MDY4Myw0MDY4NCw0MDY4NSw0MDY4Niw0MDY4OCw0MDY4OSw0MDY5MCw0MDY5MSw0MDY5Miw0MDY5Myw0MDY5NCw0MDY5NSw0MDY5Niw0MDY5OCw0MDcwMSw0MDcwMyw0MDcwNCw0MDcwNSw0MDcwNiw0MDcwNyw0MDcwOCw0MDcwOSw0MDcxMCw0MDcxMSw0MDcxMiw0MDcxMyw0MDcxNCw0MDcxNiw0MDcxOSw0MDcyMSw0MDcyMiw0MDcyNCw0MDcyNSw0MDcyNiw0MDcyOCw0MDczMCw0MDczMSw0MDczMiw0MDczMyw0MDczNCw0MDczNSw0MDczNyw0MDczOSw0MDc0MCw0MDc0MSw0MDc0Miw0MDc0Myw0MDc0NCw0MDc0NSw0MDc0Niw0MDc0Nyw0MDc0OSw0MDc1MCw0MDc1Miw0MDc1Myw1ODI4NCw1ODI4NSw1ODI4Niw1ODI4Nyw1ODI4OCw1ODI4OSw1ODI5MCw1ODI5MSw1ODI5Miw1ODI5Myw1ODI5NCw1ODI5NSw1ODI5Niw1ODI5Nyw1ODI5OCw1ODI5OSw1ODMwMCw1ODMwMSw1ODMwMiw1ODMwMyw1ODMwNCw1ODMwNSw1ODMwNiw1ODMwNyw1ODMwOCw1ODMwOSw1ODMxMCw1ODMxMSw1ODMxMiw1ODMxMyw1ODMxNCw1ODMxNSw1ODMxNiw1ODMxNyw1ODMxOCw1ODMxOSw1ODMyMCw1ODMyMSw1ODMyMiw1ODMyMyw1ODMyNCw1ODMyNSw1ODMyNiw1ODMyNyw1ODMyOCw1ODMyOSw1ODMzMCw1ODMzMSw1ODMzMiw1ODMzMyw1ODMzNCw1ODMzNSw1ODMzNiw1ODMzNyw1ODMzOCw1ODMzOSw1ODM0MCw1ODM0MSw1ODM0Miw1ODM0Myw1ODM0NCw1ODM0NSw1ODM0Niw1ODM0Nyw1ODM0OCw1ODM0OSw1ODM1MCw1ODM1MSw1ODM1Miw1ODM1Myw1ODM1NCw1ODM1NSw1ODM1Niw1ODM1Nyw1ODM1OCw1ODM1OSw1ODM2MCw1ODM2MSw1ODM2Miw1ODM2Myw1ODM2NCw1ODM2NSw1ODM2Niw1ODM2Nyw1ODM2OCw1ODM2OSw1ODM3MCw1ODM3MSw1ODM3Miw1ODM3Myw1ODM3NCw1ODM3NSw1ODM3Niw1ODM3Nyw0MDc1NCw0MDc1NSw0MDc1Niw0MDc1Nyw0MDc1OCw0MDc2MCw0MDc2Miw0MDc2NCw0MDc2Nyw0MDc2OCw0MDc2OSw0MDc3MCw0MDc3MSw0MDc3Myw0MDc3NCw0MDc3NSw0MDc3Niw0MDc3Nyw0MDc3OCw0MDc3OSw0MDc4MCw0MDc4MSw0MDc4Miw0MDc4Myw0MDc4Niw0MDc4Nyw0MDc4OCw0MDc4OSw0MDc5MCw0MDc5MSw0MDc5Miw0MDc5Myw0MDc5NCw0MDc5NSw0MDc5Niw0MDc5Nyw0MDc5OCw0MDc5OSw0MDgwMCw0MDgwMSw0MDgwMiw0MDgwMyw0MDgwNCw0MDgwNSw0MDgwNiw0MDgwNyw0MDgwOCw0MDgwOSw0MDgxMCw0MDgxMSw0MDgxMiw0MDgxMyw0MDgxNCw0MDgxNSw0MDgxNiw0MDgxNyw0MDgxOCw0MDgxOSw0MDgyMCw0MDgyMSw0MDgyMiw0MDgyMyw0MDgyNCw0MDgyNSw0MDgyNiw0MDgyNyw0MDgyOCw0MDgyOSw0MDgzMCw0MDgzMyw0MDgzNCw0MDg0NSw0MDg0Niw0MDg0Nyw0MDg0OCw0MDg0OSw0MDg1MCw0MDg1MSw0MDg1Miw0MDg1Myw0MDg1NCw0MDg1NSw0MDg1Niw0MDg2MCw0MDg2MSw0MDg2Miw0MDg2NSw0MDg2Niw0MDg2Nyw0MDg2OCw0MDg2OSw2Mzc4OCw2Mzg2NSw2Mzg5Myw2Mzk3NSw2Mzk4NSw1ODM3OCw1ODM3OSw1ODM4MCw1ODM4MSw1ODM4Miw1ODM4Myw1ODM4NCw1ODM4NSw1ODM4Niw1ODM4Nyw1ODM4OCw1ODM4OSw1ODM5MCw1ODM5MSw1ODM5Miw1ODM5Myw1ODM5NCw1ODM5NSw1ODM5Niw1ODM5Nyw1ODM5OCw1ODM5OSw1ODQwMCw1ODQwMSw1ODQwMiw1ODQwMyw1ODQwNCw1ODQwNSw1ODQwNiw1ODQwNyw1ODQwOCw1ODQwOSw1ODQxMCw1ODQxMSw1ODQxMiw1ODQxMyw1ODQxNCw1ODQxNSw1ODQxNiw1ODQxNyw1ODQxOCw1ODQxOSw1ODQyMCw1ODQyMSw1ODQyMiw1ODQyMyw1ODQyNCw1ODQyNSw1ODQyNiw1ODQyNyw1ODQyOCw1ODQyOSw1ODQzMCw1ODQzMSw1ODQzMiw1ODQzMyw1ODQzNCw1ODQzNSw1ODQzNiw1ODQzNyw1ODQzOCw1ODQzOSw1ODQ0MCw1ODQ0MSw1ODQ0Miw1ODQ0Myw1ODQ0NCw1ODQ0NSw1ODQ0Niw1ODQ0Nyw1ODQ0OCw1ODQ0OSw1ODQ1MCw1ODQ1MSw1ODQ1Miw1ODQ1Myw1ODQ1NCw1ODQ1NSw1ODQ1Niw1ODQ1Nyw1ODQ1OCw1ODQ1OSw1ODQ2MCw1ODQ2MSw1ODQ2Miw1ODQ2Myw1ODQ2NCw1ODQ2NSw1ODQ2Niw1ODQ2Nyw1ODQ2OCw1ODQ2OSw1ODQ3MCw1ODQ3MSw2NDAxMiw2NDAxMyw2NDAxNCw2NDAxNSw2NDAxNyw2NDAxOSw2NDAyMCw2NDAyNCw2NDAzMSw2NDAzMiw2NDAzMyw2NDAzNSw2NDAzNiw2NDAzOSw2NDA0MCw2NDA0MSwxMTkwNSw1OTQxNCw1OTQxNSw1OTQxNiwxMTkwOCwxMzQyNywxMzM4MywxMTkxMiwxMTkxNSw1OTQyMiwxMzcyNiwxMzg1MCwxMzgzOCwxMTkxNiwxMTkyNywxNDcwMiwxNDYxNiw1OTQzMCwxNDc5OSwxNDgxNSwxNDk2MywxNDgwMCw1OTQzNSw1OTQzNiwxNTE4MiwxNTQ3MCwxNTU4NCwxMTk0Myw1OTQ0MSw1OTQ0MiwxMTk0NiwxNjQ3MCwxNjczNSwxMTk1MCwxNzIwNywxMTk1NSwxMTk1OCwxMTk1OSw1OTQ1MSwxNzMyOSwxNzMyNCwxMTk2MywxNzM3MywxNzYyMiwxODAxNywxNzk5Niw1OTQ1OSwxODIxMSwxODIxNywxODMwMCwxODMxNywxMTk3OCwxODc1OSwxODgxMCwxODgxMywxODgxOCwxODgxOSwxODgyMSwxODgyMiwxODg0NywxODg0MywxODg3MSwxODg3MCw1OTQ3Niw1OTQ3NywxOTYxOSwxOTYxNSwxOTYxNiwxOTYxNywxOTU3NSwxOTYxOCwxOTczMSwxOTczMiwxOTczMywxOTczNCwxOTczNSwxOTczNiwxOTczNywxOTg4Niw1OTQ5Miw1ODQ3Miw1ODQ3Myw1ODQ3NCw1ODQ3NSw1ODQ3Niw1ODQ3Nyw1ODQ3OCw1ODQ3OSw1ODQ4MCw1ODQ4MSw1ODQ4Miw1ODQ4Myw1ODQ4NCw1ODQ4NSw1ODQ4Niw1ODQ4Nyw1ODQ4OCw1ODQ4OSw1ODQ5MCw1ODQ5MSw1ODQ5Miw1ODQ5Myw1ODQ5NCw1ODQ5NSw1ODQ5Niw1ODQ5Nyw1ODQ5OCw1ODQ5OSw1ODUwMCw1ODUwMSw1ODUwMiw1ODUwMyw1ODUwNCw1ODUwNSw1ODUwNiw1ODUwNyw1ODUwOCw1ODUwOSw1ODUxMCw1ODUxMSw1ODUxMiw1ODUxMyw1ODUxNCw1ODUxNSw1ODUxNiw1ODUxNyw1ODUxOCw1ODUxOSw1ODUyMCw1ODUyMSw1ODUyMiw1ODUyMyw1ODUyNCw1ODUyNSw1ODUyNiw1ODUyNyw1ODUyOCw1ODUyOSw1ODUzMCw1ODUzMSw1ODUzMiw1ODUzMyw1ODUzNCw1ODUzNSw1ODUzNiw1ODUzNyw1ODUzOCw1ODUzOSw1ODU0MCw1ODU0MSw1ODU0Miw1ODU0Myw1ODU0NCw1ODU0NSw1ODU0Niw1ODU0Nyw1ODU0OCw1ODU0OSw1ODU1MCw1ODU1MSw1ODU1Miw1ODU1Myw1ODU1NCw1ODU1NSw1ODU1Niw1ODU1Nyw1ODU1OCw1ODU1OSw1ODU2MCw1ODU2MSw1ODU2Miw1ODU2Myw1ODU2NCw1ODU2NV0sXG4gIFwiZ2IxODAzMC1yYW5nZXNcIjpbWzAsMTI4XSxbMzYsMTY1XSxbMzgsMTY5XSxbNDUsMTc4XSxbNTAsMTg0XSxbODEsMjE2XSxbODksMjI2XSxbOTUsMjM1XSxbOTYsMjM4XSxbMTAwLDI0NF0sWzEwMywyNDhdLFsxMDQsMjUxXSxbMTA1LDI1M10sWzEwOSwyNThdLFsxMjYsMjc2XSxbMTMzLDI4NF0sWzE0OCwzMDBdLFsxNzIsMzI1XSxbMTc1LDMyOV0sWzE3OSwzMzRdLFsyMDgsMzY0XSxbMzA2LDQ2M10sWzMwNyw0NjVdLFszMDgsNDY3XSxbMzA5LDQ2OV0sWzMxMCw0NzFdLFszMTEsNDczXSxbMzEyLDQ3NV0sWzMxMyw0NzddLFszNDEsNTA2XSxbNDI4LDU5NF0sWzQ0Myw2MTBdLFs1NDQsNzEyXSxbNTQ1LDcxNl0sWzU1OCw3MzBdLFs3NDEsOTMwXSxbNzQyLDkzOF0sWzc0OSw5NjJdLFs3NTAsOTcwXSxbODA1LDEwMjZdLFs4MTksMTEwNF0sWzgyMCwxMTA2XSxbNzkyMiw4MjA5XSxbNzkyNCw4MjE1XSxbNzkyNSw4MjE4XSxbNzkyNyw4MjIyXSxbNzkzNCw4MjMxXSxbNzk0Myw4MjQxXSxbNzk0NCw4MjQ0XSxbNzk0NSw4MjQ2XSxbNzk1MCw4MjUyXSxbODA2Miw4MzY1XSxbODE0OCw4NDUyXSxbODE0OSw4NDU0XSxbODE1Miw4NDU4XSxbODE2NCw4NDcxXSxbODE3NCw4NDgyXSxbODIzNiw4NTU2XSxbODI0MCw4NTcwXSxbODI2Miw4NTk2XSxbODI2NCw4NjAyXSxbODM3NCw4NzEzXSxbODM4MCw4NzIwXSxbODM4MSw4NzIyXSxbODM4NCw4NzI2XSxbODM4OCw4NzMxXSxbODM5MCw4NzM3XSxbODM5Miw4NzQwXSxbODM5Myw4NzQyXSxbODM5NCw4NzQ4XSxbODM5Niw4NzUxXSxbODQwMSw4NzYwXSxbODQwNiw4NzY2XSxbODQxNiw4Nzc3XSxbODQxOSw4NzgxXSxbODQyNCw4Nzg3XSxbODQzNyw4ODAyXSxbODQzOSw4ODA4XSxbODQ0NSw4ODE2XSxbODQ4Miw4ODU0XSxbODQ4NSw4ODU4XSxbODQ5Niw4ODcwXSxbODUyMSw4ODk2XSxbODYwMyw4OTc5XSxbODkzNiw5MzIyXSxbODk0Niw5MzcyXSxbOTA0Niw5NTQ4XSxbOTA1MCw5NTg4XSxbOTA2Myw5NjE2XSxbOTA2Niw5NjIyXSxbOTA3Niw5NjM0XSxbOTA5Miw5NjUyXSxbOTEwMCw5NjYyXSxbOTEwOCw5NjcyXSxbOTExMSw5Njc2XSxbOTExMyw5NjgwXSxbOTEzMSw5NzAyXSxbOTE2Miw5NzM1XSxbOTE2NCw5NzM4XSxbOTIxOCw5NzkzXSxbOTIxOSw5Nzk1XSxbMTEzMjksMTE5MDZdLFsxMTMzMSwxMTkwOV0sWzExMzM0LDExOTEzXSxbMTEzMzYsMTE5MTddLFsxMTM0NiwxMTkyOF0sWzExMzYxLDExOTQ0XSxbMTEzNjMsMTE5NDddLFsxMTM2NiwxMTk1MV0sWzExMzcwLDExOTU2XSxbMTEzNzIsMTE5NjBdLFsxMTM3NSwxMTk2NF0sWzExMzg5LDExOTc5XSxbMTE2ODIsMTIyODRdLFsxMTY4NiwxMjI5Ml0sWzExNjg3LDEyMzEyXSxbMTE2OTIsMTIzMTldLFsxMTY5NCwxMjMzMF0sWzExNzE0LDEyMzUxXSxbMTE3MTYsMTI0MzZdLFsxMTcyMywxMjQ0N10sWzExNzI1LDEyNTM1XSxbMTE3MzAsMTI1NDNdLFsxMTczNiwxMjU4Nl0sWzExOTgyLDEyODQyXSxbMTE5ODksMTI4NTBdLFsxMjEwMiwxMjk2NF0sWzEyMzM2LDEzMjAwXSxbMTIzNDgsMTMyMTVdLFsxMjM1MCwxMzIxOF0sWzEyMzg0LDEzMjUzXSxbMTIzOTMsMTMyNjNdLFsxMjM5NSwxMzI2N10sWzEyMzk3LDEzMjcwXSxbMTI1MTAsMTMzODRdLFsxMjU1MywxMzQyOF0sWzEyODUxLDEzNzI3XSxbMTI5NjIsMTM4MzldLFsxMjk3MywxMzg1MV0sWzEzNzM4LDE0NjE3XSxbMTM4MjMsMTQ3MDNdLFsxMzkxOSwxNDgwMV0sWzEzOTMzLDE0ODE2XSxbMTQwODAsMTQ5NjRdLFsxNDI5OCwxNTE4M10sWzE0NTg1LDE1NDcxXSxbMTQ2OTgsMTU1ODVdLFsxNTU4MywxNjQ3MV0sWzE1ODQ3LDE2NzM2XSxbMTYzMTgsMTcyMDhdLFsxNjQzNCwxNzMyNV0sWzE2NDM4LDE3MzMwXSxbMTY0ODEsMTczNzRdLFsxNjcyOSwxNzYyM10sWzE3MTAyLDE3OTk3XSxbMTcxMjIsMTgwMThdLFsxNzMxNSwxODIxMl0sWzE3MzIwLDE4MjE4XSxbMTc0MDIsMTgzMDFdLFsxNzQxOCwxODMxOF0sWzE3ODU5LDE4NzYwXSxbMTc5MDksMTg4MTFdLFsxNzkxMSwxODgxNF0sWzE3OTE1LDE4ODIwXSxbMTc5MTYsMTg4MjNdLFsxNzkzNiwxODg0NF0sWzE3OTM5LDE4ODQ4XSxbMTc5NjEsMTg4NzJdLFsxODY2NCwxOTU3Nl0sWzE4NzAzLDE5NjIwXSxbMTg4MTQsMTk3MzhdLFsxODk2MiwxOTg4N10sWzE5MDQzLDQwODcwXSxbMzM0NjksNTkyNDRdLFszMzQ3MCw1OTMzNl0sWzMzNDcxLDU5MzY3XSxbMzM0ODQsNTk0MTNdLFszMzQ4NSw1OTQxN10sWzMzNDkwLDU5NDIzXSxbMzM0OTcsNTk0MzFdLFszMzUwMSw1OTQzN10sWzMzNTA1LDU5NDQzXSxbMzM1MTMsNTk0NTJdLFszMzUyMCw1OTQ2MF0sWzMzNTM2LDU5NDc4XSxbMzM1NTAsNTk0OTNdLFszNzg0NSw2Mzc4OV0sWzM3OTIxLDYzODY2XSxbMzc5NDgsNjM4OTRdLFszODAyOSw2Mzk3Nl0sWzM4MDM4LDYzOTg2XSxbMzgwNjQsNjQwMTZdLFszODA2NSw2NDAxOF0sWzM4MDY2LDY0MDIxXSxbMzgwNjksNjQwMjVdLFszODA3NSw2NDAzNF0sWzM4MDc2LDY0MDM3XSxbMzgwNzgsNjQwNDJdLFszOTEwOCw2NTA3NF0sWzM5MTA5LDY1MDkzXSxbMzkxMTMsNjUxMDddLFszOTExNCw2NTExMl0sWzM5MTE1LDY1MTI3XSxbMzkxMTYsNjUxMzJdLFszOTI2NSw2NTM3NV0sWzM5Mzk0LDY1NTEwXSxbMTg5MDAwLDY1NTM2XV0sXG4gIFwiamlzMDIwOFwiOlsxMjI4OCwxMjI4OSwxMjI5MCw2NTI5Miw2NTI5NCwxMjUzOSw2NTMwNiw2NTMwNyw2NTMxMSw2NTI4MSwxMjQ0MywxMjQ0NCwxODAsNjUzNDQsMTY4LDY1MzQyLDY1NTA3LDY1MzQzLDEyNTQxLDEyNTQyLDEyNDQ1LDEyNDQ2LDEyMjkxLDIwMTg5LDEyMjkzLDEyMjk0LDEyMjk1LDEyNTQwLDgyMTMsODIwOCw2NTI5NSw2NTM0MCw2NTM3NCw4NzQxLDY1MzcyLDgyMzAsODIyOSw4MjE2LDgyMTcsODIyMCw4MjIxLDY1Mjg4LDY1Mjg5LDEyMzA4LDEyMzA5LDY1MzM5LDY1MzQxLDY1MzcxLDY1MzczLDEyMjk2LDEyMjk3LDEyMjk4LDEyMjk5LDEyMzAwLDEyMzAxLDEyMzAyLDEyMzAzLDEyMzA0LDEyMzA1LDY1MjkxLDY1MjkzLDE3NywyMTUsMjQ3LDY1MzA5LDg4MDAsNjUzMDgsNjUzMTAsODgwNiw4ODA3LDg3MzQsODc1Niw5Nzk0LDk3OTIsMTc2LDgyNDIsODI0Myw4NDUxLDY1NTA5LDY1Mjg0LDY1NTA0LDY1NTA1LDY1Mjg1LDY1MjgzLDY1Mjg2LDY1MjkwLDY1MzEyLDE2Nyw5NzM0LDk3MzMsOTY3NSw5Njc5LDk2NzgsOTY3MSw5NjcwLDk2MzMsOTYzMiw5NjUxLDk2NTAsOTY2MSw5NjYwLDgyNTEsMTIzMDYsODU5NCw4NTkyLDg1OTMsODU5NSwxMjMwNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODcxMiw4NzE1LDg4MzgsODgzOSw4ODM0LDg4MzUsODc0Niw4NzQ1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NzQzLDg3NDQsNjU1MDYsODY1OCw4NjYwLDg3MDQsODcwNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODczNiw4ODY5LDg5NzgsODcwNiw4NzExLDg4MDEsODc4Niw4ODEwLDg4MTEsODczMCw4NzY1LDg3MzMsODc1Nyw4NzQ3LDg3NDgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NDkxLDgyNDAsOTgzOSw5ODM3LDk4MzQsODIyNCw4MjI1LDE4MixudWxsLG51bGwsbnVsbCxudWxsLDk3MTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTMxMyw2NTMxNCw2NTMxNSw2NTMxNiw2NTMxNyw2NTMxOCw2NTMxOSw2NTMyMCw2NTMyMSw2NTMyMiw2NTMyMyw2NTMyNCw2NTMyNSw2NTMyNiw2NTMyNyw2NTMyOCw2NTMyOSw2NTMzMCw2NTMzMSw2NTMzMiw2NTMzMyw2NTMzNCw2NTMzNSw2NTMzNiw2NTMzNyw2NTMzOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTM0NSw2NTM0Niw2NTM0Nyw2NTM0OCw2NTM0OSw2NTM1MCw2NTM1MSw2NTM1Miw2NTM1Myw2NTM1NCw2NTM1NSw2NTM1Niw2NTM1Nyw2NTM1OCw2NTM1OSw2NTM2MCw2NTM2MSw2NTM2Miw2NTM2Myw2NTM2NCw2NTM2NSw2NTM2Niw2NTM2Nyw2NTM2OCw2NTM2OSw2NTM3MCxudWxsLG51bGwsbnVsbCxudWxsLDEyMzUzLDEyMzU0LDEyMzU1LDEyMzU2LDEyMzU3LDEyMzU4LDEyMzU5LDEyMzYwLDEyMzYxLDEyMzYyLDEyMzYzLDEyMzY0LDEyMzY1LDEyMzY2LDEyMzY3LDEyMzY4LDEyMzY5LDEyMzcwLDEyMzcxLDEyMzcyLDEyMzczLDEyMzc0LDEyMzc1LDEyMzc2LDEyMzc3LDEyMzc4LDEyMzc5LDEyMzgwLDEyMzgxLDEyMzgyLDEyMzgzLDEyMzg0LDEyMzg1LDEyMzg2LDEyMzg3LDEyMzg4LDEyMzg5LDEyMzkwLDEyMzkxLDEyMzkyLDEyMzkzLDEyMzk0LDEyMzk1LDEyMzk2LDEyMzk3LDEyMzk4LDEyMzk5LDEyNDAwLDEyNDAxLDEyNDAyLDEyNDAzLDEyNDA0LDEyNDA1LDEyNDA2LDEyNDA3LDEyNDA4LDEyNDA5LDEyNDEwLDEyNDExLDEyNDEyLDEyNDEzLDEyNDE0LDEyNDE1LDEyNDE2LDEyNDE3LDEyNDE4LDEyNDE5LDEyNDIwLDEyNDIxLDEyNDIyLDEyNDIzLDEyNDI0LDEyNDI1LDEyNDI2LDEyNDI3LDEyNDI4LDEyNDI5LDEyNDMwLDEyNDMxLDEyNDMyLDEyNDMzLDEyNDM0LDEyNDM1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMjQ0OSwxMjQ1MCwxMjQ1MSwxMjQ1MiwxMjQ1MywxMjQ1NCwxMjQ1NSwxMjQ1NiwxMjQ1NywxMjQ1OCwxMjQ1OSwxMjQ2MCwxMjQ2MSwxMjQ2MiwxMjQ2MywxMjQ2NCwxMjQ2NSwxMjQ2NiwxMjQ2NywxMjQ2OCwxMjQ2OSwxMjQ3MCwxMjQ3MSwxMjQ3MiwxMjQ3MywxMjQ3NCwxMjQ3NSwxMjQ3NiwxMjQ3NywxMjQ3OCwxMjQ3OSwxMjQ4MCwxMjQ4MSwxMjQ4MiwxMjQ4MywxMjQ4NCwxMjQ4NSwxMjQ4NiwxMjQ4NywxMjQ4OCwxMjQ4OSwxMjQ5MCwxMjQ5MSwxMjQ5MiwxMjQ5MywxMjQ5NCwxMjQ5NSwxMjQ5NiwxMjQ5NywxMjQ5OCwxMjQ5OSwxMjUwMCwxMjUwMSwxMjUwMiwxMjUwMywxMjUwNCwxMjUwNSwxMjUwNiwxMjUwNywxMjUwOCwxMjUwOSwxMjUxMCwxMjUxMSwxMjUxMiwxMjUxMywxMjUxNCwxMjUxNSwxMjUxNiwxMjUxNywxMjUxOCwxMjUxOSwxMjUyMCwxMjUyMSwxMjUyMiwxMjUyMywxMjUyNCwxMjUyNSwxMjUyNiwxMjUyNywxMjUyOCwxMjUyOSwxMjUzMCwxMjUzMSwxMjUzMiwxMjUzMywxMjUzNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDI1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMTA1LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Niw5NDkyLDk1MDAsOTUxNiw5NTA4LDk1MjQsOTUzMiw5NDczLDk0NzUsOTQ4Nyw5NDkxLDk0OTksOTQ5NSw5NTA3LDk1MjMsOTUxNSw5NTMxLDk1NDcsOTUwNCw5NTE5LDk1MTIsOTUyNyw5NTM1LDk1MDEsOTUyMCw5NTA5LDk1MjgsOTUzOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5MzEyLDkzMTMsOTMxNCw5MzE1LDkzMTYsOTMxNyw5MzE4LDkzMTksOTMyMCw5MzIxLDkzMjIsOTMyMyw5MzI0LDkzMjUsOTMyNiw5MzI3LDkzMjgsOTMyOSw5MzMwLDkzMzEsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1MyxudWxsLDEzMTI5LDEzMDc2LDEzMDkwLDEzMTMzLDEzMDgwLDEzMDk1LDEzMDU5LDEzMTEwLDEzMTM3LDEzMTQzLDEzMDY5LDEzMDk0LDEzMDkxLDEzMDk5LDEzMTMwLDEzMTE1LDEzMjEyLDEzMjEzLDEzMjE0LDEzMTk4LDEzMTk5LDEzMjUyLDEzMjE3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMzE3OSwxMjMxNywxMjMxOSw4NDcwLDEzMjYxLDg0ODEsMTI5NjQsMTI5NjUsMTI5NjYsMTI5NjcsMTI5NjgsMTI4NDksMTI4NTAsMTI4NTcsMTMxODIsMTMxODEsMTMxODAsODc4Niw4ODAxLDg3NDcsODc1MCw4NzIxLDg3MzAsODg2OSw4NzM2LDg3MzUsODg5NSw4NzU3LDg3NDUsODc0NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwMTI0LDIxNzgyLDIzMDQzLDM4NDYzLDIxNjk2LDI0ODU5LDI1Mzg0LDIzMDMwLDM2ODk4LDMzOTA5LDMzNTY0LDMxMzEyLDI0NzQ2LDI1NTY5LDI4MTk3LDI2MDkzLDMzODk0LDMzNDQ2LDM5OTI1LDI2NzcxLDIyMzExLDI2MDE3LDI1MjAxLDIzNDUxLDIyOTkyLDM0NDI3LDM5MTU2LDMyMDk4LDMyMTkwLDM5ODIyLDI1MTEwLDMxOTAzLDM0OTk5LDIzNDMzLDI0MjQ1LDI1MzUzLDI2MjYzLDI2Njk2LDM4MzQzLDM4Nzk3LDI2NDQ3LDIwMTk3LDIwMjM0LDIwMzAxLDIwMzgxLDIwNTUzLDIyMjU4LDIyODM5LDIyOTk2LDIzMDQxLDIzNTYxLDI0Nzk5LDI0ODQ3LDI0OTQ0LDI2MTMxLDI2ODg1LDI4ODU4LDMwMDMxLDMwMDY0LDMxMjI3LDMyMTczLDMyMjM5LDMyOTYzLDMzODA2LDM0OTE1LDM1NTg2LDM2OTQ5LDM2OTg2LDIxMzA3LDIwMTE3LDIwMTMzLDIyNDk1LDMyOTQ2LDM3MDU3LDMwOTU5LDE5OTY4LDIyNzY5LDI4MzIyLDM2OTIwLDMxMjgyLDMzNTc2LDMzNDE5LDM5OTgzLDIwODAxLDIxMzYwLDIxNjkzLDIxNzI5LDIyMjQwLDIzMDM1LDI0MzQxLDM5MTU0LDI4MTM5LDMyOTk2LDM0MDkzLDM4NDk4LDM4NTEyLDM4NTYwLDM4OTA3LDIxNTE1LDIxNDkxLDIzNDMxLDI4ODc5LDMyNzAxLDM2ODAyLDM4NjMyLDIxMzU5LDQwMjg0LDMxNDE4LDE5OTg1LDMwODY3LDMzMjc2LDI4MTk4LDIyMDQwLDIxNzY0LDI3NDIxLDM0MDc0LDM5OTk1LDIzMDEzLDIxNDE3LDI4MDA2LDI5OTE2LDM4Mjg3LDIyMDgyLDIwMTEzLDM2OTM5LDM4NjQyLDMzNjE1LDM5MTgwLDIxNDczLDIxOTQyLDIzMzQ0LDI0NDMzLDI2MTQ0LDI2MzU1LDI2NjI4LDI3NzA0LDI3ODkxLDI3OTQ1LDI5Nzg3LDMwNDA4LDMxMzEwLDM4OTY0LDMzNTIxLDM0OTA3LDM1NDI0LDM3NjEzLDI4MDgyLDMwMTIzLDMwNDEwLDM5MzY1LDI0NzQyLDM1NTg1LDM2MjM0LDM4MzIyLDI3MDIyLDIxNDIxLDIwODcwLDIyMjkwLDIyNTc2LDIyODUyLDIzNDc2LDI0MzEwLDI0NjE2LDI1NTEzLDI1NTg4LDI3ODM5LDI4NDM2LDI4ODE0LDI4OTQ4LDI5MDE3LDI5MTQxLDI5NTAzLDMyMjU3LDMzMzk4LDMzNDg5LDM0MTk5LDM2OTYwLDM3NDY3LDQwMjE5LDIyNjMzLDI2MDQ0LDI3NzM4LDI5OTg5LDIwOTg1LDIyODMwLDIyODg1LDI0NDQ4LDI0NTQwLDI1Mjc2LDI2MTA2LDI3MTc4LDI3NDMxLDI3NTcyLDI5NTc5LDMyNzA1LDM1MTU4LDQwMjM2LDQwMjA2LDQwNjQ0LDIzNzEzLDI3Nzk4LDMzNjU5LDIwNzQwLDIzNjI3LDI1MDE0LDMzMjIyLDI2NzQyLDI5MjgxLDIwMDU3LDIwNDc0LDIxMzY4LDI0NjgxLDI4MjAxLDMxMzExLDM4ODk5LDE5OTc5LDIxMjcwLDIwMjA2LDIwMzA5LDIwMjg1LDIwMzg1LDIwMzM5LDIxMTUyLDIxNDg3LDIyMDI1LDIyNzk5LDIzMjMzLDIzNDc4LDIzNTIxLDMxMTg1LDI2MjQ3LDI2NTI0LDI2NTUwLDI3NDY4LDI3ODI3LDI4Nzc5LDI5NjM0LDMxMTE3LDMxMTY2LDMxMjkyLDMxNjIzLDMzNDU3LDMzNDk5LDMzNTQwLDMzNjU1LDMzNzc1LDMzNzQ3LDM0NjYyLDM1NTA2LDIyMDU3LDM2MDA4LDM2ODM4LDM2OTQyLDM4Njg2LDM0NDQyLDIwNDIwLDIzNzg0LDI1MTA1LDI5MjczLDMwMDExLDMzMjUzLDMzNDY5LDM0NTU4LDM2MDMyLDM4NTk3LDM5MTg3LDM5MzgxLDIwMTcxLDIwMjUwLDM1Mjk5LDIyMjM4LDIyNjAyLDIyNzMwLDI0MzE1LDI0NTU1LDI0NjE4LDI0NzI0LDI0Njc0LDI1MDQwLDI1MTA2LDI1Mjk2LDI1OTEzLDM5NzQ1LDI2MjE0LDI2ODAwLDI4MDIzLDI4Nzg0LDMwMDI4LDMwMzQyLDMyMTE3LDMzNDQ1LDM0ODA5LDM4MjgzLDM4NTQyLDM1OTk3LDIwOTc3LDIxMTgyLDIyODA2LDIxNjgzLDIzNDc1LDIzODMwLDI0OTM2LDI3MDEwLDI4MDc5LDMwODYxLDMzOTk1LDM0OTAzLDM1NDQyLDM3Nzk5LDM5NjA4LDI4MDEyLDM5MzM2LDM0NTIxLDIyNDM1LDI2NjIzLDM0NTEwLDM3MzkwLDIxMTIzLDIyMTUxLDIxNTA4LDI0Mjc1LDI1MzEzLDI1Nzg1LDI2Njg0LDI2NjgwLDI3NTc5LDI5NTU0LDMwOTA2LDMxMzM5LDM1MjI2LDM1MjgyLDM2MjAzLDM2NjExLDM3MTAxLDM4MzA3LDM4NTQ4LDM4NzYxLDIzMzk4LDIzNzMxLDI3MDA1LDM4OTg5LDM4OTkwLDI1NDk5LDMxNTIwLDI3MTc5LDI3MjYzLDI2ODA2LDM5OTQ5LDI4NTExLDIxMTA2LDIxOTE3LDI0Njg4LDI1MzI0LDI3OTYzLDI4MTY3LDI4MzY5LDMzODgzLDM1MDg4LDM2Njc2LDE5OTg4LDM5OTkzLDIxNDk0LDI2OTA3LDI3MTk0LDM4Nzg4LDI2NjY2LDIwODI4LDMxNDI3LDMzOTcwLDM3MzQwLDM3NzcyLDIyMTA3LDQwMjMyLDI2NjU4LDMzNTQxLDMzODQxLDMxOTA5LDIxMDAwLDMzNDc3LDI5OTI2LDIwMDk0LDIwMzU1LDIwODk2LDIzNTA2LDIxMDAyLDIxMjA4LDIxMjIzLDI0MDU5LDIxOTE0LDIyNTcwLDIzMDE0LDIzNDM2LDIzNDQ4LDIzNTE1LDI0MTc4LDI0MTg1LDI0NzM5LDI0ODYzLDI0OTMxLDI1MDIyLDI1NTYzLDI1OTU0LDI2NTc3LDI2NzA3LDI2ODc0LDI3NDU0LDI3NDc1LDI3NzM1LDI4NDUwLDI4NTY3LDI4NDg1LDI5ODcyLDI5OTc2LDMwNDM1LDMwNDc1LDMxNDg3LDMxNjQ5LDMxNzc3LDMyMjMzLDMyNTY2LDMyNzUyLDMyOTI1LDMzMzgyLDMzNjk0LDM1MjUxLDM1NTMyLDM2MDExLDM2OTk2LDM3OTY5LDM4MjkxLDM4Mjg5LDM4MzA2LDM4NTAxLDM4ODY3LDM5MjA4LDMzMzA0LDIwMDI0LDIxNTQ3LDIzNzM2LDI0MDEyLDI5NjA5LDMwMjg0LDMwNTI0LDIzNzIxLDMyNzQ3LDM2MTA3LDM4NTkzLDM4OTI5LDM4OTk2LDM5MDAwLDIwMjI1LDIwMjM4LDIxMzYxLDIxOTE2LDIyMTIwLDIyNTIyLDIyODU1LDIzMzA1LDIzNDkyLDIzNjk2LDI0MDc2LDI0MTkwLDI0NTI0LDI1NTgyLDI2NDI2LDI2MDcxLDI2MDgyLDI2Mzk5LDI2ODI3LDI2ODIwLDI3MjMxLDI0MTEyLDI3NTg5LDI3NjcxLDI3NzczLDMwMDc5LDMxMDQ4LDIzMzk1LDMxMjMyLDMyMDAwLDI0NTA5LDM1MjE1LDM1MzUyLDM2MDIwLDM2MjE1LDM2NTU2LDM2NjM3LDM5MTM4LDM5NDM4LDM5NzQwLDIwMDk2LDIwNjA1LDIwNzM2LDIyOTMxLDIzNDUyLDI1MTM1LDI1MjE2LDI1ODM2LDI3NDUwLDI5MzQ0LDMwMDk3LDMxMDQ3LDMyNjgxLDM0ODExLDM1NTE2LDM1Njk2LDI1NTE2LDMzNzM4LDM4ODE2LDIxNTEzLDIxNTA3LDIxOTMxLDI2NzA4LDI3MjI0LDM1NDQwLDMwNzU5LDI2NDg1LDQwNjUzLDIxMzY0LDIzNDU4LDMzMDUwLDM0Mzg0LDM2ODcwLDE5OTkyLDIwMDM3LDIwMTY3LDIwMjQxLDIxNDUwLDIxNTYwLDIzNDcwLDI0MzM5LDI0NjEzLDI1OTM3LDI2NDI5LDI3NzE0LDI3NzYyLDI3ODc1LDI4NzkyLDI5Njk5LDMxMzUwLDMxNDA2LDMxNDk2LDMyMDI2LDMxOTk4LDMyMTAyLDI2MDg3LDI5Mjc1LDIxNDM1LDIzNjIxLDI0MDQwLDI1Mjk4LDI1MzEyLDI1MzY5LDI4MTkyLDM0Mzk0LDM1Mzc3LDM2MzE3LDM3NjI0LDI4NDE3LDMxMTQyLDM5NzcwLDIwMTM2LDIwMTM5LDIwMTQwLDIwMzc5LDIwMzg0LDIwNjg5LDIwODA3LDMxNDc4LDIwODQ5LDIwOTgyLDIxMzMyLDIxMjgxLDIxMzc1LDIxNDgzLDIxOTMyLDIyNjU5LDIzNzc3LDI0Mzc1LDI0Mzk0LDI0NjIzLDI0NjU2LDI0Njg1LDI1Mzc1LDI1OTQ1LDI3MjExLDI3ODQxLDI5Mzc4LDI5NDIxLDMwNzAzLDMzMDE2LDMzMDI5LDMzMjg4LDM0MTI2LDM3MTExLDM3ODU3LDM4OTExLDM5MjU1LDM5NTE0LDIwMjA4LDIwOTU3LDIzNTk3LDI2MjQxLDI2OTg5LDIzNjE2LDI2MzU0LDI2OTk3LDI5NTc3LDI2NzA0LDMxODczLDIwNjc3LDIxMjIwLDIyMzQzLDI0MDYyLDM3NjcwLDI2MDIwLDI3NDI3LDI3NDUzLDI5NzQ4LDMxMTA1LDMxMTY1LDMxNTYzLDMyMjAyLDMzNDY1LDMzNzQwLDM0OTQzLDM1MTY3LDM1NjQxLDM2ODE3LDM3MzI5LDIxNTM1LDM3NTA0LDIwMDYxLDIwNTM0LDIxNDc3LDIxMzA2LDI5Mzk5LDI5NTkwLDMwNjk3LDMzNTEwLDM2NTI3LDM5MzY2LDM5MzY4LDM5Mzc4LDIwODU1LDI0ODU4LDM0Mzk4LDIxOTM2LDMxMzU0LDIwNTk4LDIzNTA3LDM2OTM1LDM4NTMzLDIwMDE4LDI3MzU1LDM3MzUxLDIzNjMzLDIzNjI0LDI1NDk2LDMxMzkxLDI3Nzk1LDM4NzcyLDM2NzA1LDMxNDAyLDI5MDY2LDM4NTM2LDMxODc0LDI2NjQ3LDMyMzY4LDI2NzA1LDM3NzQwLDIxMjM0LDIxNTMxLDM0MjE5LDM1MzQ3LDMyNjc2LDM2NTU3LDM3MDg5LDIxMzUwLDM0OTUyLDMxMDQxLDIwNDE4LDIwNjcwLDIxMDA5LDIwODA0LDIxODQzLDIyMzE3LDI5Njc0LDIyNDExLDIyODY1LDI0NDE4LDI0NDUyLDI0NjkzLDI0OTUwLDI0OTM1LDI1MDAxLDI1NTIyLDI1NjU4LDI1OTY0LDI2MjIzLDI2NjkwLDI4MTc5LDMwMDU0LDMxMjkzLDMxOTk1LDMyMDc2LDMyMTUzLDMyMzMxLDMyNjE5LDMzNTUwLDMzNjEwLDM0NTA5LDM1MzM2LDM1NDI3LDM1Njg2LDM2NjA1LDM4OTM4LDQwMzM1LDMzNDY0LDM2ODE0LDM5OTEyLDIxMTI3LDI1MTE5LDI1NzMxLDI4NjA4LDM4NTUzLDI2Njg5LDIwNjI1LDI3NDI0LDI3NzcwLDI4NTAwLDMxMzQ4LDMyMDgwLDM0ODgwLDM1MzYzLDI2Mzc2LDIwMjE0LDIwNTM3LDIwNTE4LDIwNTgxLDIwODYwLDIxMDQ4LDIxMDkxLDIxOTI3LDIyMjg3LDIyNTMzLDIzMjQ0LDI0MzE0LDI1MDEwLDI1MDgwLDI1MzMxLDI1NDU4LDI2OTA4LDI3MTc3LDI5MzA5LDI5MzU2LDI5NDg2LDMwNzQwLDMwODMxLDMyMTIxLDMwNDc2LDMyOTM3LDM1MjExLDM1NjA5LDM2MDY2LDM2NTYyLDM2OTYzLDM3NzQ5LDM4NTIyLDM4OTk3LDM5NDQzLDQwNTY4LDIwODAzLDIxNDA3LDIxNDI3LDI0MTg3LDI0MzU4LDI4MTg3LDI4MzA0LDI5NTcyLDI5Njk0LDMyMDY3LDMzMzM1LDM1MzI4LDM1NTc4LDM4NDgwLDIwMDQ2LDIwNDkxLDIxNDc2LDIxNjI4LDIyMjY2LDIyOTkzLDIzMzk2LDI0MDQ5LDI0MjM1LDI0MzU5LDI1MTQ0LDI1OTI1LDI2NTQzLDI4MjQ2LDI5MzkyLDMxOTQ2LDM0OTk2LDMyOTI5LDMyOTkzLDMzNzc2LDM0MzgyLDM1NDYzLDM2MzI4LDM3NDMxLDM4NTk5LDM5MDE1LDQwNzIzLDIwMTE2LDIwMTE0LDIwMjM3LDIxMzIwLDIxNTc3LDIxNTY2LDIzMDg3LDI0NDYwLDI0NDgxLDI0NzM1LDI2NzkxLDI3Mjc4LDI5Nzg2LDMwODQ5LDM1NDg2LDM1NDkyLDM1NzAzLDM3MjY0LDIwMDYyLDM5ODgxLDIwMTMyLDIwMzQ4LDIwMzk5LDIwNTA1LDIwNTAyLDIwODA5LDIwODQ0LDIxMTUxLDIxMTc3LDIxMjQ2LDIxNDAyLDIxNDc1LDIxNTIxLDIxNTE4LDIxODk3LDIyMzUzLDIyNDM0LDIyOTA5LDIzMzgwLDIzMzg5LDIzNDM5LDI0MDM3LDI0MDM5LDI0MDU1LDI0MTg0LDI0MTk1LDI0MjE4LDI0MjQ3LDI0MzQ0LDI0NjU4LDI0OTA4LDI1MjM5LDI1MzA0LDI1NTExLDI1OTE1LDI2MTE0LDI2MTc5LDI2MzU2LDI2NDc3LDI2NjU3LDI2Nzc1LDI3MDgzLDI3NzQzLDI3OTQ2LDI4MDA5LDI4MjA3LDI4MzE3LDMwMDAyLDMwMzQzLDMwODI4LDMxMjk1LDMxOTY4LDMyMDA1LDMyMDI0LDMyMDk0LDMyMTc3LDMyNzg5LDMyNzcxLDMyOTQzLDMyOTQ1LDMzMTA4LDMzMTY3LDMzMzIyLDMzNjE4LDM0ODkyLDM0OTEzLDM1NjExLDM2MDAyLDM2MDkyLDM3MDY2LDM3MjM3LDM3NDg5LDMwNzgzLDM3NjI4LDM4MzA4LDM4NDc3LDM4OTE3LDM5MzIxLDM5NjQwLDQwMjUxLDIxMDgzLDIxMTYzLDIxNDk1LDIxNTEyLDIyNzQxLDI1MzM1LDI4NjQwLDM1OTQ2LDM2NzAzLDQwNjMzLDIwODExLDIxMDUxLDIxNTc4LDIyMjY5LDMxMjk2LDM3MjM5LDQwMjg4LDQwNjU4LDI5NTA4LDI4NDI1LDMzMTM2LDI5OTY5LDI0NTczLDI0Nzk0LDM5NTkyLDI5NDAzLDM2Nzk2LDI3NDkyLDM4OTE1LDIwMTcwLDIyMjU2LDIyMzcyLDIyNzE4LDIzMTMwLDI0NjgwLDI1MDMxLDI2MTI3LDI2MTE4LDI2NjgxLDI2ODAxLDI4MTUxLDMwMTY1LDMyMDU4LDMzMzkwLDM5NzQ2LDIwMTIzLDIwMzA0LDIxNDQ5LDIxNzY2LDIzOTE5LDI0MDM4LDI0MDQ2LDI2NjE5LDI3ODAxLDI5ODExLDMwNzIyLDM1NDA4LDM3NzgyLDM1MDM5LDIyMzUyLDI0MjMxLDI1Mzg3LDIwNjYxLDIwNjUyLDIwODc3LDI2MzY4LDIxNzA1LDIyNjIyLDIyOTcxLDIzNDcyLDI0NDI1LDI1MTY1LDI1NTA1LDI2Njg1LDI3NTA3LDI4MTY4LDI4Nzk3LDM3MzE5LDI5MzEyLDMwNzQxLDMwNzU4LDMxMDg1LDI1OTk4LDMyMDQ4LDMzNzU2LDM1MDA5LDM2NjE3LDM4NTU1LDIxMDkyLDIyMzEyLDI2NDQ4LDMyNjE4LDM2MDAxLDIwOTE2LDIyMzM4LDM4NDQyLDIyNTg2LDI3MDE4LDMyOTQ4LDIxNjgyLDIzODIyLDIyNTI0LDMwODY5LDQwNDQyLDIwMzE2LDIxMDY2LDIxNjQzLDI1NjYyLDI2MTUyLDI2Mzg4LDI2NjEzLDMxMzY0LDMxNTc0LDMyMDM0LDM3Njc5LDI2NzE2LDM5ODUzLDMxNTQ1LDIxMjczLDIwODc0LDIxMDQ3LDIzNTE5LDI1MzM0LDI1Nzc0LDI1ODMwLDI2NDEzLDI3NTc4LDM0MjE3LDM4NjA5LDMwMzUyLDM5ODk0LDI1NDIwLDM3NjM4LDM5ODUxLDMwMzk5LDI2MTk0LDE5OTc3LDIwNjMyLDIxNDQyLDIzNjY1LDI0ODA4LDI1NzQ2LDI1OTU1LDI2NzE5LDI5MTU4LDI5NjQyLDI5OTg3LDMxNjM5LDMyMzg2LDM0NDUzLDM1NzE1LDM2MDU5LDM3MjQwLDM5MTg0LDI2MDI4LDI2MjgzLDI3NTMxLDIwMTgxLDIwMTgwLDIwMjgyLDIwMzUxLDIxMDUwLDIxNDk2LDIxNDkwLDIxOTg3LDIyMjM1LDIyNzYzLDIyOTg3LDIyOTg1LDIzMDM5LDIzMzc2LDIzNjI5LDI0MDY2LDI0MTA3LDI0NTM1LDI0NjA1LDI1MzUxLDI1OTAzLDIzMzg4LDI2MDMxLDI2MDQ1LDI2MDg4LDI2NTI1LDI3NDkwLDI3NTE1LDI3NjYzLDI5NTA5LDMxMDQ5LDMxMTY5LDMxOTkyLDMyMDI1LDMyMDQzLDMyOTMwLDMzMDI2LDMzMjY3LDM1MjIyLDM1NDIyLDM1NDMzLDM1NDMwLDM1NDY4LDM1NTY2LDM2MDM5LDM2MDYwLDM4NjA0LDM5MTY0LDI3NTAzLDIwMTA3LDIwMjg0LDIwMzY1LDIwODE2LDIzMzgzLDIzNTQ2LDI0OTA0LDI1MzQ1LDI2MTc4LDI3NDI1LDI4MzYzLDI3ODM1LDI5MjQ2LDI5ODg1LDMwMTY0LDMwOTEzLDMxMDM0LDMyNzgwLDMyODE5LDMzMjU4LDMzOTQwLDM2NzY2LDI3NzI4LDQwNTc1LDI0MzM1LDM1NjcyLDQwMjM1LDMxNDgyLDM2NjAwLDIzNDM3LDM4NjM1LDE5OTcxLDIxNDg5LDIyNTE5LDIyODMzLDIzMjQxLDIzNDYwLDI0NzEzLDI4Mjg3LDI4NDIyLDMwMTQyLDM2MDc0LDIzNDU1LDM0MDQ4LDMxNzEyLDIwNTk0LDI2NjEyLDMzNDM3LDIzNjQ5LDM0MTIyLDMyMjg2LDMzMjk0LDIwODg5LDIzNTU2LDI1NDQ4LDM2MTk4LDI2MDEyLDI5MDM4LDMxMDM4LDMyMDIzLDMyNzczLDM1NjEzLDM2NTU0LDM2OTc0LDM0NTAzLDM3MDM0LDIwNTExLDIxMjQyLDIzNjEwLDI2NDUxLDI4Nzk2LDI5MjM3LDM3MTk2LDM3MzIwLDM3Njc1LDMzNTA5LDIzNDkwLDI0MzY5LDI0ODI1LDIwMDI3LDIxNDYyLDIzNDMyLDI1MTYzLDI2NDE3LDI3NTMwLDI5NDE3LDI5NjY0LDMxMjc4LDMzMTMxLDM2MjU5LDM3MjAyLDM5MzE4LDIwNzU0LDIxNDYzLDIxNjEwLDIzNTUxLDI1NDgwLDI3MTkzLDMyMTcyLDM4NjU2LDIyMjM0LDIxNDU0LDIxNjA4LDIzNDQ3LDIzNjAxLDI0MDMwLDIwNDYyLDI0ODMzLDI1MzQyLDI3OTU0LDMxMTY4LDMxMTc5LDMyMDY2LDMyMzMzLDMyNzIyLDMzMjYxLDMzMzExLDMzOTM2LDM0ODg2LDM1MTg2LDM1NzI4LDM2NDY4LDM2NjU1LDM2OTEzLDM3MTk1LDM3MjI4LDM4NTk4LDM3Mjc2LDIwMTYwLDIwMzAzLDIwODA1LDIxMzEzLDI0NDY3LDI1MTAyLDI2NTgwLDI3NzEzLDI4MTcxLDI5NTM5LDMyMjk0LDM3MzI1LDM3NTA3LDIxNDYwLDIyODA5LDIzNDg3LDI4MTEzLDMxMDY5LDMyMzAyLDMxODk5LDIyNjU0LDI5MDg3LDIwOTg2LDM0ODk5LDM2ODQ4LDIwNDI2LDIzODAzLDI2MTQ5LDMwNjM2LDMxNDU5LDMzMzA4LDM5NDIzLDIwOTM0LDI0NDkwLDI2MDkyLDI2OTkxLDI3NTI5LDI4MTQ3LDI4MzEwLDI4NTE2LDMwNDYyLDMyMDIwLDI0MDMzLDM2OTgxLDM3MjU1LDM4OTE4LDIwOTY2LDIxMDIxLDI1MTUyLDI2MjU3LDI2MzI5LDI4MTg2LDI0MjQ2LDMyMjEwLDMyNjI2LDI2MzYwLDM0MjIzLDM0Mjk1LDM1NTc2LDIxMTYxLDIxNDY1LDIyODk5LDI0MjA3LDI0NDY0LDI0NjYxLDM3NjA0LDM4NTAwLDIwNjYzLDIwNzY3LDIxMjEzLDIxMjgwLDIxMzE5LDIxNDg0LDIxNzM2LDIxODMwLDIxODA5LDIyMDM5LDIyODg4LDIyOTc0LDIzMTAwLDIzNDc3LDIzNTU4LDIzNTY3LDIzNTY5LDIzNTc4LDI0MTk2LDI0MjAyLDI0Mjg4LDI0NDMyLDI1MjE1LDI1MjIwLDI1MzA3LDI1NDg0LDI1NDYzLDI2MTE5LDI2MTI0LDI2MTU3LDI2MjMwLDI2NDk0LDI2Nzg2LDI3MTY3LDI3MTg5LDI3ODM2LDI4MDQwLDI4MTY5LDI4MjQ4LDI4OTg4LDI4OTY2LDI5MDMxLDMwMTUxLDMwNDY1LDMwODEzLDMwOTc3LDMxMDc3LDMxMjE2LDMxNDU2LDMxNTA1LDMxOTExLDMyMDU3LDMyOTE4LDMzNzUwLDMzOTMxLDM0MTIxLDM0OTA5LDM1MDU5LDM1MzU5LDM1Mzg4LDM1NDEyLDM1NDQzLDM1OTM3LDM2MDYyLDM3Mjg0LDM3NDc4LDM3NzU4LDM3OTEyLDM4NTU2LDM4ODA4LDE5OTc4LDE5OTc2LDE5OTk4LDIwMDU1LDIwODg3LDIxMTA0LDIyNDc4LDIyNTgwLDIyNzMyLDIzMzMwLDI0MTIwLDI0NzczLDI1ODU0LDI2NDY1LDI2NDU0LDI3OTcyLDI5MzY2LDMwMDY3LDMxMzMxLDMzOTc2LDM1Njk4LDM3MzA0LDM3NjY0LDIyMDY1LDIyNTE2LDM5MTY2LDI1MzI1LDI2ODkzLDI3NTQyLDI5MTY1LDMyMzQwLDMyODg3LDMzMzk0LDM1MzAyLDM5MTM1LDM0NjQ1LDM2Nzg1LDIzNjExLDIwMjgwLDIwNDQ5LDIwNDA1LDIxNzY3LDIzMDcyLDIzNTE3LDIzNTI5LDI0NTE1LDI0OTEwLDI1MzkxLDI2MDMyLDI2MTg3LDI2ODYyLDI3MDM1LDI4MDI0LDI4MTQ1LDMwMDAzLDMwMTM3LDMwNDk1LDMxMDcwLDMxMjA2LDMyMDUxLDMzMjUxLDMzNDU1LDM0MjE4LDM1MjQyLDM1Mzg2LDM2NTIzLDM2NzYzLDM2OTE0LDM3MzQxLDM4NjYzLDIwMTU0LDIwMTYxLDIwOTk1LDIyNjQ1LDIyNzY0LDIzNTYzLDI5OTc4LDIzNjEzLDMzMTAyLDM1MzM4LDM2ODA1LDM4NDk5LDM4NzY1LDMxNTI1LDM1NTM1LDM4OTIwLDM3MjE4LDIyMjU5LDIxNDE2LDM2ODg3LDIxNTYxLDIyNDAyLDI0MTAxLDI1NTEyLDI3NzAwLDI4ODEwLDMwNTYxLDMxODgzLDMyNzM2LDM0OTI4LDM2OTMwLDM3MjA0LDM3NjQ4LDM3NjU2LDM4NTQzLDI5NzkwLDM5NjIwLDIzODE1LDIzOTEzLDI1OTY4LDI2NTMwLDM2MjY0LDM4NjE5LDI1NDU0LDI2NDQxLDI2OTA1LDMzNzMzLDM4OTM1LDM4NTkyLDM1MDcwLDI4NTQ4LDI1NzIyLDIzNTQ0LDE5OTkwLDI4NzE2LDMwMDQ1LDI2MTU5LDIwOTMyLDIxMDQ2LDIxMjE4LDIyOTk1LDI0NDQ5LDI0NjE1LDI1MTA0LDI1OTE5LDI1OTcyLDI2MTQzLDI2MjI4LDI2ODY2LDI2NjQ2LDI3NDkxLDI4MTY1LDI5Mjk4LDI5OTgzLDMwNDI3LDMxOTM0LDMyODU0LDIyNzY4LDM1MDY5LDM1MTk5LDM1NDg4LDM1NDc1LDM1NTMxLDM2ODkzLDM3MjY2LDM4NzM4LDM4NzQ1LDI1OTkzLDMxMjQ2LDMzMDMwLDM4NTg3LDI0MTA5LDI0Nzk2LDI1MTE0LDI2MDIxLDI2MTMyLDI2NTEyLDMwNzA3LDMxMzA5LDMxODIxLDMyMzE4LDMzMDM0LDM2MDEyLDM2MTk2LDM2MzIxLDM2NDQ3LDMwODg5LDIwOTk5LDI1MzA1LDI1NTA5LDI1NjY2LDI1MjQwLDM1MzczLDMxMzYzLDMxNjgwLDM1NTAwLDM4NjM0LDMyMTE4LDMzMjkyLDM0NjMzLDIwMTg1LDIwODA4LDIxMzE1LDIxMzQ0LDIzNDU5LDIzNTU0LDIzNTc0LDI0MDI5LDI1MTI2LDI1MTU5LDI1Nzc2LDI2NjQzLDI2Njc2LDI3ODQ5LDI3OTczLDI3OTI3LDI2NTc5LDI4NTA4LDI5MDA2LDI5MDUzLDI2MDU5LDMxMzU5LDMxNjYxLDMyMjE4LDMyMzMwLDMyNjgwLDMzMTQ2LDMzMzA3LDMzMzM3LDM0MjE0LDM1NDM4LDM2MDQ2LDM2MzQxLDM2OTg0LDM2OTgzLDM3NTQ5LDM3NTIxLDM4Mjc1LDM5ODU0LDIxMDY5LDIxODkyLDI4NDcyLDI4OTgyLDIwODQwLDMxMTA5LDMyMzQxLDMzMjAzLDMxOTUwLDIyMDkyLDIyNjA5LDIzNzIwLDI1NTE0LDI2MzY2LDI2MzY1LDI2OTcwLDI5NDAxLDMwMDk1LDMwMDk0LDMwOTkwLDMxMDYyLDMxMTk5LDMxODk1LDMyMDMyLDMyMDY4LDM0MzExLDM1MzgwLDM4NDU5LDM2OTYxLDQwNzM2LDIwNzExLDIxMTA5LDIxNDUyLDIxNDc0LDIwNDg5LDIxOTMwLDIyNzY2LDIyODYzLDI5MjQ1LDIzNDM1LDIzNjUyLDIxMjc3LDI0ODAzLDI0ODE5LDI1NDM2LDI1NDc1LDI1NDA3LDI1NTMxLDI1ODA1LDI2MDg5LDI2MzYxLDI0MDM1LDI3MDg1LDI3MTMzLDI4NDM3LDI5MTU3LDIwMTA1LDMwMTg1LDMwNDU2LDMxMzc5LDMxOTY3LDMyMjA3LDMyMTU2LDMyODY1LDMzNjA5LDMzNjI0LDMzOTAwLDMzOTgwLDM0Mjk5LDM1MDEzLDM2MjA4LDM2ODY1LDM2OTczLDM3NzgzLDM4Njg0LDM5NDQyLDIwNjg3LDIyNjc5LDI0OTc0LDMzMjM1LDM0MTAxLDM2MTA0LDM2ODk2LDIwNDE5LDIwNTk2LDIxMDYzLDIxMzYzLDI0Njg3LDI1NDE3LDI2NDYzLDI4MjA0LDM2Mjc1LDM2ODk1LDIwNDM5LDIzNjQ2LDM2MDQyLDI2MDYzLDMyMTU0LDIxMzMwLDM0OTY2LDIwODU0LDI1NTM5LDIzMzg0LDIzNDAzLDIzNTYyLDI1NjEzLDI2NDQ5LDM2OTU2LDIwMTgyLDIyODEwLDIyODI2LDI3NzYwLDM1NDA5LDIxODIyLDIyNTQ5LDIyOTQ5LDI0ODE2LDI1MTcxLDI2NTYxLDMzMzMzLDI2OTY1LDM4NDY0LDM5MzY0LDM5NDY0LDIwMzA3LDIyNTM0LDIzNTUwLDMyNzg0LDIzNzI5LDI0MTExLDI0NDUzLDI0NjA4LDI0OTA3LDI1MTQwLDI2MzY3LDI3ODg4LDI4MzgyLDMyOTc0LDMzMTUxLDMzNDkyLDM0OTU1LDM2MDI0LDM2ODY0LDM2OTEwLDM4NTM4LDQwNjY3LDM5ODk5LDIwMTk1LDIxNDg4LDIyODIzLDMxNTMyLDM3MjYxLDM4OTg4LDQwNDQxLDI4MzgxLDI4NzExLDIxMzMxLDIxODI4LDIzNDI5LDI1MTc2LDI1MjQ2LDI1Mjk5LDI3ODEwLDI4NjU1LDI5NzMwLDM1MzUxLDM3OTQ0LDI4NjA5LDM1NTgyLDMzNTkyLDIwOTY3LDM0NTUyLDIxNDgyLDIxNDgxLDIwMjk0LDM2OTQ4LDM2Nzg0LDIyODkwLDMzMDczLDI0MDYxLDMxNDY2LDM2Nzk5LDI2ODQyLDM1ODk1LDI5NDMyLDQwMDA4LDI3MTk3LDM1NTA0LDIwMDI1LDIxMzM2LDIyMDIyLDIyMzc0LDI1Mjg1LDI1NTA2LDI2MDg2LDI3NDcwLDI4MTI5LDI4MjUxLDI4ODQ1LDMwNzAxLDMxNDcxLDMxNjU4LDMyMTg3LDMyODI5LDMyOTY2LDM0NTA3LDM1NDc3LDM3NzIzLDIyMjQzLDIyNzI3LDI0MzgyLDI2MDI5LDI2MjYyLDI3MjY0LDI3NTczLDMwMDA3LDM1NTI3LDIwNTE2LDMwNjkzLDIyMzIwLDI0MzQ3LDI0Njc3LDI2MjM0LDI3NzQ0LDMwMTk2LDMxMjU4LDMyNjIyLDMzMjY4LDM0NTg0LDM2OTMzLDM5MzQ3LDMxNjg5LDMwMDQ0LDMxNDgxLDMxNTY5LDMzOTg4LDM2ODgwLDMxMjA5LDMxMzc4LDMzNTkwLDIzMjY1LDMwNTI4LDIwMDEzLDIwMjEwLDIzNDQ5LDI0NTQ0LDI1Mjc3LDI2MTcyLDI2NjA5LDI3ODgwLDM0NDExLDM0OTM1LDM1Mzg3LDM3MTk4LDM3NjE5LDM5Mzc2LDI3MTU5LDI4NzEwLDI5NDgyLDMzNTExLDMzODc5LDM2MDE1LDE5OTY5LDIwODA2LDIwOTM5LDIxODk5LDIzNTQxLDI0MDg2LDI0MTE1LDI0MTkzLDI0MzQwLDI0MzczLDI0NDI3LDI0NTAwLDI1MDc0LDI1MzYxLDI2Mjc0LDI2Mzk3LDI4NTI2LDI5MjY2LDMwMDEwLDMwNTIyLDMyODg0LDMzMDgxLDMzMTQ0LDM0Njc4LDM1NTE5LDM1NTQ4LDM2MjI5LDM2MzM5LDM3NTMwLDM4MjYzLDM4OTE0LDQwMTY1LDIxMTg5LDI1NDMxLDMwNDUyLDI2Mzg5LDI3Nzg0LDI5NjQ1LDM2MDM1LDM3ODA2LDM4NTE1LDI3OTQxLDIyNjg0LDI2ODk0LDI3MDg0LDM2ODYxLDM3Nzg2LDMwMTcxLDM2ODkwLDIyNjE4LDI2NjI2LDI1NTI0LDI3MTMxLDIwMjkxLDI4NDYwLDI2NTg0LDM2Nzk1LDM0MDg2LDMyMTgwLDM3NzE2LDI2OTQzLDI4NTI4LDIyMzc4LDIyNzc1LDIzMzQwLDMyMDQ0LDI5MjI2LDIxNTE0LDM3MzQ3LDQwMzcyLDIwMTQxLDIwMzAyLDIwNTcyLDIwNTk3LDIxMDU5LDM1OTk4LDIxNTc2LDIyNTY0LDIzNDUwLDI0MDkzLDI0MjEzLDI0MjM3LDI0MzExLDI0MzUxLDI0NzE2LDI1MjY5LDI1NDAyLDI1NTUyLDI2Nzk5LDI3NzEyLDMwODU1LDMxMTE4LDMxMjQzLDMyMjI0LDMzMzUxLDM1MzMwLDM1NTU4LDM2NDIwLDM2ODgzLDM3MDQ4LDM3MTY1LDM3MzM2LDQwNzE4LDI3ODc3LDI1Njg4LDI1ODI2LDI1OTczLDI4NDA0LDMwMzQwLDMxNTE1LDM2OTY5LDM3ODQxLDI4MzQ2LDIxNzQ2LDI0NTA1LDI1NzY0LDM2Njg1LDM2ODQ1LDM3NDQ0LDIwODU2LDIyNjM1LDIyODI1LDIzNjM3LDI0MjE1LDI4MTU1LDMyMzk5LDI5OTgwLDM2MDI4LDM2NTc4LDM5MDAzLDI4ODU3LDIwMjUzLDI3NTgzLDI4NTkzLDMwMDAwLDM4NjUxLDIwODE0LDIxNTIwLDIyNTgxLDIyNjE1LDIyOTU2LDIzNjQ4LDI0NDY2LDI2MDA3LDI2NDYwLDI4MTkzLDMwMzMxLDMzNzU5LDM2MDc3LDM2ODg0LDM3MTE3LDM3NzA5LDMwNzU3LDMwNzc4LDIxMTYyLDI0MjMwLDIyMzAzLDIyOTAwLDI0NTk0LDIwNDk4LDIwODI2LDIwOTA4LDIwOTQxLDIwOTkyLDIxNzc2LDIyNjEyLDIyNjE2LDIyODcxLDIzNDQ1LDIzNzk4LDIzOTQ3LDI0NzY0LDI1MjM3LDI1NjQ1LDI2NDgxLDI2NjkxLDI2ODEyLDI2ODQ3LDMwNDIzLDI4MTIwLDI4MjcxLDI4MDU5LDI4NzgzLDI5MTI4LDI0NDAzLDMwMTY4LDMxMDk1LDMxNTYxLDMxNTcyLDMxNTcwLDMxOTU4LDMyMTEzLDIxMDQwLDMzODkxLDM0MTUzLDM0Mjc2LDM1MzQyLDM1NTg4LDM1OTEwLDM2MzY3LDM2ODY3LDM2ODc5LDM3OTEzLDM4NTE4LDM4OTU3LDM5NDcyLDM4MzYwLDIwNjg1LDIxMjA1LDIxNTE2LDIyNTMwLDIzNTY2LDI0OTk5LDI1NzU4LDI3OTM0LDMwNjQzLDMxNDYxLDMzMDEyLDMzNzk2LDM2OTQ3LDM3NTA5LDIzNzc2LDQwMTk5LDIxMzExLDI0NDcxLDI0NDk5LDI4MDYwLDI5MzA1LDMwNTYzLDMxMTY3LDMxNzE2LDI3NjAyLDI5NDIwLDM1NTAxLDI2NjI3LDI3MjMzLDIwOTg0LDMxMzYxLDI2OTMyLDIzNjI2LDQwMTgyLDMzNTE1LDIzNDkzLDM3MTkzLDI4NzAyLDIyMTM2LDIzNjYzLDI0Nzc1LDI1OTU4LDI3Nzg4LDM1OTMwLDM2OTI5LDM4OTMxLDIxNTg1LDI2MzExLDM3Mzg5LDIyODU2LDM3MDI3LDIwODY5LDIwMDQ1LDIwOTcwLDM0MjAxLDM1NTk4LDI4NzYwLDI1NDY2LDM3NzA3LDI2OTc4LDM5MzQ4LDMyMjYwLDMwMDcxLDIxMzM1LDI2OTc2LDM2NTc1LDM4NjI3LDI3NzQxLDIwMTA4LDIzNjEyLDI0MzM2LDM2ODQxLDIxMjUwLDM2MDQ5LDMyOTA1LDM0NDI1LDI0MzE5LDI2MDg1LDIwMDgzLDIwODM3LDIyOTE0LDIzNjE1LDM4ODk0LDIwMjE5LDIyOTIyLDI0NTI1LDM1NDY5LDI4NjQxLDMxMTUyLDMxMDc0LDIzNTI3LDMzOTA1LDI5NDgzLDI5MTA1LDI0MTgwLDI0NTY1LDI1NDY3LDI1NzU0LDI5MTIzLDMxODk2LDIwMDM1LDI0MzE2LDIwMDQzLDIyNDkyLDIyMTc4LDI0NzQ1LDI4NjExLDMyMDEzLDMzMDIxLDMzMDc1LDMzMjE1LDM2Nzg2LDM1MjIzLDM0NDY4LDI0MDUyLDI1MjI2LDI1NzczLDM1MjA3LDI2NDg3LDI3ODc0LDI3OTY2LDI5NzUwLDMwNzcyLDIzMTEwLDMyNjI5LDMzNDUzLDM5MzQwLDIwNDY3LDI0MjU5LDI1MzA5LDI1NDkwLDI1OTQzLDI2NDc5LDMwNDAzLDI5MjYwLDMyOTcyLDMyOTU0LDM2NjQ5LDM3MTk3LDIwNDkzLDIyNTIxLDIzMTg2LDI2NzU3LDI2OTk1LDI5MDI4LDI5NDM3LDM2MDIzLDIyNzcwLDM2MDY0LDM4NTA2LDM2ODg5LDM0Njg3LDMxMjA0LDMwNjk1LDMzODMzLDIwMjcxLDIxMDkzLDIxMzM4LDI1MjkzLDI2NTc1LDI3ODUwLDMwMzMzLDMxNjM2LDMxODkzLDMzMzM0LDM0MTgwLDM2ODQzLDI2MzMzLDI4NDQ4LDI5MTkwLDMyMjgzLDMzNzA3LDM5MzYxLDQwNjE0LDIwOTg5LDMxNjY1LDMwODM0LDMxNjcyLDMyOTAzLDMxNTYwLDI3MzY4LDI0MTYxLDMyOTA4LDMwMDMzLDMwMDQ4LDIwODQzLDM3NDc0LDI4MzAwLDMwMzMwLDM3MjcxLDM5NjU4LDIwMjQwLDMyNjI0LDI1MjQ0LDMxNTY3LDM4MzA5LDQwMTY5LDIyMTM4LDIyNjE3LDM0NTMyLDM4NTg4LDIwMjc2LDIxMDI4LDIxMzIyLDIxNDUzLDIxNDY3LDI0MDcwLDI1NjQ0LDI2MDAxLDI2NDk1LDI3NzEwLDI3NzI2LDI5MjU2LDI5MzU5LDI5Njc3LDMwMDM2LDMyMzIxLDMzMzI0LDM0MjgxLDM2MDA5LDMxNjg0LDM3MzE4LDI5MDMzLDM4OTMwLDM5MTUxLDI1NDA1LDI2MjE3LDMwMDU4LDMwNDM2LDMwOTI4LDM0MTE1LDM0NTQyLDIxMjkwLDIxMzI5LDIxNTQyLDIyOTE1LDI0MTk5LDI0NDQ0LDI0NzU0LDI1MTYxLDI1MjA5LDI1MjU5LDI2MDAwLDI3NjA0LDI3ODUyLDMwMTMwLDMwMzgyLDMwODY1LDMxMTkyLDMyMjAzLDMyNjMxLDMyOTMzLDM0OTg3LDM1NTEzLDM2MDI3LDM2OTkxLDM4NzUwLDM5MTMxLDI3MTQ3LDMxODAwLDIwNjMzLDIzNjE0LDI0NDk0LDI2NTAzLDI3NjA4LDI5NzQ5LDMwNDczLDMyNjU0LDQwNzYzLDI2NTcwLDMxMjU1LDIxMzA1LDMwMDkxLDM5NjYxLDI0NDIyLDMzMTgxLDMzNzc3LDMyOTIwLDI0MzgwLDI0NTE3LDMwMDUwLDMxNTU4LDM2OTI0LDI2NzI3LDIzMDE5LDIzMTk1LDMyMDE2LDMwMzM0LDM1NjI4LDIwNDY5LDI0NDI2LDI3MTYxLDI3NzAzLDI4NDE4LDI5OTIyLDMxMDgwLDM0OTIwLDM1NDEzLDM1OTYxLDI0Mjg3LDI1NTUxLDMwMTQ5LDMxMTg2LDMzNDk1LDM3NjcyLDM3NjE4LDMzOTQ4LDM0NTQxLDM5OTgxLDIxNjk3LDI0NDI4LDI1OTk2LDI3OTk2LDI4NjkzLDM2MDA3LDM2MDUxLDM4OTcxLDI1OTM1LDI5OTQyLDE5OTgxLDIwMTg0LDIyNDk2LDIyODI3LDIzMTQyLDIzNTAwLDIwOTA0LDI0MDY3LDI0MjIwLDI0NTk4LDI1MjA2LDI1OTc1LDI2MDIzLDI2MjIyLDI4MDE0LDI5MjM4LDMxNTI2LDMzMTA0LDMzMTc4LDMzNDMzLDM1Njc2LDM2MDAwLDM2MDcwLDM2MjEyLDM4NDI4LDM4NDY4LDIwMzk4LDI1NzcxLDI3NDk0LDMzMzEwLDMzODg5LDM0MTU0LDM3MDk2LDIzNTUzLDI2OTYzLDM5MDgwLDMzOTE0LDM0MTM1LDIwMjM5LDIxMTAzLDI0NDg5LDI0MTMzLDI2MzgxLDMxMTE5LDMzMTQ1LDM1MDc5LDM1MjA2LDI4MTQ5LDI0MzQzLDI1MTczLDI3ODMyLDIwMTc1LDI5Mjg5LDM5ODI2LDIwOTk4LDIxNTYzLDIyMTMyLDIyNzA3LDI0OTk2LDI1MTk4LDI4OTU0LDIyODk0LDMxODgxLDMxOTY2LDMyMDI3LDM4NjQwLDI1OTkxLDMyODYyLDE5OTkzLDIwMzQxLDIwODUzLDIyNTkyLDI0MTYzLDI0MTc5LDI0MzMwLDI2NTY0LDIwMDA2LDM0MTA5LDM4MjgxLDM4NDkxLDMxODU5LDM4OTEzLDIwNzMxLDIyNzIxLDMwMjk0LDMwODg3LDIxMDI5LDMwNjI5LDM0MDY1LDMxNjIyLDIwNTU5LDIyNzkzLDI5MjU1LDMxNjg3LDMyMjMyLDM2Nzk0LDM2ODIwLDM2OTQxLDIwNDE1LDIxMTkzLDIzMDgxLDI0MzIxLDM4ODI5LDIwNDQ1LDMzMzAzLDM3NjEwLDIyMjc1LDI1NDI5LDI3NDk3LDI5OTk1LDM1MDM2LDM2NjI4LDMxMjk4LDIxMjE1LDIyNjc1LDI0OTE3LDI1MDk4LDI2Mjg2LDI3NTk3LDMxODA3LDMzNzY5LDIwNTE1LDIwNDcyLDIxMjUzLDIxNTc0LDIyNTc3LDIyODU3LDIzNDUzLDIzNzkyLDIzNzkxLDIzODQ5LDI0MjE0LDI1MjY1LDI1NDQ3LDI1OTE4LDI2MDQxLDI2Mzc5LDI3ODYxLDI3ODczLDI4OTIxLDMwNzcwLDMyMjk5LDMyOTkwLDMzNDU5LDMzODA0LDM0MDI4LDM0NTYyLDM1MDkwLDM1MzcwLDM1OTE0LDM3MDMwLDM3NTg2LDM5MTY1LDQwMTc5LDQwMzAwLDIwMDQ3LDIwMTI5LDIwNjIxLDIxMDc4LDIyMzQ2LDIyOTUyLDI0MTI1LDI0NTM2LDI0NTM3LDI1MTUxLDI2MjkyLDI2Mzk1LDI2NTc2LDI2ODM0LDIwODgyLDMyMDMzLDMyOTM4LDMzMTkyLDM1NTg0LDM1OTgwLDM2MDMxLDM3NTAyLDM4NDUwLDIxNTM2LDM4OTU2LDIxMjcxLDIwNjkzLDIxMzQwLDIyNjk2LDI1Nzc4LDI2NDIwLDI5Mjg3LDMwNTY2LDMxMzAyLDM3MzUwLDIxMTg3LDI3ODA5LDI3NTI2LDIyNTI4LDI0MTQwLDIyODY4LDI2NDEyLDMyNzYzLDIwOTYxLDMwNDA2LDI1NzA1LDMwOTUyLDM5NzY0LDQwNjM1LDIyNDc1LDIyOTY5LDI2MTUxLDI2NTIyLDI3NTk4LDIxNzM3LDI3MDk3LDI0MTQ5LDMzMTgwLDI2NTE3LDM5ODUwLDI2NjIyLDQwMDE4LDI2NzE3LDIwMTM0LDIwNDUxLDIxNDQ4LDI1MjczLDI2NDExLDI3ODE5LDM2ODA0LDIwMzk3LDMyMzY1LDQwNjM5LDE5OTc1LDI0OTMwLDI4Mjg4LDI4NDU5LDM0MDY3LDIxNjE5LDI2NDEwLDM5NzQ5LDI0MDUxLDMxNjM3LDIzNzI0LDIzNDk0LDM0NTg4LDI4MjM0LDM0MDAxLDMxMjUyLDMzMDMyLDIyOTM3LDMxODg1LDI3NjY1LDMwNDk2LDIxMjA5LDIyODE4LDI4OTYxLDI5Mjc5LDMwNjgzLDM4Njk1LDQwMjg5LDI2ODkxLDIzMTY3LDIzMDY0LDIwOTAxLDIxNTE3LDIxNjI5LDI2MTI2LDMwNDMxLDM2ODU1LDM3NTI4LDQwMTgwLDIzMDE4LDI5Mjc3LDI4MzU3LDIwODEzLDI2ODI1LDMyMTkxLDMyMjM2LDM4NzU0LDQwNjM0LDI1NzIwLDI3MTY5LDMzNTM4LDIyOTE2LDIzMzkxLDI3NjExLDI5NDY3LDMwNDUwLDMyMTc4LDMyNzkxLDMzOTQ1LDIwNzg2LDI2NDA4LDQwNjY1LDMwNDQ2LDI2NDY2LDIxMjQ3LDM5MTczLDIzNTg4LDI1MTQ3LDMxODcwLDM2MDE2LDIxODM5LDI0NzU4LDMyMDExLDM4MjcyLDIxMjQ5LDIwMDYzLDIwOTE4LDIyODEyLDI5MjQyLDMyODIyLDM3MzI2LDI0MzU3LDMwNjkwLDIxMzgwLDI0NDQxLDMyMDA0LDM0MjIwLDM1Mzc5LDM2NDkzLDM4NzQyLDI2NjExLDM0MjIyLDM3OTcxLDI0ODQxLDI0ODQwLDI3ODMzLDMwMjkwLDM1NTY1LDM2NjY0LDIxODA3LDIwMzA1LDIwNzc4LDIxMTkxLDIxNDUxLDIzNDYxLDI0MTg5LDI0NzM2LDI0OTYyLDI1NTU4LDI2Mzc3LDI2NTg2LDI4MjYzLDI4MDQ0LDI5NDk0LDI5NDk1LDMwMDAxLDMxMDU2LDM1MDI5LDM1NDgwLDM2OTM4LDM3MDA5LDM3MTA5LDM4NTk2LDM0NzAxLDIyODA1LDIwMTA0LDIwMzEzLDE5OTgyLDM1NDY1LDM2NjcxLDM4OTI4LDIwNjUzLDI0MTg4LDIyOTM0LDIzNDgxLDI0MjQ4LDI1NTYyLDI1NTk0LDI1NzkzLDI2MzMyLDI2OTU0LDI3MDk2LDI3OTE1LDI4MzQyLDI5MDc2LDI5OTkyLDMxNDA3LDMyNjUwLDMyNzY4LDMzODY1LDMzOTkzLDM1MjAxLDM1NjE3LDM2MzYyLDM2OTY1LDM4NTI1LDM5MTc4LDI0OTU4LDI1MjMzLDI3NDQyLDI3Nzc5LDI4MDIwLDMyNzE2LDMyNzY0LDI4MDk2LDMyNjQ1LDM0NzQ2LDM1MDY0LDI2NDY5LDMzNzEzLDM4OTcyLDM4NjQ3LDI3OTMxLDMyMDk3LDMzODUzLDM3MjI2LDIwMDgxLDIxMzY1LDIzODg4LDI3Mzk2LDI4NjUxLDM0MjUzLDM0MzQ5LDM1MjM5LDIxMDMzLDIxNTE5LDIzNjUzLDI2NDQ2LDI2NzkyLDI5NzAyLDI5ODI3LDMwMTc4LDM1MDIzLDM1MDQxLDM3MzI0LDM4NjI2LDM4NTIwLDI0NDU5LDI5NTc1LDMxNDM1LDMzODcwLDI1NTA0LDMwMDUzLDIxMTI5LDI3OTY5LDI4MzE2LDI5NzA1LDMwMDQxLDMwODI3LDMxODkwLDM4NTM0LDMxNDUyLDQwODQ1LDIwNDA2LDI0OTQyLDI2MDUzLDM0Mzk2LDIwMTAyLDIwMTQyLDIwNjk4LDIwMDAxLDIwOTQwLDIzNTM0LDI2MDA5LDI2NzUzLDI4MDkyLDI5NDcxLDMwMjc0LDMwNjM3LDMxMjYwLDMxOTc1LDMzMzkxLDM1NTM4LDM2OTg4LDM3MzI3LDM4NTE3LDM4OTM2LDIxMTQ3LDMyMjA5LDIwNTIzLDIxNDAwLDI2NTE5LDI4MTA3LDI5MTM2LDI5NzQ3LDMzMjU2LDM2NjUwLDM4NTYzLDQwMDIzLDQwNjA3LDI5NzkyLDIyNTkzLDI4MDU3LDMyMDQ3LDM5MDA2LDIwMTk2LDIwMjc4LDIwMzYzLDIwOTE5LDIxMTY5LDIzOTk0LDI0NjA0LDI5NjE4LDMxMDM2LDMzNDkxLDM3NDI4LDM4NTgzLDM4NjQ2LDM4NjY2LDQwNTk5LDQwODAyLDI2Mjc4LDI3NTA4LDIxMDE1LDIxMTU1LDI4ODcyLDM1MDEwLDI0MjY1LDI0NjUxLDI0OTc2LDI4NDUxLDI5MDAxLDMxODA2LDMyMjQ0LDMyODc5LDM0MDMwLDM2ODk5LDM3Njc2LDIxNTcwLDM5NzkxLDI3MzQ3LDI4ODA5LDM2MDM0LDM2MzM1LDM4NzA2LDIxMTcyLDIzMTA1LDI0MjY2LDI0MzI0LDI2MzkxLDI3MDA0LDI3MDI4LDI4MDEwLDI4NDMxLDI5MjgyLDI5NDM2LDMxNzI1LDMyNzY5LDMyODk0LDM0NjM1LDM3MDcwLDIwODQ1LDQwNTk1LDMxMTA4LDMyOTA3LDM3NjgyLDM1NTQyLDIwNTI1LDIxNjQ0LDM1NDQxLDI3NDk4LDM2MDM2LDMzMDMxLDI0Nzg1LDI2NTI4LDQwNDM0LDIwMTIxLDIwMTIwLDM5OTUyLDM1NDM1LDM0MjQxLDM0MTUyLDI2ODgwLDI4Mjg2LDMwODcxLDMzMTA5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjQzMzIsMTk5ODQsMTk5ODksMjAwMTAsMjAwMTcsMjAwMjIsMjAwMjgsMjAwMzEsMjAwMzQsMjAwNTQsMjAwNTYsMjAwOTgsMjAxMDEsMzU5NDcsMjAxMDYsMzMyOTgsMjQzMzMsMjAxMTAsMjAxMjYsMjAxMjcsMjAxMjgsMjAxMzAsMjAxNDQsMjAxNDcsMjAxNTAsMjAxNzQsMjAxNzMsMjAxNjQsMjAxNjYsMjAxNjIsMjAxODMsMjAxOTAsMjAyMDUsMjAxOTEsMjAyMTUsMjAyMzMsMjAzMTQsMjAyNzIsMjAzMTUsMjAzMTcsMjAzMTEsMjAyOTUsMjAzNDIsMjAzNjAsMjAzNjcsMjAzNzYsMjAzNDcsMjAzMjksMjAzMzYsMjAzNjksMjAzMzUsMjAzNTgsMjAzNzQsMjA3NjAsMjA0MzYsMjA0NDcsMjA0MzAsMjA0NDAsMjA0NDMsMjA0MzMsMjA0NDIsMjA0MzIsMjA0NTIsMjA0NTMsMjA1MDYsMjA1MjAsMjA1MDAsMjA1MjIsMjA1MTcsMjA0ODUsMjAyNTIsMjA0NzAsMjA1MTMsMjA1MjEsMjA1MjQsMjA0NzgsMjA0NjMsMjA0OTcsMjA0ODYsMjA1NDcsMjA1NTEsMjYzNzEsMjA1NjUsMjA1NjAsMjA1NTIsMjA1NzAsMjA1NjYsMjA1ODgsMjA2MDAsMjA2MDgsMjA2MzQsMjA2MTMsMjA2NjAsMjA2NTgsMjA2ODEsMjA2ODIsMjA2NTksMjA2NzQsMjA2OTQsMjA3MDIsMjA3MDksMjA3MTcsMjA3MDcsMjA3MTgsMjA3MjksMjA3MjUsMjA3NDUsMjA3MzcsMjA3MzgsMjA3NTgsMjA3NTcsMjA3NTYsMjA3NjIsMjA3NjksMjA3OTQsMjA3OTEsMjA3OTYsMjA3OTUsMjA3OTksMjA4MDAsMjA4MTgsMjA4MTIsMjA4MjAsMjA4MzQsMzE0ODAsMjA4NDEsMjA4NDIsMjA4NDYsMjA4NjQsMjA4NjYsMjIyMzIsMjA4NzYsMjA4NzMsMjA4NzksMjA4ODEsMjA4ODMsMjA4ODUsMjA4ODYsMjA5MDAsMjA5MDIsMjA4OTgsMjA5MDUsMjA5MDYsMjA5MDcsMjA5MTUsMjA5MTMsMjA5MTQsMjA5MTIsMjA5MTcsMjA5MjUsMjA5MzMsMjA5MzcsMjA5NTUsMjA5NjAsMzQzODksMjA5NjksMjA5NzMsMjA5NzYsMjA5ODEsMjA5OTAsMjA5OTYsMjEwMDMsMjEwMTIsMjEwMDYsMjEwMzEsMjEwMzQsMjEwMzgsMjEwNDMsMjEwNDksMjEwNzEsMjEwNjAsMjEwNjcsMjEwNjgsMjEwODYsMjEwNzYsMjEwOTgsMjExMDgsMjEwOTcsMjExMDcsMjExMTksMjExMTcsMjExMzMsMjExNDAsMjExMzgsMjExMDUsMjExMjgsMjExMzcsMzY3NzYsMzY3NzUsMjExNjQsMjExNjUsMjExODAsMjExNzMsMjExODUsMjExOTcsMjEyMDcsMjEyMTQsMjEyMTksMjEyMjIsMzkxNDksMjEyMTYsMjEyMzUsMjEyMzcsMjEyNDAsMjEyNDEsMjEyNTQsMjEyNTYsMzAwMDgsMjEyNjEsMjEyNjQsMjEyNjMsMjEyNjksMjEyNzQsMjEyODMsMjEyOTUsMjEyOTcsMjEyOTksMjEzMDQsMjEzMTIsMjEzMTgsMjEzMTcsMTk5OTEsMjEzMjEsMjEzMjUsMjA5NTAsMjEzNDIsMjEzNTMsMjEzNTgsMjI4MDgsMjEzNzEsMjEzNjcsMjEzNzgsMjEzOTgsMjE0MDgsMjE0MTQsMjE0MTMsMjE0MjIsMjE0MjQsMjE0MzAsMjE0NDMsMzE3NjIsMzg2MTcsMjE0NzEsMjYzNjQsMjkxNjYsMjE0ODYsMjE0ODAsMjE0ODUsMjE0OTgsMjE1MDUsMjE1NjUsMjE1NjgsMjE1NDgsMjE1NDksMjE1NjQsMjE1NTAsMjE1NTgsMjE1NDUsMjE1MzMsMjE1ODIsMjE2NDcsMjE2MjEsMjE2NDYsMjE1OTksMjE2MTcsMjE2MjMsMjE2MTYsMjE2NTAsMjE2MjcsMjE2MzIsMjE2MjIsMjE2MzYsMjE2NDgsMjE2MzgsMjE3MDMsMjE2NjYsMjE2ODgsMjE2NjksMjE2NzYsMjE3MDAsMjE3MDQsMjE2NzIsMjE2NzUsMjE2OTgsMjE2NjgsMjE2OTQsMjE2OTIsMjE3MjAsMjE3MzMsMjE3MzQsMjE3NzUsMjE3ODAsMjE3NTcsMjE3NDIsMjE3NDEsMjE3NTQsMjE3MzAsMjE4MTcsMjE4MjQsMjE4NTksMjE4MzYsMjE4MDYsMjE4NTIsMjE4MjksMjE4NDYsMjE4NDcsMjE4MTYsMjE4MTEsMjE4NTMsMjE5MTMsMjE4ODgsMjE2NzksMjE4OTgsMjE5MTksMjE4ODMsMjE4ODYsMjE5MTIsMjE5MTgsMjE5MzQsMjE4ODQsMjE4OTEsMjE5MjksMjE4OTUsMjE5MjgsMjE5NzgsMjE5NTcsMjE5ODMsMjE5NTYsMjE5ODAsMjE5ODgsMjE5NzIsMjIwMzYsMjIwMDcsMjIwMzgsMjIwMTQsMjIwMTMsMjIwNDMsMjIwMDksMjIwOTQsMjIwOTYsMjkxNTEsMjIwNjgsMjIwNzAsMjIwNjYsMjIwNzIsMjIxMjMsMjIxMTYsMjIwNjMsMjIxMjQsMjIxMjIsMjIxNTAsMjIxNDQsMjIxNTQsMjIxNzYsMjIxNjQsMjIxNTksMjIxODEsMjIxOTAsMjIxOTgsMjIxOTYsMjIyMTAsMjIyMDQsMjIyMDksMjIyMTEsMjIyMDgsMjIyMTYsMjIyMjIsMjIyMjUsMjIyMjcsMjIyMzEsMjIyNTQsMjIyNjUsMjIyNzIsMjIyNzEsMjIyNzYsMjIyODEsMjIyODAsMjIyODMsMjIyODUsMjIyOTEsMjIyOTYsMjIyOTQsMjE5NTksMjIzMDAsMjIzMTAsMjIzMjcsMjIzMjgsMjIzNTAsMjIzMzEsMjIzMzYsMjIzNTEsMjIzNzcsMjI0NjQsMjI0MDgsMjIzNjksMjIzOTksMjI0MDksMjI0MTksMjI0MzIsMjI0NTEsMjI0MzYsMjI0NDIsMjI0NDgsMjI0NjcsMjI0NzAsMjI0ODQsMjI0ODIsMjI0ODMsMjI1MzgsMjI0ODYsMjI0OTksMjI1MzksMjI1NTMsMjI1NTcsMjI2NDIsMjI1NjEsMjI2MjYsMjI2MDMsMjI2NDAsMjc1ODQsMjI2MTAsMjI1ODksMjI2NDksMjI2NjEsMjI3MTMsMjI2ODcsMjI2OTksMjI3MTQsMjI3NTAsMjI3MTUsMjI3MTIsMjI3MDIsMjI3MjUsMjI3MzksMjI3MzcsMjI3NDMsMjI3NDUsMjI3NDQsMjI3NTcsMjI3NDgsMjI3NTYsMjI3NTEsMjI3NjcsMjI3NzgsMjI3NzcsMjI3NzksMjI3ODAsMjI3ODEsMjI3ODYsMjI3OTQsMjI4MDAsMjI4MTEsMjY3OTAsMjI4MjEsMjI4MjgsMjI4MjksMjI4MzQsMjI4NDAsMjI4NDYsMzE0NDIsMjI4NjksMjI4NjQsMjI4NjIsMjI4NzQsMjI4NzIsMjI4ODIsMjI4ODAsMjI4ODcsMjI4OTIsMjI4ODksMjI5MDQsMjI5MTMsMjI5NDEsMjAzMTgsMjAzOTUsMjI5NDcsMjI5NjIsMjI5ODIsMjMwMTYsMjMwMDQsMjI5MjUsMjMwMDEsMjMwMDIsMjMwNzcsMjMwNzEsMjMwNTcsMjMwNjgsMjMwNDksMjMwNjYsMjMxMDQsMjMxNDgsMjMxMTMsMjMwOTMsMjMwOTQsMjMxMzgsMjMxNDYsMjMxOTQsMjMyMjgsMjMyMzAsMjMyNDMsMjMyMzQsMjMyMjksMjMyNjcsMjMyNTUsMjMyNzAsMjMyNzMsMjMyNTQsMjMyOTAsMjMyOTEsMjMzMDgsMjMzMDcsMjMzMTgsMjMzNDYsMjMyNDgsMjMzMzgsMjMzNTAsMjMzNTgsMjMzNjMsMjMzNjUsMjMzNjAsMjMzNzcsMjMzODEsMjMzODYsMjMzODcsMjMzOTcsMjM0MDEsMjM0MDgsMjM0MTEsMjM0MTMsMjM0MTYsMjU5OTIsMjM0MTgsMjM0MjQsMjM0MjcsMjM0NjIsMjM0ODAsMjM0OTEsMjM0OTUsMjM0OTcsMjM1MDgsMjM1MDQsMjM1MjQsMjM1MjYsMjM1MjIsMjM1MTgsMjM1MjUsMjM1MzEsMjM1MzYsMjM1NDIsMjM1MzksMjM1NTcsMjM1NTksMjM1NjAsMjM1NjUsMjM1NzEsMjM1ODQsMjM1ODYsMjM1OTIsMjM2MDgsMjM2MDksMjM2MTcsMjM2MjIsMjM2MzAsMjM2MzUsMjM2MzIsMjM2MzEsMjM0MDksMjM2NjAsMjM2NjIsMjAwNjYsMjM2NzAsMjM2NzMsMjM2OTIsMjM2OTcsMjM3MDAsMjI5MzksMjM3MjMsMjM3MzksMjM3MzQsMjM3NDAsMjM3MzUsMjM3NDksMjM3NDIsMjM3NTEsMjM3NjksMjM3ODUsMjM4MDUsMjM4MDIsMjM3ODksMjM5NDgsMjM3ODYsMjM4MTksMjM4MjksMjM4MzEsMjM5MDAsMjM4MzksMjM4MzUsMjM4MjUsMjM4MjgsMjM4NDIsMjM4MzQsMjM4MzMsMjM4MzIsMjM4ODQsMjM4OTAsMjM4ODYsMjM4ODMsMjM5MTYsMjM5MjMsMjM5MjYsMjM5NDMsMjM5NDAsMjM5MzgsMjM5NzAsMjM5NjUsMjM5ODAsMjM5ODIsMjM5OTcsMjM5NTIsMjM5OTEsMjM5OTYsMjQwMDksMjQwMTMsMjQwMTksMjQwMTgsMjQwMjIsMjQwMjcsMjQwNDMsMjQwNTAsMjQwNTMsMjQwNzUsMjQwOTAsMjQwODksMjQwODEsMjQwOTEsMjQxMTgsMjQxMTksMjQxMzIsMjQxMzEsMjQxMjgsMjQxNDIsMjQxNTEsMjQxNDgsMjQxNTksMjQxNjIsMjQxNjQsMjQxMzUsMjQxODEsMjQxODIsMjQxODYsNDA2MzYsMjQxOTEsMjQyMjQsMjQyNTcsMjQyNTgsMjQyNjQsMjQyNzIsMjQyNzEsMjQyNzgsMjQyOTEsMjQyODUsMjQyODIsMjQyODMsMjQyOTAsMjQyODksMjQyOTYsMjQyOTcsMjQzMDAsMjQzMDUsMjQzMDcsMjQzMDQsMjQzMDgsMjQzMTIsMjQzMTgsMjQzMjMsMjQzMjksMjQ0MTMsMjQ0MTIsMjQzMzEsMjQzMzcsMjQzNDIsMjQzNjEsMjQzNjUsMjQzNzYsMjQzODUsMjQzOTIsMjQzOTYsMjQzOTgsMjQzNjcsMjQ0MDEsMjQ0MDYsMjQ0MDcsMjQ0MDksMjQ0MTcsMjQ0MjksMjQ0MzUsMjQ0MzksMjQ0NTEsMjQ0NTAsMjQ0NDcsMjQ0NTgsMjQ0NTYsMjQ0NjUsMjQ0NTUsMjQ0NzgsMjQ0NzMsMjQ0NzIsMjQ0ODAsMjQ0ODgsMjQ0OTMsMjQ1MDgsMjQ1MzQsMjQ1NzEsMjQ1NDgsMjQ1NjgsMjQ1NjEsMjQ1NDEsMjQ3NTUsMjQ1NzUsMjQ2MDksMjQ2NzIsMjQ2MDEsMjQ1OTIsMjQ2MTcsMjQ1OTAsMjQ2MjUsMjQ2MDMsMjQ1OTcsMjQ2MTksMjQ2MTQsMjQ1OTEsMjQ2MzQsMjQ2NjYsMjQ2NDEsMjQ2ODIsMjQ2OTUsMjQ2NzEsMjQ2NTAsMjQ2NDYsMjQ2NTMsMjQ2NzUsMjQ2NDMsMjQ2NzYsMjQ2NDIsMjQ2ODQsMjQ2ODMsMjQ2NjUsMjQ3MDUsMjQ3MTcsMjQ4MDcsMjQ3MDcsMjQ3MzAsMjQ3MDgsMjQ3MzEsMjQ3MjYsMjQ3MjcsMjQ3MjIsMjQ3NDMsMjQ3MTUsMjQ4MDEsMjQ3NjAsMjQ4MDAsMjQ3ODcsMjQ3NTYsMjQ1NjAsMjQ3NjUsMjQ3NzQsMjQ3NTcsMjQ3OTIsMjQ5MDksMjQ4NTMsMjQ4MzgsMjQ4MjIsMjQ4MjMsMjQ4MzIsMjQ4MjAsMjQ4MjYsMjQ4MzUsMjQ4NjUsMjQ4MjcsMjQ4MTcsMjQ4NDUsMjQ4NDYsMjQ5MDMsMjQ4OTQsMjQ4NzIsMjQ4NzEsMjQ5MDYsMjQ4OTUsMjQ4OTIsMjQ4NzYsMjQ4ODQsMjQ4OTMsMjQ4OTgsMjQ5MDAsMjQ5NDcsMjQ5NTEsMjQ5MjAsMjQ5MjEsMjQ5MjIsMjQ5MzksMjQ5NDgsMjQ5NDMsMjQ5MzMsMjQ5NDUsMjQ5MjcsMjQ5MjUsMjQ5MTUsMjQ5NDksMjQ5ODUsMjQ5ODIsMjQ5NjcsMjUwMDQsMjQ5ODAsMjQ5ODYsMjQ5NzAsMjQ5NzcsMjUwMDMsMjUwMDYsMjUwMzYsMjUwMzQsMjUwMzMsMjUwNzksMjUwMzIsMjUwMjcsMjUwMzAsMjUwMTgsMjUwMzUsMzI2MzMsMjUwMzcsMjUwNjIsMjUwNTksMjUwNzgsMjUwODIsMjUwNzYsMjUwODcsMjUwODUsMjUwODQsMjUwODYsMjUwODgsMjUwOTYsMjUwOTcsMjUxMDEsMjUxMDAsMjUxMDgsMjUxMTUsMjUxMTgsMjUxMjEsMjUxMzAsMjUxMzQsMjUxMzYsMjUxMzgsMjUxMzksMjUxNTMsMjUxNjYsMjUxODIsMjUxODcsMjUxNzksMjUxODQsMjUxOTIsMjUyMTIsMjUyMTgsMjUyMjUsMjUyMTQsMjUyMzQsMjUyMzUsMjUyMzgsMjUzMDAsMjUyMTksMjUyMzYsMjUzMDMsMjUyOTcsMjUyNzUsMjUyOTUsMjUzNDMsMjUyODYsMjU4MTIsMjUyODgsMjUzMDgsMjUyOTIsMjUyOTAsMjUyODIsMjUyODcsMjUyNDMsMjUyODksMjUzNTYsMjUzMjYsMjUzMjksMjUzODMsMjUzNDYsMjUzNTIsMjUzMjcsMjUzMzMsMjU0MjQsMjU0MDYsMjU0MjEsMjU2MjgsMjU0MjMsMjU0OTQsMjU0ODYsMjU0NzIsMjU1MTUsMjU0NjIsMjU1MDcsMjU0ODcsMjU0ODEsMjU1MDMsMjU1MjUsMjU0NTEsMjU0NDksMjU1MzQsMjU1NzcsMjU1MzYsMjU1NDIsMjU1NzEsMjU1NDUsMjU1NTQsMjU1OTAsMjU1NDAsMjU2MjIsMjU2NTIsMjU2MDYsMjU2MTksMjU2MzgsMjU2NTQsMjU4ODUsMjU2MjMsMjU2NDAsMjU2MTUsMjU3MDMsMjU3MTEsMjU3MTgsMjU2NzgsMjU4OTgsMjU3NDksMjU3NDcsMjU3NjUsMjU3NjksMjU3MzYsMjU3ODgsMjU4MTgsMjU4MTAsMjU3OTcsMjU3OTksMjU3ODcsMjU4MTYsMjU3OTQsMjU4NDEsMjU4MzEsMzMyODksMjU4MjQsMjU4MjUsMjUyNjAsMjU4MjcsMjU4MzksMjU5MDAsMjU4NDYsMjU4NDQsMjU4NDIsMjU4NTAsMjU4NTYsMjU4NTMsMjU4ODAsMjU4ODQsMjU4NjEsMjU4OTIsMjU4OTEsMjU4OTksMjU5MDgsMjU5MDksMjU5MTEsMjU5MTAsMjU5MTIsMzAwMjcsMjU5MjgsMjU5NDIsMjU5NDEsMjU5MzMsMjU5NDQsMjU5NTAsMjU5NDksMjU5NzAsMjU5NzYsMjU5ODYsMjU5ODcsMzU3MjIsMjYwMTEsMjYwMTUsMjYwMjcsMjYwMzksMjYwNTEsMjYwNTQsMjYwNDksMjYwNTIsMjYwNjAsMjYwNjYsMjYwNzUsMjYwNzMsMjYwODAsMjYwODEsMjYwOTcsMjY0ODIsMjYxMjIsMjYxMTUsMjYxMDcsMjY0ODMsMjYxNjUsMjYxNjYsMjYxNjQsMjYxNDAsMjYxOTEsMjYxODAsMjYxODUsMjYxNzcsMjYyMDYsMjYyMDUsMjYyMTIsMjYyMTUsMjYyMTYsMjYyMDcsMjYyMTAsMjYyMjQsMjYyNDMsMjYyNDgsMjYyNTQsMjYyNDksMjYyNDQsMjYyNjQsMjYyNjksMjYzMDUsMjYyOTcsMjYzMTMsMjYzMDIsMjYzMDAsMjYzMDgsMjYyOTYsMjYzMjYsMjYzMzAsMjYzMzYsMjYxNzUsMjYzNDIsMjYzNDUsMjYzNTIsMjYzNTcsMjYzNTksMjYzODMsMjYzOTAsMjYzOTgsMjY0MDYsMjY0MDcsMzg3MTIsMjY0MTQsMjY0MzEsMjY0MjIsMjY0MzMsMjY0MjQsMjY0MjMsMjY0MzgsMjY0NjIsMjY0NjQsMjY0NTcsMjY0NjcsMjY0NjgsMjY1MDUsMjY0ODAsMjY1MzcsMjY0OTIsMjY0NzQsMjY1MDgsMjY1MDcsMjY1MzQsMjY1MjksMjY1MDEsMjY1NTEsMjY2MDcsMjY1NDgsMjY2MDQsMjY1NDcsMjY2MDEsMjY1NTIsMjY1OTYsMjY1OTAsMjY1ODksMjY1OTQsMjY2MDYsMjY1NTMsMjY1NzQsMjY1NjYsMjY1OTksMjcyOTIsMjY2NTQsMjY2OTQsMjY2NjUsMjY2ODgsMjY3MDEsMjY2NzQsMjY3MDIsMjY4MDMsMjY2NjcsMjY3MTMsMjY3MjMsMjY3NDMsMjY3NTEsMjY3ODMsMjY3NjcsMjY3OTcsMjY3NzIsMjY3ODEsMjY3NzksMjY3NTUsMjczMTAsMjY4MDksMjY3NDAsMjY4MDUsMjY3ODQsMjY4MTAsMjY4OTUsMjY3NjUsMjY3NTAsMjY4ODEsMjY4MjYsMjY4ODgsMjY4NDAsMjY5MTQsMjY5MTgsMjY4NDksMjY4OTIsMjY4MjksMjY4MzYsMjY4NTUsMjY4MzcsMjY5MzQsMjY4OTgsMjY4ODQsMjY4MzksMjY4NTEsMjY5MTcsMjY4NzMsMjY4NDgsMjY4NjMsMjY5MjAsMjY5MjIsMjY5MDYsMjY5MTUsMjY5MTMsMjY4MjIsMjcwMDEsMjY5OTksMjY5NzIsMjcwMDAsMjY5ODcsMjY5NjQsMjcwMDYsMjY5OTAsMjY5MzcsMjY5OTYsMjY5NDEsMjY5NjksMjY5MjgsMjY5NzcsMjY5NzQsMjY5NzMsMjcwMDksMjY5ODYsMjcwNTgsMjcwNTQsMjcwODgsMjcwNzEsMjcwNzMsMjcwOTEsMjcwNzAsMjcwODYsMjM1MjgsMjcwODIsMjcxMDEsMjcwNjcsMjcwNzUsMjcwNDcsMjcxODIsMjcwMjUsMjcwNDAsMjcwMzYsMjcwMjksMjcwNjAsMjcxMDIsMjcxMTIsMjcxMzgsMjcxNjMsMjcxMzUsMjc0MDIsMjcxMjksMjcxMjIsMjcxMTEsMjcxNDEsMjcwNTcsMjcxNjYsMjcxMTcsMjcxNTYsMjcxMTUsMjcxNDYsMjcxNTQsMjczMjksMjcxNzEsMjcxNTUsMjcyMDQsMjcxNDgsMjcyNTAsMjcxOTAsMjcyNTYsMjcyMDcsMjcyMzQsMjcyMjUsMjcyMzgsMjcyMDgsMjcxOTIsMjcxNzAsMjcyODAsMjcyNzcsMjcyOTYsMjcyNjgsMjcyOTgsMjcyOTksMjcyODcsMzQzMjcsMjczMjMsMjczMzEsMjczMzAsMjczMjAsMjczMTUsMjczMDgsMjczNTgsMjczNDUsMjczNTksMjczMDYsMjczNTQsMjczNzAsMjczODcsMjczOTcsMzQzMjYsMjczODYsMjc0MTAsMjc0MTQsMzk3MjksMjc0MjMsMjc0NDgsMjc0NDcsMzA0MjgsMjc0NDksMzkxNTAsMjc0NjMsMjc0NTksMjc0NjUsMjc0NzIsMjc0ODEsMjc0NzYsMjc0ODMsMjc0ODcsMjc0ODksMjc1MTIsMjc1MTMsMjc1MTksMjc1MjAsMjc1MjQsMjc1MjMsMjc1MzMsMjc1NDQsMjc1NDEsMjc1NTAsMjc1NTYsMjc1NjIsMjc1NjMsMjc1NjcsMjc1NzAsMjc1NjksMjc1NzEsMjc1NzUsMjc1ODAsMjc1OTAsMjc1OTUsMjc2MDMsMjc2MTUsMjc2MjgsMjc2MjcsMjc2MzUsMjc2MzEsNDA2MzgsMjc2NTYsMjc2NjcsMjc2NjgsMjc2NzUsMjc2ODQsMjc2ODMsMjc3NDIsMjc3MzMsMjc3NDYsMjc3NTQsMjc3NzgsMjc3ODksMjc4MDIsMjc3NzcsMjc4MDMsMjc3NzQsMjc3NTIsMjc3NjMsMjc3OTQsMjc3OTIsMjc4NDQsMjc4ODksMjc4NTksMjc4MzcsMjc4NjMsMjc4NDUsMjc4NjksMjc4MjIsMjc4MjUsMjc4MzgsMjc4MzQsMjc4NjcsMjc4ODcsMjc4NjUsMjc4ODIsMjc5MzUsMzQ4OTMsMjc5NTgsMjc5NDcsMjc5NjUsMjc5NjAsMjc5MjksMjc5NTcsMjc5NTUsMjc5MjIsMjc5MTYsMjgwMDMsMjgwNTEsMjgwMDQsMjc5OTQsMjgwMjUsMjc5OTMsMjgwNDYsMjgwNTMsMjg2NDQsMjgwMzcsMjgxNTMsMjgxODEsMjgxNzAsMjgwODUsMjgxMDMsMjgxMzQsMjgwODgsMjgxMDIsMjgxNDAsMjgxMjYsMjgxMDgsMjgxMzYsMjgxMTQsMjgxMDEsMjgxNTQsMjgxMjEsMjgxMzIsMjgxMTcsMjgxMzgsMjgxNDIsMjgyMDUsMjgyNzAsMjgyMDYsMjgxODUsMjgyNzQsMjgyNTUsMjgyMjIsMjgxOTUsMjgyNjcsMjgyMDMsMjgyNzgsMjgyMzcsMjgxOTEsMjgyMjcsMjgyMTgsMjgyMzgsMjgxOTYsMjg0MTUsMjgxODksMjgyMTYsMjgyOTAsMjgzMzAsMjgzMTIsMjgzNjEsMjgzNDMsMjgzNzEsMjgzNDksMjgzMzUsMjgzNTYsMjgzMzgsMjgzNzIsMjgzNzMsMjgzMDMsMjgzMjUsMjgzNTQsMjgzMTksMjg0ODEsMjg0MzMsMjg3NDgsMjgzOTYsMjg0MDgsMjg0MTQsMjg0NzksMjg0MDIsMjg0NjUsMjgzOTksMjg0NjYsMjgzNjQsMjg0NzgsMjg0MzUsMjg0MDcsMjg1NTAsMjg1MzgsMjg1MzYsMjg1NDUsMjg1NDQsMjg1MjcsMjg1MDcsMjg2NTksMjg1MjUsMjg1NDYsMjg1NDAsMjg1MDQsMjg1NTgsMjg1NjEsMjg2MTAsMjg1MTgsMjg1OTUsMjg1NzksMjg1NzcsMjg1ODAsMjg2MDEsMjg2MTQsMjg1ODYsMjg2MzksMjg2MjksMjg2NTIsMjg2MjgsMjg2MzIsMjg2NTcsMjg2NTQsMjg2MzUsMjg2ODEsMjg2ODMsMjg2NjYsMjg2ODksMjg2NzMsMjg2ODcsMjg2NzAsMjg2OTksMjg2OTgsMjg1MzIsMjg3MDEsMjg2OTYsMjg3MDMsMjg3MjAsMjg3MzQsMjg3MjIsMjg3NTMsMjg3NzEsMjg4MjUsMjg4MTgsMjg4NDcsMjg5MTMsMjg4NDQsMjg4NTYsMjg4NTEsMjg4NDYsMjg4OTUsMjg4NzUsMjg4OTMsMjg4ODksMjg5MzcsMjg5MjUsMjg5NTYsMjg5NTMsMjkwMjksMjkwMTMsMjkwNjQsMjkwMzAsMjkwMjYsMjkwMDQsMjkwMTQsMjkwMzYsMjkwNzEsMjkxNzksMjkwNjAsMjkwNzcsMjkwOTYsMjkxMDAsMjkxNDMsMjkxMTMsMjkxMTgsMjkxMzgsMjkxMjksMjkxNDAsMjkxMzQsMjkxNTIsMjkxNjQsMjkxNTksMjkxNzMsMjkxODAsMjkxNzcsMjkxODMsMjkxOTcsMjkyMDAsMjkyMTEsMjkyMjQsMjkyMjksMjkyMjgsMjkyMzIsMjkyMzQsMjkyNDMsMjkyNDQsMjkyNDcsMjkyNDgsMjkyNTQsMjkyNTksMjkyNzIsMjkzMDAsMjkzMTAsMjkzMTQsMjkzMTMsMjkzMTksMjkzMzAsMjkzMzQsMjkzNDYsMjkzNTEsMjkzNjksMjkzNjIsMjkzNzksMjkzODIsMjkzODAsMjkzOTAsMjkzOTQsMjk0MTAsMjk0MDgsMjk0MDksMjk0MzMsMjk0MzEsMjA0OTUsMjk0NjMsMjk0NTAsMjk0NjgsMjk0NjIsMjk0NjksMjk0OTIsMjk0ODcsMjk0ODEsMjk0NzcsMjk1MDIsMjk1MTgsMjk1MTksNDA2NjQsMjk1MjcsMjk1NDYsMjk1NDQsMjk1NTIsMjk1NjAsMjk1NTcsMjk1NjMsMjk1NjIsMjk2NDAsMjk2MTksMjk2NDYsMjk2MjcsMjk2MzIsMjk2NjksMjk2NzgsMjk2NjIsMjk4NTgsMjk3MDEsMjk4MDcsMjk3MzMsMjk2ODgsMjk3NDYsMjk3NTQsMjk3ODEsMjk3NTksMjk3OTEsMjk3ODUsMjk3NjEsMjk3ODgsMjk4MDEsMjk4MDgsMjk3OTUsMjk4MDIsMjk4MTQsMjk4MjIsMjk4MzUsMjk4NTQsMjk4NjMsMjk4OTgsMjk5MDMsMjk5MDgsMjk2ODEsMjk5MjAsMjk5MjMsMjk5MjcsMjk5MjksMjk5MzQsMjk5MzgsMjk5MzYsMjk5MzcsMjk5NDQsMjk5NDMsMjk5NTYsMjk5NTUsMjk5NTcsMjk5NjQsMjk5NjYsMjk5NjUsMjk5NzMsMjk5NzEsMjk5ODIsMjk5OTAsMjk5OTYsMzAwMTIsMzAwMjAsMzAwMjksMzAwMjYsMzAwMjUsMzAwNDMsMzAwMjIsMzAwNDIsMzAwNTcsMzAwNTIsMzAwNTUsMzAwNTksMzAwNjEsMzAwNzIsMzAwNzAsMzAwODYsMzAwODcsMzAwNjgsMzAwOTAsMzAwODksMzAwODIsMzAxMDAsMzAxMDYsMzAxMDksMzAxMTcsMzAxMTUsMzAxNDYsMzAxMzEsMzAxNDcsMzAxMzMsMzAxNDEsMzAxMzYsMzAxNDAsMzAxMjksMzAxNTcsMzAxNTQsMzAxNjIsMzAxNjksMzAxNzksMzAxNzQsMzAyMDYsMzAyMDcsMzAyMDQsMzAyMDksMzAxOTIsMzAyMDIsMzAxOTQsMzAxOTUsMzAyMTksMzAyMjEsMzAyMTcsMzAyMzksMzAyNDcsMzAyNDAsMzAyNDEsMzAyNDIsMzAyNDQsMzAyNjAsMzAyNTYsMzAyNjcsMzAyNzksMzAyODAsMzAyNzgsMzAzMDAsMzAyOTYsMzAzMDUsMzAzMDYsMzAzMTIsMzAzMTMsMzAzMTQsMzAzMTEsMzAzMTYsMzAzMjAsMzAzMjIsMzAzMjYsMzAzMjgsMzAzMzIsMzAzMzYsMzAzMzksMzAzNDQsMzAzNDcsMzAzNTAsMzAzNTgsMzAzNTUsMzAzNjEsMzAzNjIsMzAzODQsMzAzODgsMzAzOTIsMzAzOTMsMzAzOTQsMzA0MDIsMzA0MTMsMzA0MjIsMzA0MTgsMzA0MzAsMzA0MzMsMzA0MzcsMzA0MzksMzA0NDIsMzQzNTEsMzA0NTksMzA0NzIsMzA0NzEsMzA0NjgsMzA1MDUsMzA1MDAsMzA0OTQsMzA1MDEsMzA1MDIsMzA0OTEsMzA1MTksMzA1MjAsMzA1MzUsMzA1NTQsMzA1NjgsMzA1NzEsMzA1NTUsMzA1NjUsMzA1OTEsMzA1OTAsMzA1ODUsMzA2MDYsMzA2MDMsMzA2MDksMzA2MjQsMzA2MjIsMzA2NDAsMzA2NDYsMzA2NDksMzA2NTUsMzA2NTIsMzA2NTMsMzA2NTEsMzA2NjMsMzA2NjksMzA2NzksMzA2ODIsMzA2ODQsMzA2OTEsMzA3MDIsMzA3MTYsMzA3MzIsMzA3MzgsMzEwMTQsMzA3NTIsMzEwMTgsMzA3ODksMzA4NjIsMzA4MzYsMzA4NTQsMzA4NDQsMzA4NzQsMzA4NjAsMzA4ODMsMzA5MDEsMzA4OTAsMzA4OTUsMzA5MjksMzA5MTgsMzA5MjMsMzA5MzIsMzA5MTAsMzA5MDgsMzA5MTcsMzA5MjIsMzA5NTYsMzA5NTEsMzA5MzgsMzA5NzMsMzA5NjQsMzA5ODMsMzA5OTQsMzA5OTMsMzEwMDEsMzEwMjAsMzEwMTksMzEwNDAsMzEwNzIsMzEwNjMsMzEwNzEsMzEwNjYsMzEwNjEsMzEwNTksMzEwOTgsMzExMDMsMzExMTQsMzExMzMsMzExNDMsNDA3NzksMzExNDYsMzExNTAsMzExNTUsMzExNjEsMzExNjIsMzExNzcsMzExODksMzEyMDcsMzEyMTIsMzEyMDEsMzEyMDMsMzEyNDAsMzEyNDUsMzEyNTYsMzEyNTcsMzEyNjQsMzEyNjMsMzExMDQsMzEyODEsMzEyOTEsMzEyOTQsMzEyODcsMzEyOTksMzEzMTksMzEzMDUsMzEzMjksMzEzMzAsMzEzMzcsNDA4NjEsMzEzNDQsMzEzNTMsMzEzNTcsMzEzNjgsMzEzODMsMzEzODEsMzEzODQsMzEzODIsMzE0MDEsMzE0MzIsMzE0MDgsMzE0MTQsMzE0MjksMzE0MjgsMzE0MjMsMzY5OTUsMzE0MzEsMzE0MzQsMzE0MzcsMzE0MzksMzE0NDUsMzE0NDMsMzE0NDksMzE0NTAsMzE0NTMsMzE0NTcsMzE0NTgsMzE0NjIsMzE0NjksMzE0NzIsMzE0OTAsMzE1MDMsMzE0OTgsMzE0OTQsMzE1MzksMzE1MTIsMzE1MTMsMzE1MTgsMzE1NDEsMzE1MjgsMzE1NDIsMzE1NjgsMzE2MTAsMzE0OTIsMzE1NjUsMzE0OTksMzE1NjQsMzE1NTcsMzE2MDUsMzE1ODksMzE2MDQsMzE1OTEsMzE2MDAsMzE2MDEsMzE1OTYsMzE1OTgsMzE2NDUsMzE2NDAsMzE2NDcsMzE2MjksMzE2NDQsMzE2NDIsMzE2MjcsMzE2MzQsMzE2MzEsMzE1ODEsMzE2NDEsMzE2OTEsMzE2ODEsMzE2OTIsMzE2OTUsMzE2NjgsMzE2ODYsMzE3MDksMzE3MjEsMzE3NjEsMzE3NjQsMzE3MTgsMzE3MTcsMzE4NDAsMzE3NDQsMzE3NTEsMzE3NjMsMzE3MzEsMzE3MzUsMzE3NjcsMzE3NTcsMzE3MzQsMzE3NzksMzE3ODMsMzE3ODYsMzE3NzUsMzE3OTksMzE3ODcsMzE4MDUsMzE4MjAsMzE4MTEsMzE4MjgsMzE4MjMsMzE4MDgsMzE4MjQsMzE4MzIsMzE4MzksMzE4NDQsMzE4MzAsMzE4NDUsMzE4NTIsMzE4NjEsMzE4NzUsMzE4ODgsMzE5MDgsMzE5MTcsMzE5MDYsMzE5MTUsMzE5MDUsMzE5MTIsMzE5MjMsMzE5MjIsMzE5MjEsMzE5MTgsMzE5MjksMzE5MzMsMzE5MzYsMzE5NDEsMzE5MzgsMzE5NjAsMzE5NTQsMzE5NjQsMzE5NzAsMzk3MzksMzE5ODMsMzE5ODYsMzE5ODgsMzE5OTAsMzE5OTQsMzIwMDYsMzIwMDIsMzIwMjgsMzIwMjEsMzIwMTAsMzIwNjksMzIwNzUsMzIwNDYsMzIwNTAsMzIwNjMsMzIwNTMsMzIwNzAsMzIxMTUsMzIwODYsMzIwNzgsMzIxMTQsMzIxMDQsMzIxMTAsMzIwNzksMzIwOTksMzIxNDcsMzIxMzcsMzIwOTEsMzIxNDMsMzIxMjUsMzIxNTUsMzIxODYsMzIxNzQsMzIxNjMsMzIxODEsMzIxOTksMzIxODksMzIxNzEsMzIzMTcsMzIxNjIsMzIxNzUsMzIyMjAsMzIxODQsMzIxNTksMzIxNzYsMzIyMTYsMzIyMjEsMzIyMjgsMzIyMjIsMzIyNTEsMzIyNDIsMzIyMjUsMzIyNjEsMzIyNjYsMzIyOTEsMzIyODksMzIyNzQsMzIzMDUsMzIyODcsMzIyNjUsMzIyNjcsMzIyOTAsMzIzMjYsMzIzNTgsMzIzMTUsMzIzMDksMzIzMTMsMzIzMjMsMzIzMTEsMzIzMDYsMzIzMTQsMzIzNTksMzIzNDksMzIzNDIsMzIzNTAsMzIzNDUsMzIzNDYsMzIzNzcsMzIzNjIsMzIzNjEsMzIzODAsMzIzNzksMzIzODcsMzIyMTMsMzIzODEsMzY3ODIsMzIzODMsMzIzOTIsMzIzOTMsMzIzOTYsMzI0MDIsMzI0MDAsMzI0MDMsMzI0MDQsMzI0MDYsMzIzOTgsMzI0MTEsMzI0MTIsMzI1NjgsMzI1NzAsMzI1ODEsMzI1ODgsMzI1ODksMzI1OTAsMzI1OTIsMzI1OTMsMzI1OTcsMzI1OTYsMzI2MDAsMzI2MDcsMzI2MDgsMzI2MTYsMzI2MTcsMzI2MTUsMzI2MzIsMzI2NDIsMzI2NDYsMzI2NDMsMzI2NDgsMzI2NDcsMzI2NTIsMzI2NjAsMzI2NzAsMzI2NjksMzI2NjYsMzI2NzUsMzI2ODcsMzI2OTAsMzI2OTcsMzI2ODYsMzI2OTQsMzI2OTYsMzU2OTcsMzI3MDksMzI3MTAsMzI3MTQsMzI3MjUsMzI3MjQsMzI3MzcsMzI3NDIsMzI3NDUsMzI3NTUsMzI3NjEsMzkxMzIsMzI3NzQsMzI3NzIsMzI3NzksMzI3ODYsMzI3OTIsMzI3OTMsMzI3OTYsMzI4MDEsMzI4MDgsMzI4MzEsMzI4MjcsMzI4NDIsMzI4MzgsMzI4NTAsMzI4NTYsMzI4NTgsMzI4NjMsMzI4NjYsMzI4NzIsMzI4ODMsMzI4ODIsMzI4ODAsMzI4ODYsMzI4ODksMzI4OTMsMzI4OTUsMzI5MDAsMzI5MDIsMzI5MDEsMzI5MjMsMzI5MTUsMzI5MjIsMzI5NDEsMjA4ODAsMzI5NDAsMzI5ODcsMzI5OTcsMzI5ODUsMzI5ODksMzI5NjQsMzI5ODYsMzI5ODIsMzMwMzMsMzMwMDcsMzMwMDksMzMwNTEsMzMwNjUsMzMwNTksMzMwNzEsMzMwOTksMzg1MzksMzMwOTQsMzMwODYsMzMxMDcsMzMxMDUsMzMwMjAsMzMxMzcsMzMxMzQsMzMxMjUsMzMxMjYsMzMxNDAsMzMxNTUsMzMxNjAsMzMxNjIsMzMxNTIsMzMxNTQsMzMxODQsMzMxNzMsMzMxODgsMzMxODcsMzMxMTksMzMxNzEsMzMxOTMsMzMyMDAsMzMyMDUsMzMyMTQsMzMyMDgsMzMyMTMsMzMyMTYsMzMyMTgsMzMyMTAsMzMyMjUsMzMyMjksMzMyMzMsMzMyNDEsMzMyNDAsMzMyMjQsMzMyNDIsMzMyNDcsMzMyNDgsMzMyNTUsMzMyNzQsMzMyNzUsMzMyNzgsMzMyODEsMzMyODIsMzMyODUsMzMyODcsMzMyOTAsMzMyOTMsMzMyOTYsMzMzMDIsMzMzMjEsMzMzMjMsMzMzMzYsMzMzMzEsMzMzNDQsMzMzNjksMzMzNjgsMzMzNzMsMzMzNzAsMzMzNzUsMzMzODAsMzMzNzgsMzMzODQsMzMzODYsMzMzODcsMzMzMjYsMzMzOTMsMzMzOTksMzM0MDAsMzM0MDYsMzM0MjEsMzM0MjYsMzM0NTEsMzM0MzksMzM0NjcsMzM0NTIsMzM1MDUsMzM1MDcsMzM1MDMsMzM0OTAsMzM1MjQsMzM1MjMsMzM1MzAsMzM2ODMsMzM1MzksMzM1MzEsMzM1MjksMzM1MDIsMzM1NDIsMzM1MDAsMzM1NDUsMzM0OTcsMzM1ODksMzM1ODgsMzM1NTgsMzM1ODYsMzM1ODUsMzM2MDAsMzM1OTMsMzM2MTYsMzM2MDUsMzM1ODMsMzM1NzksMzM1NTksMzM1NjAsMzM2NjksMzM2OTAsMzM3MDYsMzM2OTUsMzM2OTgsMzM2ODYsMzM1NzEsMzM2NzgsMzM2NzEsMzM2NzQsMzM2NjAsMzM3MTcsMzM2NTEsMzM2NTMsMzM2OTYsMzM2NzMsMzM3MDQsMzM3ODAsMzM4MTEsMzM3NzEsMzM3NDIsMzM3ODksMzM3OTUsMzM3NTIsMzM4MDMsMzM3MjksMzM3ODMsMzM3OTksMzM3NjAsMzM3NzgsMzM4MDUsMzM4MjYsMzM4MjQsMzM3MjUsMzM4NDgsMzQwNTQsMzM3ODcsMzM5MDEsMzM4MzQsMzM4NTIsMzQxMzgsMzM5MjQsMzM5MTEsMzM4OTksMzM5NjUsMzM5MDIsMzM5MjIsMzM4OTcsMzM4NjIsMzM4MzYsMzM5MDMsMzM5MTMsMzM4NDUsMzM5OTQsMzM4OTAsMzM5NzcsMzM5ODMsMzM5NTEsMzQwMDksMzM5OTcsMzM5NzksMzQwMTAsMzQwMDAsMzM5ODUsMzM5OTAsMzQwMDYsMzM5NTMsMzQwODEsMzQwNDcsMzQwMzYsMzQwNzEsMzQwNzIsMzQwOTIsMzQwNzksMzQwNjksMzQwNjgsMzQwNDQsMzQxMTIsMzQxNDcsMzQxMzYsMzQxMjAsMzQxMTMsMzQzMDYsMzQxMjMsMzQxMzMsMzQxNzYsMzQyMTIsMzQxODQsMzQxOTMsMzQxODYsMzQyMTYsMzQxNTcsMzQxOTYsMzQyMDMsMzQyODIsMzQxODMsMzQyMDQsMzQxNjcsMzQxNzQsMzQxOTIsMzQyNDksMzQyMzQsMzQyNTUsMzQyMzMsMzQyNTYsMzQyNjEsMzQyNjksMzQyNzcsMzQyNjgsMzQyOTcsMzQzMTQsMzQzMjMsMzQzMTUsMzQzMDIsMzQyOTgsMzQzMTAsMzQzMzgsMzQzMzAsMzQzNTIsMzQzNjcsMzQzODEsMjAwNTMsMzQzODgsMzQzOTksMzQ0MDcsMzQ0MTcsMzQ0NTEsMzQ0NjcsMzQ0NzMsMzQ0NzQsMzQ0NDMsMzQ0NDQsMzQ0ODYsMzQ0NzksMzQ1MDAsMzQ1MDIsMzQ0ODAsMzQ1MDUsMzQ4NTEsMzQ0NzUsMzQ1MTYsMzQ1MjYsMzQ1MzcsMzQ1NDAsMzQ1MjcsMzQ1MjMsMzQ1NDMsMzQ1NzgsMzQ1NjYsMzQ1NjgsMzQ1NjAsMzQ1NjMsMzQ1NTUsMzQ1NzcsMzQ1NjksMzQ1NzMsMzQ1NTMsMzQ1NzAsMzQ2MTIsMzQ2MjMsMzQ2MTUsMzQ2MTksMzQ1OTcsMzQ2MDEsMzQ1ODYsMzQ2NTYsMzQ2NTUsMzQ2ODAsMzQ2MzYsMzQ2MzgsMzQ2NzYsMzQ2NDcsMzQ2NjQsMzQ2NzAsMzQ2NDksMzQ2NDMsMzQ2NTksMzQ2NjYsMzQ4MjEsMzQ3MjIsMzQ3MTksMzQ2OTAsMzQ3MzUsMzQ3NjMsMzQ3NDksMzQ3NTIsMzQ3NjgsMzg2MTQsMzQ3MzEsMzQ3NTYsMzQ3MzksMzQ3NTksMzQ3NTgsMzQ3NDcsMzQ3OTksMzQ4MDIsMzQ3ODQsMzQ4MzEsMzQ4MjksMzQ4MTQsMzQ4MDYsMzQ4MDcsMzQ4MzAsMzQ3NzAsMzQ4MzMsMzQ4MzgsMzQ4MzcsMzQ4NTAsMzQ4NDksMzQ4NjUsMzQ4NzAsMzQ4NzMsMzQ4NTUsMzQ4NzUsMzQ4ODQsMzQ4ODIsMzQ4OTgsMzQ5MDUsMzQ5MTAsMzQ5MTQsMzQ5MjMsMzQ5NDUsMzQ5NDIsMzQ5NzQsMzQ5MzMsMzQ5NDEsMzQ5OTcsMzQ5MzAsMzQ5NDYsMzQ5NjcsMzQ5NjIsMzQ5OTAsMzQ5NjksMzQ5NzgsMzQ5NTcsMzQ5ODAsMzQ5OTIsMzUwMDcsMzQ5OTMsMzUwMTEsMzUwMTIsMzUwMjgsMzUwMzIsMzUwMzMsMzUwMzcsMzUwNjUsMzUwNzQsMzUwNjgsMzUwNjAsMzUwNDgsMzUwNTgsMzUwNzYsMzUwODQsMzUwODIsMzUwOTEsMzUxMzksMzUxMDIsMzUxMDksMzUxMTQsMzUxMTUsMzUxMzcsMzUxNDAsMzUxMzEsMzUxMjYsMzUxMjgsMzUxNDgsMzUxMDEsMzUxNjgsMzUxNjYsMzUxNzQsMzUxNzIsMzUxODEsMzUxNzgsMzUxODMsMzUxODgsMzUxOTEsMzUxOTgsMzUyMDMsMzUyMDgsMzUyMTAsMzUyMTksMzUyMjQsMzUyMzMsMzUyNDEsMzUyMzgsMzUyNDQsMzUyNDcsMzUyNTAsMzUyNTgsMzUyNjEsMzUyNjMsMzUyNjQsMzUyOTAsMzUyOTIsMzUyOTMsMzUzMDMsMzUzMTYsMzUzMjAsMzUzMzEsMzUzNTAsMzUzNDQsMzUzNDAsMzUzNTUsMzUzNTcsMzUzNjUsMzUzODIsMzUzOTMsMzU0MTksMzU0MTAsMzUzOTgsMzU0MDAsMzU0NTIsMzU0MzcsMzU0MzYsMzU0MjYsMzU0NjEsMzU0NTgsMzU0NjAsMzU0OTYsMzU0ODksMzU0NzMsMzU0OTMsMzU0OTQsMzU0ODIsMzU0OTEsMzU1MjQsMzU1MzMsMzU1MjIsMzU1NDYsMzU1NjMsMzU1NzEsMzU1NTksMzU1NTYsMzU1NjksMzU2MDQsMzU1NTIsMzU1NTQsMzU1NzUsMzU1NTAsMzU1NDcsMzU1OTYsMzU1OTEsMzU2MTAsMzU1NTMsMzU2MDYsMzU2MDAsMzU2MDcsMzU2MTYsMzU2MzUsMzg4MjcsMzU2MjIsMzU2MjcsMzU2NDYsMzU2MjQsMzU2NDksMzU2NjAsMzU2NjMsMzU2NjIsMzU2NTcsMzU2NzAsMzU2NzUsMzU2NzQsMzU2OTEsMzU2NzksMzU2OTIsMzU2OTUsMzU3MDAsMzU3MDksMzU3MTIsMzU3MjQsMzU3MjYsMzU3MzAsMzU3MzEsMzU3MzQsMzU3MzcsMzU3MzgsMzU4OTgsMzU5MDUsMzU5MDMsMzU5MTIsMzU5MTYsMzU5MTgsMzU5MjAsMzU5MjUsMzU5MzgsMzU5NDgsMzU5NjAsMzU5NjIsMzU5NzAsMzU5NzcsMzU5NzMsMzU5NzgsMzU5ODEsMzU5ODIsMzU5ODgsMzU5NjQsMzU5OTIsMjUxMTcsMzYwMTMsMzYwMTAsMzYwMjksMzYwMTgsMzYwMTksMzYwMTQsMzYwMjIsMzYwNDAsMzYwMzMsMzYwNjgsMzYwNjcsMzYwNTgsMzYwOTMsMzYwOTAsMzYwOTEsMzYxMDAsMzYxMDEsMzYxMDYsMzYxMDMsMzYxMTEsMzYxMDksMzYxMTIsNDA3ODIsMzYxMTUsMzYwNDUsMzYxMTYsMzYxMTgsMzYxOTksMzYyMDUsMzYyMDksMzYyMTEsMzYyMjUsMzYyNDksMzYyOTAsMzYyODYsMzYyODIsMzYzMDMsMzYzMTQsMzYzMTAsMzYzMDAsMzYzMTUsMzYyOTksMzYzMzAsMzYzMzEsMzYzMTksMzYzMjMsMzYzNDgsMzYzNjAsMzYzNjEsMzYzNTEsMzYzODEsMzYzODIsMzYzNjgsMzYzODMsMzY0MTgsMzY0MDUsMzY0MDAsMzY0MDQsMzY0MjYsMzY0MjMsMzY0MjUsMzY0MjgsMzY0MzIsMzY0MjQsMzY0NDEsMzY0NTIsMzY0NDgsMzYzOTQsMzY0NTEsMzY0MzcsMzY0NzAsMzY0NjYsMzY0NzYsMzY0ODEsMzY0ODcsMzY0ODUsMzY0ODQsMzY0OTEsMzY0OTAsMzY0OTksMzY0OTcsMzY1MDAsMzY1MDUsMzY1MjIsMzY1MTMsMzY1MjQsMzY1MjgsMzY1NTAsMzY1MjksMzY1NDIsMzY1NDksMzY1NTIsMzY1NTUsMzY1NzEsMzY1NzksMzY2MDQsMzY2MDMsMzY1ODcsMzY2MDYsMzY2MTgsMzY2MTMsMzY2MjksMzY2MjYsMzY2MzMsMzY2MjcsMzY2MzYsMzY2MzksMzY2MzUsMzY2MjAsMzY2NDYsMzY2NTksMzY2NjcsMzY2NjUsMzY2NzcsMzY2NzQsMzY2NzAsMzY2ODQsMzY2ODEsMzY2NzgsMzY2ODYsMzY2OTUsMzY3MDAsMzY3MDYsMzY3MDcsMzY3MDgsMzY3NjQsMzY3NjcsMzY3NzEsMzY3ODEsMzY3ODMsMzY3OTEsMzY4MjYsMzY4MzcsMzY4MzQsMzY4NDIsMzY4NDcsMzY5OTksMzY4NTIsMzY4NjksMzY4NTcsMzY4NTgsMzY4ODEsMzY4ODUsMzY4OTcsMzY4NzcsMzY4OTQsMzY4ODYsMzY4NzUsMzY5MDMsMzY5MTgsMzY5MTcsMzY5MjEsMzY4NTYsMzY5NDMsMzY5NDQsMzY5NDUsMzY5NDYsMzY4NzgsMzY5MzcsMzY5MjYsMzY5NTAsMzY5NTIsMzY5NTgsMzY5NjgsMzY5NzUsMzY5ODIsMzg1NjgsMzY5NzgsMzY5OTQsMzY5ODksMzY5OTMsMzY5OTIsMzcwMDIsMzcwMDEsMzcwMDcsMzcwMzIsMzcwMzksMzcwNDEsMzcwNDUsMzcwOTAsMzcwOTIsMjUxNjAsMzcwODMsMzcxMjIsMzcxMzgsMzcxNDUsMzcxNzAsMzcxNjgsMzcxOTQsMzcyMDYsMzcyMDgsMzcyMTksMzcyMjEsMzcyMjUsMzcyMzUsMzcyMzQsMzcyNTksMzcyNTcsMzcyNTAsMzcyODIsMzcyOTEsMzcyOTUsMzcyOTAsMzczMDEsMzczMDAsMzczMDYsMzczMTIsMzczMTMsMzczMjEsMzczMjMsMzczMjgsMzczMzQsMzczNDMsMzczNDUsMzczMzksMzczNzIsMzczNjUsMzczNjYsMzc0MDYsMzczNzUsMzczOTYsMzc0MjAsMzczOTcsMzczOTMsMzc0NzAsMzc0NjMsMzc0NDUsMzc0NDksMzc0NzYsMzc0NDgsMzc1MjUsMzc0MzksMzc0NTEsMzc0NTYsMzc1MzIsMzc1MjYsMzc1MjMsMzc1MzEsMzc0NjYsMzc1ODMsMzc1NjEsMzc1NTksMzc2MDksMzc2NDcsMzc2MjYsMzc3MDAsMzc2NzgsMzc2NTcsMzc2NjYsMzc2NTgsMzc2NjcsMzc2OTAsMzc2ODUsMzc2OTEsMzc3MjQsMzc3MjgsMzc3NTYsMzc3NDIsMzc3MTgsMzc4MDgsMzc4MDQsMzc4MDUsMzc3ODAsMzc4MTcsMzc4NDYsMzc4NDcsMzc4NjQsMzc4NjEsMzc4NDgsMzc4MjcsMzc4NTMsMzc4NDAsMzc4MzIsMzc4NjAsMzc5MTQsMzc5MDgsMzc5MDcsMzc4OTEsMzc4OTUsMzc5MDQsMzc5NDIsMzc5MzEsMzc5NDEsMzc5MjEsMzc5NDYsMzc5NTMsMzc5NzAsMzc5NTYsMzc5NzksMzc5ODQsMzc5ODYsMzc5ODIsMzc5OTQsMzc0MTcsMzgwMDAsMzgwMDUsMzgwMDcsMzgwMTMsMzc5NzgsMzgwMTIsMzgwMTQsMzgwMTcsMzgwMTUsMzgyNzQsMzgyNzksMzgyODIsMzgyOTIsMzgyOTQsMzgyOTYsMzgyOTcsMzgzMDQsMzgzMTIsMzgzMTEsMzgzMTcsMzgzMzIsMzgzMzEsMzgzMjksMzgzMzQsMzgzNDYsMjg2NjIsMzgzMzksMzgzNDksMzgzNDgsMzgzNTcsMzgzNTYsMzgzNTgsMzgzNjQsMzgzNjksMzgzNzMsMzgzNzAsMzg0MzMsMzg0NDAsMzg0NDYsMzg0NDcsMzg0NjYsMzg0NzYsMzg0NzksMzg0NzUsMzg1MTksMzg0OTIsMzg0OTQsMzg0OTMsMzg0OTUsMzg1MDIsMzg1MTQsMzg1MDgsMzg1NDEsMzg1NTIsMzg1NDksMzg1NTEsMzg1NzAsMzg1NjcsMzg1NzcsMzg1NzgsMzg1NzYsMzg1ODAsMzg1ODIsMzg1ODQsMzg1ODUsMzg2MDYsMzg2MDMsMzg2MDEsMzg2MDUsMzUxNDksMzg2MjAsMzg2NjksMzg2MTMsMzg2NDksMzg2NjAsMzg2NjIsMzg2NjQsMzg2NzUsMzg2NzAsMzg2NzMsMzg2NzEsMzg2NzgsMzg2ODEsMzg2OTIsMzg2OTgsMzg3MDQsMzg3MTMsMzg3MTcsMzg3MTgsMzg3MjQsMzg3MjYsMzg3MjgsMzg3MjIsMzg3MjksMzg3NDgsMzg3NTIsMzg3NTYsMzg3NTgsMzg3NjAsMjEyMDIsMzg3NjMsMzg3NjksMzg3NzcsMzg3ODksMzg3ODAsMzg3ODUsMzg3NzgsMzg3OTAsMzg3OTUsMzg3OTksMzg4MDAsMzg4MTIsMzg4MjQsMzg4MjIsMzg4MTksMzg4MzUsMzg4MzYsMzg4NTEsMzg4NTQsMzg4NTYsMzg4NTksMzg4NzYsMzg4OTMsNDA3ODMsMzg4OTgsMzE0NTUsMzg5MDIsMzg5MDEsMzg5MjcsMzg5MjQsMzg5NjgsMzg5NDgsMzg5NDUsMzg5NjcsMzg5NzMsMzg5ODIsMzg5OTEsMzg5ODcsMzkwMTksMzkwMjMsMzkwMjQsMzkwMjUsMzkwMjgsMzkwMjcsMzkwODIsMzkwODcsMzkwODksMzkwOTQsMzkxMDgsMzkxMDcsMzkxMTAsMzkxNDUsMzkxNDcsMzkxNzEsMzkxNzcsMzkxODYsMzkxODgsMzkxOTIsMzkyMDEsMzkxOTcsMzkxOTgsMzkyMDQsMzkyMDAsMzkyMTIsMzkyMTQsMzkyMjksMzkyMzAsMzkyMzQsMzkyNDEsMzkyMzcsMzkyNDgsMzkyNDMsMzkyNDksMzkyNTAsMzkyNDQsMzkyNTMsMzkzMTksMzkzMjAsMzkzMzMsMzkzNDEsMzkzNDIsMzkzNTYsMzkzOTEsMzkzODcsMzkzODksMzkzODQsMzkzNzcsMzk0MDUsMzk0MDYsMzk0MDksMzk0MTAsMzk0MTksMzk0MTYsMzk0MjUsMzk0MzksMzk0MjksMzkzOTQsMzk0NDksMzk0NjcsMzk0NzksMzk0OTMsMzk0OTAsMzk0ODgsMzk0OTEsMzk0ODYsMzk1MDksMzk1MDEsMzk1MTUsMzk1MTEsMzk1MTksMzk1MjIsMzk1MjUsMzk1MjQsMzk1MjksMzk1MzEsMzk1MzAsMzk1OTcsMzk2MDAsMzk2MTIsMzk2MTYsMzk2MzEsMzk2MzMsMzk2MzUsMzk2MzYsMzk2NDYsMzk2NDcsMzk2NTAsMzk2NTEsMzk2NTQsMzk2NjMsMzk2NTksMzk2NjIsMzk2NjgsMzk2NjUsMzk2NzEsMzk2NzUsMzk2ODYsMzk3MDQsMzk3MDYsMzk3MTEsMzk3MTQsMzk3MTUsMzk3MTcsMzk3MTksMzk3MjAsMzk3MjEsMzk3MjIsMzk3MjYsMzk3MjcsMzk3MzAsMzk3NDgsMzk3NDcsMzk3NTksMzk3NTcsMzk3NTgsMzk3NjEsMzk3NjgsMzk3OTYsMzk4MjcsMzk4MTEsMzk4MjUsMzk4MzAsMzk4MzEsMzk4MzksMzk4NDAsMzk4NDgsMzk4NjAsMzk4NzIsMzk4ODIsMzk4NjUsMzk4NzgsMzk4ODcsMzk4ODksMzk4OTAsMzk5MDcsMzk5MDYsMzk5MDgsMzk4OTIsMzk5MDUsMzk5OTQsMzk5MjIsMzk5MjEsMzk5MjAsMzk5NTcsMzk5NTYsMzk5NDUsMzk5NTUsMzk5NDgsMzk5NDIsMzk5NDQsMzk5NTQsMzk5NDYsMzk5NDAsMzk5ODIsMzk5NjMsMzk5NzMsMzk5NzIsMzk5NjksMzk5ODQsNDAwMDcsMzk5ODYsNDAwMDYsMzk5OTgsNDAwMjYsNDAwMzIsNDAwMzksNDAwNTQsNDAwNTYsNDAxNjcsNDAxNzIsNDAxNzYsNDAyMDEsNDAyMDAsNDAxNzEsNDAxOTUsNDAxOTgsNDAyMzQsNDAyMzAsNDAzNjcsNDAyMjcsNDAyMjMsNDAyNjAsNDAyMTMsNDAyMTAsNDAyNTcsNDAyNTUsNDAyNTQsNDAyNjIsNDAyNjQsNDAyODUsNDAyODYsNDAyOTIsNDAyNzMsNDAyNzIsNDAyODEsNDAzMDYsNDAzMjksNDAzMjcsNDAzNjMsNDAzMDMsNDAzMTQsNDAzNDYsNDAzNTYsNDAzNjEsNDAzNzAsNDAzODgsNDAzODUsNDAzNzksNDAzNzYsNDAzNzgsNDAzOTAsNDAzOTksNDAzODYsNDA0MDksNDA0MDMsNDA0NDAsNDA0MjIsNDA0MjksNDA0MzEsNDA0NDUsNDA0NzQsNDA0NzUsNDA0NzgsNDA1NjUsNDA1NjksNDA1NzMsNDA1NzcsNDA1ODQsNDA1ODcsNDA1ODgsNDA1OTQsNDA1OTcsNDA1OTMsNDA2MDUsNDA2MTMsNDA2MTcsNDA2MzIsNDA2MTgsNDA2MjEsMzg3NTMsNDA2NTIsNDA2NTQsNDA2NTUsNDA2NTYsNDA2NjAsNDA2NjgsNDA2NzAsNDA2NjksNDA2NzIsNDA2NzcsNDA2ODAsNDA2ODcsNDA2OTIsNDA2OTQsNDA2OTUsNDA2OTcsNDA2OTksNDA3MDAsNDA3MDEsNDA3MTEsNDA3MTIsMzAzOTEsNDA3MjUsNDA3MzcsNDA3NDgsNDA3NjYsNDA3NzgsNDA3ODYsNDA3ODgsNDA4MDMsNDA3OTksNDA4MDAsNDA4MDEsNDA4MDYsNDA4MDcsNDA4MTIsNDA4MTAsNDA4MjMsNDA4MTgsNDA4MjIsNDA4NTMsNDA4NjAsNDA4NjQsMjI1NzUsMjcwNzksMzY5NTMsMjk3OTYsMjA5NTYsMjkwODEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyMzk0LDM1MTAwLDM3NzA0LDM3NTEyLDM0MDEyLDIwNDI1LDI4ODU5LDI2MTYxLDI2ODI0LDM3NjI1LDI2MzYzLDI0Mzg5LDIwMDA4LDIwMTkzLDIwMjIwLDIwMjI0LDIwMjI3LDIwMjgxLDIwMzEwLDIwMzcwLDIwMzYyLDIwMzc4LDIwMzcyLDIwNDI5LDIwNTQ0LDIwNTE0LDIwNDc5LDIwNTEwLDIwNTUwLDIwNTkyLDIwNTQ2LDIwNjI4LDIwNzI0LDIwNjk2LDIwODEwLDIwODM2LDIwODkzLDIwOTI2LDIwOTcyLDIxMDEzLDIxMTQ4LDIxMTU4LDIxMTg0LDIxMjExLDIxMjQ4LDIxMjU1LDIxMjg0LDIxMzYyLDIxMzk1LDIxNDI2LDIxNDY5LDY0MDE0LDIxNjYwLDIxNjQyLDIxNjczLDIxNzU5LDIxODk0LDIyMzYxLDIyMzczLDIyNDQ0LDIyNDcyLDIyNDcxLDY0MDE1LDY0MDE2LDIyNjg2LDIyNzA2LDIyNzk1LDIyODY3LDIyODc1LDIyODc3LDIyODgzLDIyOTQ4LDIyOTcwLDIzMzgyLDIzNDg4LDI5OTk5LDIzNTEyLDIzNTMyLDIzNTgyLDIzNzE4LDIzNzM4LDIzNzk3LDIzODQ3LDIzODkxLDY0MDE3LDIzODc0LDIzOTE3LDIzOTkyLDIzOTkzLDI0MDE2LDI0MzUzLDI0MzcyLDI0NDIzLDI0NTAzLDI0NTQyLDI0NjY5LDI0NzA5LDI0NzE0LDI0Nzk4LDI0Nzg5LDI0ODY0LDI0ODE4LDI0ODQ5LDI0ODg3LDI0ODgwLDI0OTg0LDI1MTA3LDI1MjU0LDI1NTg5LDI1Njk2LDI1NzU3LDI1ODA2LDI1OTM0LDI2MTEyLDI2MTMzLDI2MTcxLDI2MTIxLDI2MTU4LDI2MTQyLDI2MTQ4LDI2MjEzLDI2MTk5LDI2MjAxLDY0MDE4LDI2MjI3LDI2MjY1LDI2MjcyLDI2MjkwLDI2MzAzLDI2MzYyLDI2MzgyLDYzNzg1LDI2NDcwLDI2NTU1LDI2NzA2LDI2NTYwLDI2NjI1LDI2NjkyLDI2ODMxLDY0MDE5LDI2OTg0LDY0MDIwLDI3MDMyLDI3MTA2LDI3MTg0LDI3MjQzLDI3MjA2LDI3MjUxLDI3MjYyLDI3MzYyLDI3MzY0LDI3NjA2LDI3NzExLDI3NzQwLDI3NzgyLDI3NzU5LDI3ODY2LDI3OTA4LDI4MDM5LDI4MDE1LDI4MDU0LDI4MDc2LDI4MTExLDI4MTUyLDI4MTQ2LDI4MTU2LDI4MjE3LDI4MjUyLDI4MTk5LDI4MjIwLDI4MzUxLDI4NTUyLDI4NTk3LDI4NjYxLDI4Njc3LDI4Njc5LDI4NzEyLDI4ODA1LDI4ODQzLDI4OTQzLDI4OTMyLDI5MDIwLDI4OTk4LDI4OTk5LDY0MDIxLDI5MTIxLDI5MTgyLDI5MzYxLDI5Mzc0LDI5NDc2LDY0MDIyLDI5NTU5LDI5NjI5LDI5NjQxLDI5NjU0LDI5NjY3LDI5NjUwLDI5NzAzLDI5Njg1LDI5NzM0LDI5NzM4LDI5NzM3LDI5NzQyLDI5Nzk0LDI5ODMzLDI5ODU1LDI5OTUzLDMwMDYzLDMwMzM4LDMwMzY0LDMwMzY2LDMwMzYzLDMwMzc0LDY0MDIzLDMwNTM0LDIxMTY3LDMwNzUzLDMwNzk4LDMwODIwLDMwODQyLDMxMDI0LDY0MDI0LDY0MDI1LDY0MDI2LDMxMTI0LDY0MDI3LDMxMTMxLDMxNDQxLDMxNDYzLDY0MDI4LDMxNDY3LDMxNjQ2LDY0MDI5LDMyMDcyLDMyMDkyLDMyMTgzLDMyMTYwLDMyMjE0LDMyMzM4LDMyNTgzLDMyNjczLDY0MDMwLDMzNTM3LDMzNjM0LDMzNjYzLDMzNzM1LDMzNzgyLDMzODY0LDMzOTcyLDM0MTMxLDM0MTM3LDM0MTU1LDY0MDMxLDM0MjI0LDY0MDMyLDY0MDMzLDM0ODIzLDM1MDYxLDM1MzQ2LDM1MzgzLDM1NDQ5LDM1NDk1LDM1NTE4LDM1NTUxLDY0MDM0LDM1NTc0LDM1NjY3LDM1NzExLDM2MDgwLDM2MDg0LDM2MTE0LDM2MjE0LDY0MDM1LDM2NTU5LDY0MDM2LDY0MDM3LDM2OTY3LDM3MDg2LDY0MDM4LDM3MTQxLDM3MTU5LDM3MzM4LDM3MzM1LDM3MzQyLDM3MzU3LDM3MzU4LDM3MzQ4LDM3MzQ5LDM3MzgyLDM3MzkyLDM3Mzg2LDM3NDM0LDM3NDQwLDM3NDM2LDM3NDU0LDM3NDY1LDM3NDU3LDM3NDMzLDM3NDc5LDM3NTQzLDM3NDk1LDM3NDk2LDM3NjA3LDM3NTkxLDM3NTkzLDM3NTg0LDY0MDM5LDM3NTg5LDM3NjAwLDM3NTg3LDM3NjY5LDM3NjY1LDM3NjI3LDY0MDQwLDM3NjYyLDM3NjMxLDM3NjYxLDM3NjM0LDM3NzQ0LDM3NzE5LDM3Nzk2LDM3ODMwLDM3ODU0LDM3ODgwLDM3OTM3LDM3OTU3LDM3OTYwLDM4MjkwLDYzOTY0LDY0MDQxLDM4NTU3LDM4NTc1LDM4NzA3LDM4NzE1LDM4NzIzLDM4NzMzLDM4NzM1LDM4NzM3LDM4NzQxLDM4OTk5LDM5MDEzLDY0MDQyLDY0MDQzLDM5MjA3LDY0MDQ0LDM5MzI2LDM5NTAyLDM5NjQxLDM5NjQ0LDM5Nzk3LDM5Nzk0LDM5ODIzLDM5ODU3LDM5ODY3LDM5OTM2LDQwMzA0LDQwMjk5LDY0MDQ1LDQwNDczLDQwNjU3LG51bGwsbnVsbCw4NTYwLDg1NjEsODU2Miw4NTYzLDg1NjQsODU2NSw4NTY2LDg1NjcsODU2OCw4NTY5LDY1NTA2LDY1NTA4LDY1Mjg3LDY1MjgyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODU2MCw4NTYxLDg1NjIsODU2Myw4NTY0LDg1NjUsODU2Niw4NTY3LDg1NjgsODU2OSw4NTQ0LDg1NDUsODU0Niw4NTQ3LDg1NDgsODU0OSw4NTUwLDg1NTEsODU1Miw4NTUzLDY1NTA2LDY1NTA4LDY1Mjg3LDY1MjgyLDEyODQ5LDg0NzAsODQ4MSw4NzU3LDMyMzk0LDM1MTAwLDM3NzA0LDM3NTEyLDM0MDEyLDIwNDI1LDI4ODU5LDI2MTYxLDI2ODI0LDM3NjI1LDI2MzYzLDI0Mzg5LDIwMDA4LDIwMTkzLDIwMjIwLDIwMjI0LDIwMjI3LDIwMjgxLDIwMzEwLDIwMzcwLDIwMzYyLDIwMzc4LDIwMzcyLDIwNDI5LDIwNTQ0LDIwNTE0LDIwNDc5LDIwNTEwLDIwNTUwLDIwNTkyLDIwNTQ2LDIwNjI4LDIwNzI0LDIwNjk2LDIwODEwLDIwODM2LDIwODkzLDIwOTI2LDIwOTcyLDIxMDEzLDIxMTQ4LDIxMTU4LDIxMTg0LDIxMjExLDIxMjQ4LDIxMjU1LDIxMjg0LDIxMzYyLDIxMzk1LDIxNDI2LDIxNDY5LDY0MDE0LDIxNjYwLDIxNjQyLDIxNjczLDIxNzU5LDIxODk0LDIyMzYxLDIyMzczLDIyNDQ0LDIyNDcyLDIyNDcxLDY0MDE1LDY0MDE2LDIyNjg2LDIyNzA2LDIyNzk1LDIyODY3LDIyODc1LDIyODc3LDIyODgzLDIyOTQ4LDIyOTcwLDIzMzgyLDIzNDg4LDI5OTk5LDIzNTEyLDIzNTMyLDIzNTgyLDIzNzE4LDIzNzM4LDIzNzk3LDIzODQ3LDIzODkxLDY0MDE3LDIzODc0LDIzOTE3LDIzOTkyLDIzOTkzLDI0MDE2LDI0MzUzLDI0MzcyLDI0NDIzLDI0NTAzLDI0NTQyLDI0NjY5LDI0NzA5LDI0NzE0LDI0Nzk4LDI0Nzg5LDI0ODY0LDI0ODE4LDI0ODQ5LDI0ODg3LDI0ODgwLDI0OTg0LDI1MTA3LDI1MjU0LDI1NTg5LDI1Njk2LDI1NzU3LDI1ODA2LDI1OTM0LDI2MTEyLDI2MTMzLDI2MTcxLDI2MTIxLDI2MTU4LDI2MTQyLDI2MTQ4LDI2MjEzLDI2MTk5LDI2MjAxLDY0MDE4LDI2MjI3LDI2MjY1LDI2MjcyLDI2MjkwLDI2MzAzLDI2MzYyLDI2MzgyLDYzNzg1LDI2NDcwLDI2NTU1LDI2NzA2LDI2NTYwLDI2NjI1LDI2NjkyLDI2ODMxLDY0MDE5LDI2OTg0LDY0MDIwLDI3MDMyLDI3MTA2LDI3MTg0LDI3MjQzLDI3MjA2LDI3MjUxLDI3MjYyLDI3MzYyLDI3MzY0LDI3NjA2LDI3NzExLDI3NzQwLDI3NzgyLDI3NzU5LDI3ODY2LDI3OTA4LDI4MDM5LDI4MDE1LDI4MDU0LDI4MDc2LDI4MTExLDI4MTUyLDI4MTQ2LDI4MTU2LDI4MjE3LDI4MjUyLDI4MTk5LDI4MjIwLDI4MzUxLDI4NTUyLDI4NTk3LDI4NjYxLDI4Njc3LDI4Njc5LDI4NzEyLDI4ODA1LDI4ODQzLDI4OTQzLDI4OTMyLDI5MDIwLDI4OTk4LDI4OTk5LDY0MDIxLDI5MTIxLDI5MTgyLDI5MzYxLDI5Mzc0LDI5NDc2LDY0MDIyLDI5NTU5LDI5NjI5LDI5NjQxLDI5NjU0LDI5NjY3LDI5NjUwLDI5NzAzLDI5Njg1LDI5NzM0LDI5NzM4LDI5NzM3LDI5NzQyLDI5Nzk0LDI5ODMzLDI5ODU1LDI5OTUzLDMwMDYzLDMwMzM4LDMwMzY0LDMwMzY2LDMwMzYzLDMwMzc0LDY0MDIzLDMwNTM0LDIxMTY3LDMwNzUzLDMwNzk4LDMwODIwLDMwODQyLDMxMDI0LDY0MDI0LDY0MDI1LDY0MDI2LDMxMTI0LDY0MDI3LDMxMTMxLDMxNDQxLDMxNDYzLDY0MDI4LDMxNDY3LDMxNjQ2LDY0MDI5LDMyMDcyLDMyMDkyLDMyMTgzLDMyMTYwLDMyMjE0LDMyMzM4LDMyNTgzLDMyNjczLDY0MDMwLDMzNTM3LDMzNjM0LDMzNjYzLDMzNzM1LDMzNzgyLDMzODY0LDMzOTcyLDM0MTMxLDM0MTM3LDM0MTU1LDY0MDMxLDM0MjI0LDY0MDMyLDY0MDMzLDM0ODIzLDM1MDYxLDM1MzQ2LDM1MzgzLDM1NDQ5LDM1NDk1LDM1NTE4LDM1NTUxLDY0MDM0LDM1NTc0LDM1NjY3LDM1NzExLDM2MDgwLDM2MDg0LDM2MTE0LDM2MjE0LDY0MDM1LDM2NTU5LDY0MDM2LDY0MDM3LDM2OTY3LDM3MDg2LDY0MDM4LDM3MTQxLDM3MTU5LDM3MzM4LDM3MzM1LDM3MzQyLDM3MzU3LDM3MzU4LDM3MzQ4LDM3MzQ5LDM3MzgyLDM3MzkyLDM3Mzg2LDM3NDM0LDM3NDQwLDM3NDM2LDM3NDU0LDM3NDY1LDM3NDU3LDM3NDMzLDM3NDc5LDM3NTQzLDM3NDk1LDM3NDk2LDM3NjA3LDM3NTkxLDM3NTkzLDM3NTg0LDY0MDM5LDM3NTg5LDM3NjAwLDM3NTg3LDM3NjY5LDM3NjY1LDM3NjI3LDY0MDQwLDM3NjYyLDM3NjMxLDM3NjYxLDM3NjM0LDM3NzQ0LDM3NzE5LDM3Nzk2LDM3ODMwLDM3ODU0LDM3ODgwLDM3OTM3LDM3OTU3LDM3OTYwLDM4MjkwLDYzOTY0LDY0MDQxLDM4NTU3LDM4NTc1LDM4NzA3LDM4NzE1LDM4NzIzLDM4NzMzLDM4NzM1LDM4NzM3LDM4NzQxLDM4OTk5LDM5MDEzLDY0MDQyLDY0MDQzLDM5MjA3LDY0MDQ0LDM5MzI2LDM5NTAyLDM5NjQxLDM5NjQ0LDM5Nzk3LDM5Nzk0LDM5ODIzLDM5ODU3LDM5ODY3LDM5OTM2LDQwMzA0LDQwMjk5LDY0MDQ1LDQwNDczLDQwNjU3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXG4gIFwiamlzMDIxMlwiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw3MjgsNzExLDE4NCw3MjksNzMzLDE3NSw3MzEsNzMwLDY1Mzc0LDkwMCw5MDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE2MSwxNjYsMTkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxODYsMTcwLDE2OSwxNzQsODQ4MiwxNjQsODQ3MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTAyLDkwNCw5MDUsOTA2LDkzOCxudWxsLDkwOCxudWxsLDkxMCw5MzksbnVsbCw5MTEsbnVsbCxudWxsLG51bGwsbnVsbCw5NDAsOTQxLDk0Miw5NDMsOTcwLDkxMiw5NzIsOTYyLDk3Myw5NzEsOTQ0LDk3NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDEwMzgsMTAzOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDExMTgsMTExOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE5OCwyNzIsbnVsbCwyOTQsbnVsbCwzMDYsbnVsbCwzMjEsMzE5LG51bGwsMzMwLDIxNiwzMzgsbnVsbCwzNTgsMjIyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjMwLDI3MywyNDAsMjk1LDMwNSwzMDcsMzEyLDMyMiwzMjAsMzI5LDMzMSwyNDgsMzM5LDIyMywzNTksMjU0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTkzLDE5MiwxOTYsMTk0LDI1OCw0NjEsMjU2LDI2MCwxOTcsMTk1LDI2MiwyNjQsMjY4LDE5OSwyNjYsMjcwLDIwMSwyMDAsMjAzLDIwMiwyODIsMjc4LDI3NCwyODAsbnVsbCwyODQsMjg2LDI5MCwyODgsMjkyLDIwNSwyMDQsMjA3LDIwNiw0NjMsMzA0LDI5OCwzMDIsMjk2LDMwOCwzMTAsMzEzLDMxNywzMTUsMzIzLDMyNywzMjUsMjA5LDIxMSwyMTAsMjE0LDIxMiw0NjUsMzM2LDMzMiwyMTMsMzQwLDM0NCwzNDIsMzQ2LDM0OCwzNTIsMzUwLDM1NiwzNTQsMjE4LDIxNywyMjAsMjE5LDM2NCw0NjcsMzY4LDM2MiwzNzAsMzY2LDM2MCw0NzEsNDc1LDQ3Myw0NjksMzcyLDIyMSwzNzYsMzc0LDM3NywzODEsMzc5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjI1LDIyNCwyMjgsMjI2LDI1OSw0NjIsMjU3LDI2MSwyMjksMjI3LDI2MywyNjUsMjY5LDIzMSwyNjcsMjcxLDIzMywyMzIsMjM1LDIzNCwyODMsMjc5LDI3NSwyODEsNTAxLDI4NSwyODcsbnVsbCwyODksMjkzLDIzNywyMzYsMjM5LDIzOCw0NjQsbnVsbCwyOTksMzAzLDI5NywzMDksMzExLDMxNCwzMTgsMzE2LDMyNCwzMjgsMzI2LDI0MSwyNDMsMjQyLDI0NiwyNDQsNDY2LDMzNywzMzMsMjQ1LDM0MSwzNDUsMzQzLDM0NywzNDksMzUzLDM1MSwzNTcsMzU1LDI1MCwyNDksMjUyLDI1MSwzNjUsNDY4LDM2OSwzNjMsMzcxLDM2NywzNjEsNDcyLDQ3Niw0NzQsNDcwLDM3MywyNTMsMjU1LDM3NSwzNzgsMzgyLDM4MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTk5NzAsMTk5NzIsMTk5NzMsMTk5ODAsMTk5ODYsMTk5OTksMjAwMDMsMjAwMDQsMjAwMDgsMjAwMTEsMjAwMTQsMjAwMTUsMjAwMTYsMjAwMjEsMjAwMzIsMjAwMzMsMjAwMzYsMjAwMzksMjAwNDksMjAwNTgsMjAwNjAsMjAwNjcsMjAwNzIsMjAwNzMsMjAwODQsMjAwODUsMjAwODksMjAwOTUsMjAxMDksMjAxMTgsMjAxMTksMjAxMjUsMjAxNDMsMjAxNTMsMjAxNjMsMjAxNzYsMjAxODYsMjAxODcsMjAxOTIsMjAxOTMsMjAxOTQsMjAyMDAsMjAyMDcsMjAyMDksMjAyMTEsMjAyMTMsMjAyMjEsMjAyMjIsMjAyMjMsMjAyMjQsMjAyMjYsMjAyMjcsMjAyMzIsMjAyMzUsMjAyMzYsMjAyNDIsMjAyNDUsMjAyNDYsMjAyNDcsMjAyNDksMjAyNzAsMjAyNzMsMjAzMjAsMjAyNzUsMjAyNzcsMjAyNzksMjAyODEsMjAyODMsMjAyODYsMjAyODgsMjAyOTAsMjAyOTYsMjAyOTcsMjAyOTksMjAzMDAsMjAzMDYsMjAzMDgsMjAzMTAsMjAzMTIsMjAzMTksMjAzMjMsMjAzMzAsMjAzMzIsMjAzMzQsMjAzMzcsMjAzNDMsMjAzNDQsMjAzNDUsMjAzNDYsMjAzNDksMjAzNTAsMjAzNTMsMjAzNTQsMjAzNTYsMjAzNTcsMjAzNjEsMjAzNjIsMjAzNjQsMjAzNjYsMjAzNjgsMjAzNzAsMjAzNzEsMjAzNzIsMjAzNzUsMjAzNzcsMjAzNzgsMjAzODIsMjAzODMsMjA0MDIsMjA0MDcsMjA0MDksMjA0MTEsMjA0MTIsMjA0MTMsMjA0MTQsMjA0MTYsMjA0MTcsMjA0MjEsMjA0MjIsMjA0MjQsMjA0MjUsMjA0MjcsMjA0MjgsMjA0MjksMjA0MzEsMjA0MzQsMjA0NDQsMjA0NDgsMjA0NTAsMjA0NjQsMjA0NjYsMjA0NzYsMjA0NzcsMjA0NzksMjA0ODAsMjA0ODEsMjA0ODQsMjA0ODcsMjA0OTAsMjA0OTIsMjA0OTQsMjA0OTYsMjA0OTksMjA1MDMsMjA1MDQsMjA1MDcsMjA1MDgsMjA1MDksMjA1MTAsMjA1MTQsMjA1MTksMjA1MjYsMjA1MjgsMjA1MzAsMjA1MzEsMjA1MzMsMjA1NDQsMjA1NDUsMjA1NDYsMjA1NDksMjA1NTAsMjA1NTQsMjA1NTYsMjA1NTgsMjA1NjEsMjA1NjIsMjA1NjMsMjA1NjcsMjA1NjksMjA1NzUsMjA1NzYsMjA1NzgsMjA1NzksMjA1ODIsMjA1ODMsMjA1ODYsMjA1ODksMjA1OTIsMjA1OTMsMjA1MzksMjA2MDksMjA2MTEsMjA2MTIsMjA2MTQsMjA2MTgsMjA2MjIsMjA2MjMsMjA2MjQsMjA2MjYsMjA2MjcsMjA2MjgsMjA2MzAsMjA2MzUsMjA2MzYsMjA2MzgsMjA2MzksMjA2NDAsMjA2NDEsMjA2NDIsMjA2NTAsMjA2NTUsMjA2NTYsMjA2NjUsMjA2NjYsMjA2NjksMjA2NzIsMjA2NzUsMjA2NzYsMjA2NzksMjA2ODQsMjA2ODYsMjA2ODgsMjA2OTEsMjA2OTIsMjA2OTYsMjA3MDAsMjA3MDEsMjA3MDMsMjA3MDYsMjA3MDgsMjA3MTAsMjA3MTIsMjA3MTMsMjA3MTksMjA3MjEsMjA3MjYsMjA3MzAsMjA3MzQsMjA3MzksMjA3NDIsMjA3NDMsMjA3NDQsMjA3NDcsMjA3NDgsMjA3NDksMjA3NTAsMjA3MjIsMjA3NTIsMjA3NTksMjA3NjEsMjA3NjMsMjA3NjQsMjA3NjUsMjA3NjYsMjA3NzEsMjA3NzUsMjA3NzYsMjA3ODAsMjA3ODEsMjA3ODMsMjA3ODUsMjA3ODcsMjA3ODgsMjA3ODksMjA3OTIsMjA3OTMsMjA4MDIsMjA4MTAsMjA4MTUsMjA4MTksMjA4MjEsMjA4MjMsMjA4MjQsMjA4MzEsMjA4MzYsMjA4MzgsMjA4NjIsMjA4NjcsMjA4NjgsMjA4NzUsMjA4NzgsMjA4ODgsMjA4OTMsMjA4OTcsMjA4OTksMjA5MDksMjA5MjAsMjA5MjIsMjA5MjQsMjA5MjYsMjA5MjcsMjA5MzAsMjA5MzYsMjA5NDMsMjA5NDUsMjA5NDYsMjA5NDcsMjA5NDksMjA5NTIsMjA5NTgsMjA5NjIsMjA5NjUsMjA5NzQsMjA5NzgsMjA5NzksMjA5ODAsMjA5ODMsMjA5OTMsMjA5OTQsMjA5OTcsMjEwMTAsMjEwMTEsMjEwMTMsMjEwMTQsMjEwMTYsMjEwMjYsMjEwMzIsMjEwNDEsMjEwNDIsMjEwNDUsMjEwNTIsMjEwNjEsMjEwNjUsMjEwNzcsMjEwNzksMjEwODAsMjEwODIsMjEwODQsMjEwODcsMjEwODgsMjEwODksMjEwOTQsMjExMDIsMjExMTEsMjExMTIsMjExMTMsMjExMjAsMjExMjIsMjExMjUsMjExMzAsMjExMzIsMjExMzksMjExNDEsMjExNDIsMjExNDMsMjExNDQsMjExNDYsMjExNDgsMjExNTYsMjExNTcsMjExNTgsMjExNTksMjExNjcsMjExNjgsMjExNzQsMjExNzUsMjExNzYsMjExNzgsMjExNzksMjExODEsMjExODQsMjExODgsMjExOTAsMjExOTIsMjExOTYsMjExOTksMjEyMDEsMjEyMDQsMjEyMDYsMjEyMTEsMjEyMTIsMjEyMTcsMjEyMjEsMjEyMjQsMjEyMjUsMjEyMjYsMjEyMjgsMjEyMzIsMjEyMzMsMjEyMzYsMjEyMzgsMjEyMzksMjEyNDgsMjEyNTEsMjEyNTgsMjEyNTksMjEyNjAsMjEyNjUsMjEyNjcsMjEyNzIsMjEyNzUsMjEyNzYsMjEyNzgsMjEyNzksMjEyODUsMjEyODcsMjEyODgsMjEyODksMjEyOTEsMjEyOTIsMjEyOTMsMjEyOTYsMjEyOTgsMjEzMDEsMjEzMDgsMjEzMDksMjEzMTAsMjEzMTQsMjEzMjQsMjEzMjMsMjEzMzcsMjEzMzksMjEzNDUsMjEzNDcsMjEzNDksMjEzNTYsMjEzNTcsMjEzNjIsMjEzNjksMjEzNzQsMjEzNzksMjEzODMsMjEzODQsMjEzOTAsMjEzOTUsMjEzOTYsMjE0MDEsMjE0MDUsMjE0MDksMjE0MTIsMjE0MTgsMjE0MTksMjE0MjMsMjE0MjYsMjE0MjgsMjE0MjksMjE0MzEsMjE0MzIsMjE0MzQsMjE0MzcsMjE0NDAsMjE0NDUsMjE0NTUsMjE0NTgsMjE0NTksMjE0NjEsMjE0NjYsMjE0NjksMjE0NzAsMjE0NzIsMjE0NzgsMjE0NzksMjE0OTMsMjE1MDYsMjE1MjMsMjE1MzAsMjE1MzcsMjE1NDMsMjE1NDQsMjE1NDYsMjE1NTEsMjE1NTMsMjE1NTYsMjE1NTcsMjE1NzEsMjE1NzIsMjE1NzUsMjE1ODEsMjE1ODMsMjE1OTgsMjE2MDIsMjE2MDQsMjE2MDYsMjE2MDcsMjE2MDksMjE2MTEsMjE2MTMsMjE2MTQsMjE2MjAsMjE2MzEsMjE2MzMsMjE2MzUsMjE2MzcsMjE2NDAsMjE2NDEsMjE2NDUsMjE2NDksMjE2NTMsMjE2NTQsMjE2NjAsMjE2NjMsMjE2NjUsMjE2NzAsMjE2NzEsMjE2NzMsMjE2NzQsMjE2NzcsMjE2NzgsMjE2ODEsMjE2ODcsMjE2ODksMjE2OTAsMjE2OTEsMjE2OTUsMjE3MDIsMjE3MDYsMjE3MDksMjE3MTAsMjE3MjgsMjE3MzgsMjE3NDAsMjE3NDMsMjE3NTAsMjE3NTYsMjE3NTgsMjE3NTksMjE3NjAsMjE3NjEsMjE3NjUsMjE3NjgsMjE3NjksMjE3NzIsMjE3NzMsMjE3NzQsMjE3ODEsMjE4MDIsMjE4MDMsMjE4MTAsMjE4MTMsMjE4MTQsMjE4MTksMjE4MjAsMjE4MjEsMjE4MjUsMjE4MzEsMjE4MzMsMjE4MzQsMjE4MzcsMjE4NDAsMjE4NDEsMjE4NDgsMjE4NTAsMjE4NTEsMjE4NTQsMjE4NTYsMjE4NTcsMjE4NjAsMjE4NjIsMjE4ODcsMjE4ODksMjE4OTAsMjE4OTQsMjE4OTYsMjE5MDIsMjE5MDMsMjE5MDUsMjE5MDYsMjE5MDcsMjE5MDgsMjE5MTEsMjE5MjMsMjE5MjQsMjE5MzMsMjE5MzgsMjE5NTEsMjE5NTMsMjE5NTUsMjE5NTgsMjE5NjEsMjE5NjMsMjE5NjQsMjE5NjYsMjE5NjksMjE5NzAsMjE5NzEsMjE5NzUsMjE5NzYsMjE5NzksMjE5ODIsMjE5ODYsMjE5OTMsMjIwMDYsMjIwMTUsMjIwMjEsMjIwMjQsMjIwMjYsMjIwMjksMjIwMzAsMjIwMzEsMjIwMzIsMjIwMzMsMjIwMzQsMjIwNDEsMjIwNjAsMjIwNjQsMjIwNjcsMjIwNjksMjIwNzEsMjIwNzMsMjIwNzUsMjIwNzYsMjIwNzcsMjIwNzksMjIwODAsMjIwODEsMjIwODMsMjIwODQsMjIwODYsMjIwODksMjIwOTEsMjIwOTMsMjIwOTUsMjIxMDAsMjIxMTAsMjIxMTIsMjIxMTMsMjIxMTQsMjIxMTUsMjIxMTgsMjIxMjEsMjIxMjUsMjIxMjcsMjIxMjksMjIxMzAsMjIxMzMsMjIxNDgsMjIxNDksMjIxNTIsMjIxNTUsMjIxNTYsMjIxNjUsMjIxNjksMjIxNzAsMjIxNzMsMjIxNzQsMjIxNzUsMjIxODIsMjIxODMsMjIxODQsMjIxODUsMjIxODcsMjIxODgsMjIxODksMjIxOTMsMjIxOTUsMjIxOTksMjIyMDYsMjIyMTMsMjIyMTcsMjIyMTgsMjIyMTksMjIyMjMsMjIyMjQsMjIyMjAsMjIyMjEsMjIyMzMsMjIyMzYsMjIyMzcsMjIyMzksMjIyNDEsMjIyNDQsMjIyNDUsMjIyNDYsMjIyNDcsMjIyNDgsMjIyNTcsMjIyNTEsMjIyNTMsMjIyNjIsMjIyNjMsMjIyNzMsMjIyNzQsMjIyNzksMjIyODIsMjIyODQsMjIyODksMjIyOTMsMjIyOTgsMjIyOTksMjIzMDEsMjIzMDQsMjIzMDYsMjIzMDcsMjIzMDgsMjIzMDksMjIzMTMsMjIzMTQsMjIzMTYsMjIzMTgsMjIzMTksMjIzMjMsMjIzMjQsMjIzMzMsMjIzMzQsMjIzMzUsMjIzNDEsMjIzNDIsMjIzNDgsMjIzNDksMjIzNTQsMjIzNzAsMjIzNzMsMjIzNzUsMjIzNzYsMjIzNzksMjIzODEsMjIzODIsMjIzODMsMjIzODQsMjIzODUsMjIzODcsMjIzODgsMjIzODksMjIzOTEsMjIzOTMsMjIzOTQsMjIzOTUsMjIzOTYsMjIzOTgsMjI0MDEsMjI0MDMsMjI0MTIsMjI0MjAsMjI0MjMsMjI0MjUsMjI0MjYsMjI0MjgsMjI0MjksMjI0MzAsMjI0MzEsMjI0MzMsMjI0MjEsMjI0MzksMjI0NDAsMjI0NDEsMjI0NDQsMjI0NTYsMjI0NjEsMjI0NzEsMjI0NzIsMjI0NzYsMjI0NzksMjI0ODUsMjI0OTMsMjI0OTQsMjI1MDAsMjI1MDIsMjI1MDMsMjI1MDUsMjI1MDksMjI1MTIsMjI1MTcsMjI1MTgsMjI1MjAsMjI1MjUsMjI1MjYsMjI1MjcsMjI1MzEsMjI1MzIsMjI1MzYsMjI1MzcsMjI0OTcsMjI1NDAsMjI1NDEsMjI1NTUsMjI1NTgsMjI1NTksMjI1NjAsMjI1NjYsMjI1NjcsMjI1NzMsMjI1NzgsMjI1ODUsMjI1OTEsMjI2MDEsMjI2MDQsMjI2MDUsMjI2MDcsMjI2MDgsMjI2MTMsMjI2MjMsMjI2MjUsMjI2MjgsMjI2MzEsMjI2MzIsMjI2NDgsMjI2NTIsMjI2NTUsMjI2NTYsMjI2NTcsMjI2NjMsMjI2NjQsMjI2NjUsMjI2NjYsMjI2NjgsMjI2NjksMjI2NzEsMjI2NzIsMjI2NzYsMjI2NzgsMjI2ODUsMjI2ODgsMjI2ODksMjI2OTAsMjI2OTQsMjI2OTcsMjI3MDUsMjI3MDYsMjI3MjQsMjI3MTYsMjI3MjIsMjI3MjgsMjI3MzMsMjI3MzQsMjI3MzYsMjI3MzgsMjI3NDAsMjI3NDIsMjI3NDYsMjI3NDksMjI3NTMsMjI3NTQsMjI3NjEsMjI3NzEsMjI3ODksMjI3OTAsMjI3OTUsMjI3OTYsMjI4MDIsMjI4MDMsMjI4MDQsMzQzNjksMjI4MTMsMjI4MTcsMjI4MTksMjI4MjAsMjI4MjQsMjI4MzEsMjI4MzIsMjI4MzUsMjI4MzcsMjI4MzgsMjI4NDcsMjI4NTEsMjI4NTQsMjI4NjYsMjI4NjcsMjI4NzMsMjI4NzUsMjI4NzcsMjI4NzgsMjI4NzksMjI4ODEsMjI4ODMsMjI4OTEsMjI4OTMsMjI4OTUsMjI4OTgsMjI5MDEsMjI5MDIsMjI5MDUsMjI5MDcsMjI5MDgsMjI5MjMsMjI5MjQsMjI5MjYsMjI5MzAsMjI5MzMsMjI5MzUsMjI5NDMsMjI5NDgsMjI5NTEsMjI5NTcsMjI5NTgsMjI5NTksMjI5NjAsMjI5NjMsMjI5NjcsMjI5NzAsMjI5NzIsMjI5NzcsMjI5NzksMjI5ODAsMjI5ODQsMjI5ODYsMjI5ODksMjI5OTQsMjMwMDUsMjMwMDYsMjMwMDcsMjMwMTEsMjMwMTIsMjMwMTUsMjMwMjIsMjMwMjMsMjMwMjUsMjMwMjYsMjMwMjgsMjMwMzEsMjMwNDAsMjMwNDQsMjMwNTIsMjMwNTMsMjMwNTQsMjMwNTgsMjMwNTksMjMwNzAsMjMwNzUsMjMwNzYsMjMwNzksMjMwODAsMjMwODIsMjMwODUsMjMwODgsMjMxMDgsMjMxMDksMjMxMTEsMjMxMTIsMjMxMTYsMjMxMjAsMjMxMjUsMjMxMzQsMjMxMzksMjMxNDEsMjMxNDMsMjMxNDksMjMxNTksMjMxNjIsMjMxNjMsMjMxNjYsMjMxNzksMjMxODQsMjMxODcsMjMxOTAsMjMxOTMsMjMxOTYsMjMxOTgsMjMxOTksMjMyMDAsMjMyMDIsMjMyMDcsMjMyMTIsMjMyMTcsMjMyMTgsMjMyMTksMjMyMjEsMjMyMjQsMjMyMjYsMjMyMjcsMjMyMzEsMjMyMzYsMjMyMzgsMjMyNDAsMjMyNDcsMjMyNTgsMjMyNjAsMjMyNjQsMjMyNjksMjMyNzQsMjMyNzgsMjMyODUsMjMyODYsMjMyOTMsMjMyOTYsMjMyOTcsMjMzMDQsMjMzMTksMjMzNDgsMjMzMjEsMjMzMjMsMjMzMjUsMjMzMjksMjMzMzMsMjMzNDEsMjMzNTIsMjMzNjEsMjMzNzEsMjMzNzIsMjMzNzgsMjMzODIsMjMzOTAsMjM0MDAsMjM0MDYsMjM0MDcsMjM0MjAsMjM0MjEsMjM0MjIsMjM0MjMsMjM0MjUsMjM0MjgsMjM0MzAsMjM0MzQsMjM0MzgsMjM0NDAsMjM0NDEsMjM0NDMsMjM0NDQsMjM0NDYsMjM0NjQsMjM0NjUsMjM0NjgsMjM0NjksMjM0NzEsMjM0NzMsMjM0NzQsMjM0NzksMjM0ODIsMjM0ODQsMjM0ODgsMjM0ODksMjM1MDEsMjM1MDMsMjM1MTAsMjM1MTEsMjM1MTIsMjM1MTMsMjM1MTQsMjM1MjAsMjM1MzUsMjM1MzcsMjM1NDAsMjM1NDksMjM1NjQsMjM1NzUsMjM1ODIsMjM1ODMsMjM1ODcsMjM1OTAsMjM1OTMsMjM1OTUsMjM1OTYsMjM1OTgsMjM2MDAsMjM2MDIsMjM2MDUsMjM2MDYsMjM2NDEsMjM2NDIsMjM2NDQsMjM2NTAsMjM2NTEsMjM2NTUsMjM2NTYsMjM2NTcsMjM2NjEsMjM2NjQsMjM2NjgsMjM2NjksMjM2NzQsMjM2NzUsMjM2NzYsMjM2NzcsMjM2ODcsMjM2ODgsMjM2OTAsMjM2OTUsMjM2OTgsMjM3MDksMjM3MTEsMjM3MTIsMjM3MTQsMjM3MTUsMjM3MTgsMjM3MjIsMjM3MzAsMjM3MzIsMjM3MzMsMjM3MzgsMjM3NTMsMjM3NTUsMjM3NjIsMjM3NzMsMjM3NjcsMjM3OTAsMjM3OTMsMjM3OTQsMjM3OTYsMjM4MDksMjM4MTQsMjM4MjEsMjM4MjYsMjM4NTEsMjM4NDMsMjM4NDQsMjM4NDYsMjM4NDcsMjM4NTcsMjM4NjAsMjM4NjUsMjM4NjksMjM4NzEsMjM4NzQsMjM4NzUsMjM4NzgsMjM4ODAsMjM4OTMsMjM4ODksMjM4OTcsMjM4ODIsMjM5MDMsMjM5MDQsMjM5MDUsMjM5MDYsMjM5MDgsMjM5MTQsMjM5MTcsMjM5MjAsMjM5MjksMjM5MzAsMjM5MzQsMjM5MzUsMjM5MzcsMjM5MzksMjM5NDQsMjM5NDYsMjM5NTQsMjM5NTUsMjM5NTYsMjM5NTcsMjM5NjEsMjM5NjMsMjM5NjcsMjM5NjgsMjM5NzUsMjM5NzksMjM5ODQsMjM5ODgsMjM5OTIsMjM5OTMsMjQwMDMsMjQwMDcsMjQwMTEsMjQwMTYsMjQwMTQsMjQwMjQsMjQwMjUsMjQwMzIsMjQwMzYsMjQwNDEsMjQwNTYsMjQwNTcsMjQwNjQsMjQwNzEsMjQwNzcsMjQwODIsMjQwODQsMjQwODUsMjQwODgsMjQwOTUsMjQwOTYsMjQxMTAsMjQxMDQsMjQxMTQsMjQxMTcsMjQxMjYsMjQxMzksMjQxNDQsMjQxMzcsMjQxNDUsMjQxNTAsMjQxNTIsMjQxNTUsMjQxNTYsMjQxNTgsMjQxNjgsMjQxNzAsMjQxNzEsMjQxNzIsMjQxNzMsMjQxNzQsMjQxNzYsMjQxOTIsMjQyMDMsMjQyMDYsMjQyMjYsMjQyMjgsMjQyMjksMjQyMzIsMjQyMzQsMjQyMzYsMjQyNDEsMjQyNDMsMjQyNTMsMjQyNTQsMjQyNTUsMjQyNjIsMjQyNjgsMjQyNjcsMjQyNzAsMjQyNzMsMjQyNzQsMjQyNzYsMjQyNzcsMjQyODQsMjQyODYsMjQyOTMsMjQyOTksMjQzMjIsMjQzMjYsMjQzMjcsMjQzMjgsMjQzMzQsMjQzNDUsMjQzNDgsMjQzNDksMjQzNTMsMjQzNTQsMjQzNTUsMjQzNTYsMjQzNjAsMjQzNjMsMjQzNjQsMjQzNjYsMjQzNjgsMjQzNzIsMjQzNzQsMjQzNzksMjQzODEsMjQzODMsMjQzODQsMjQzODgsMjQzODksMjQzOTEsMjQzOTcsMjQ0MDAsMjQ0MDQsMjQ0MDgsMjQ0MTEsMjQ0MTYsMjQ0MTksMjQ0MjAsMjQ0MjMsMjQ0MzEsMjQ0MzQsMjQ0MzYsMjQ0MzcsMjQ0NDAsMjQ0NDIsMjQ0NDUsMjQ0NDYsMjQ0NTcsMjQ0NjEsMjQ0NjMsMjQ0NzAsMjQ0NzYsMjQ0NzcsMjQ0ODIsMjQ0ODcsMjQ0OTEsMjQ0ODQsMjQ0OTIsMjQ0OTUsMjQ0OTYsMjQ0OTcsMjQ1MDQsMjQ1MTYsMjQ1MTksMjQ1MjAsMjQ1MjEsMjQ1MjMsMjQ1MjgsMjQ1MjksMjQ1MzAsMjQ1MzEsMjQ1MzIsMjQ1NDIsMjQ1NDUsMjQ1NDYsMjQ1NTIsMjQ1NTMsMjQ1NTQsMjQ1NTYsMjQ1NTcsMjQ1NTgsMjQ1NTksMjQ1NjIsMjQ1NjMsMjQ1NjYsMjQ1NzAsMjQ1NzIsMjQ1ODMsMjQ1ODYsMjQ1ODksMjQ1OTUsMjQ1OTYsMjQ1OTksMjQ2MDAsMjQ2MDIsMjQ2MDcsMjQ2MTIsMjQ2MjEsMjQ2MjcsMjQ2MjksMjQ2NDAsMjQ2NDcsMjQ2NDgsMjQ2NDksMjQ2NTIsMjQ2NTcsMjQ2NjAsMjQ2NjIsMjQ2NjMsMjQ2NjksMjQ2NzMsMjQ2NzksMjQ2ODksMjQ3MDIsMjQ3MDMsMjQ3MDYsMjQ3MTAsMjQ3MTIsMjQ3MTQsMjQ3MTgsMjQ3MjEsMjQ3MjMsMjQ3MjUsMjQ3MjgsMjQ3MzMsMjQ3MzQsMjQ3MzgsMjQ3NDAsMjQ3NDEsMjQ3NDQsMjQ3NTIsMjQ3NTMsMjQ3NTksMjQ3NjMsMjQ3NjYsMjQ3NzAsMjQ3NzIsMjQ3NzYsMjQ3NzcsMjQ3NzgsMjQ3NzksMjQ3ODIsMjQ3ODMsMjQ3ODgsMjQ3ODksMjQ3OTMsMjQ3OTUsMjQ3OTcsMjQ3OTgsMjQ4MDIsMjQ4MDUsMjQ4MTgsMjQ4MjEsMjQ4MjQsMjQ4MjgsMjQ4MjksMjQ4MzQsMjQ4MzksMjQ4NDIsMjQ4NDQsMjQ4NDgsMjQ4NDksMjQ4NTAsMjQ4NTEsMjQ4NTIsMjQ4NTQsMjQ4NTUsMjQ4NTcsMjQ4NjAsMjQ4NjIsMjQ4NjYsMjQ4NzQsMjQ4NzUsMjQ4ODAsMjQ4ODEsMjQ4ODUsMjQ4ODYsMjQ4ODcsMjQ4ODksMjQ4OTcsMjQ5MDEsMjQ5MDIsMjQ5MDUsMjQ5MjYsMjQ5MjgsMjQ5NDAsMjQ5NDYsMjQ5NTIsMjQ5NTUsMjQ5NTYsMjQ5NTksMjQ5NjAsMjQ5NjEsMjQ5NjMsMjQ5NjQsMjQ5NzEsMjQ5NzMsMjQ5NzgsMjQ5NzksMjQ5ODMsMjQ5ODQsMjQ5ODgsMjQ5ODksMjQ5OTEsMjQ5OTIsMjQ5OTcsMjUwMDAsMjUwMDIsMjUwMDUsMjUwMTYsMjUwMTcsMjUwMjAsMjUwMjQsMjUwMjUsMjUwMjYsMjUwMzgsMjUwMzksMjUwNDUsMjUwNTIsMjUwNTMsMjUwNTQsMjUwNTUsMjUwNTcsMjUwNTgsMjUwNjMsMjUwNjUsMjUwNjEsMjUwNjgsMjUwNjksMjUwNzEsMjUwODksMjUwOTEsMjUwOTIsMjUwOTUsMjUxMDcsMjUxMDksMjUxMTYsMjUxMjAsMjUxMjIsMjUxMjMsMjUxMjcsMjUxMjksMjUxMzEsMjUxNDUsMjUxNDksMjUxNTQsMjUxNTUsMjUxNTYsMjUxNTgsMjUxNjQsMjUxNjgsMjUxNjksMjUxNzAsMjUxNzIsMjUxNzQsMjUxNzgsMjUxODAsMjUxODgsMjUxOTcsMjUxOTksMjUyMDMsMjUyMTAsMjUyMTMsMjUyMjksMjUyMzAsMjUyMzEsMjUyMzIsMjUyNTQsMjUyNTYsMjUyNjcsMjUyNzAsMjUyNzEsMjUyNzQsMjUyNzgsMjUyNzksMjUyODQsMjUyOTQsMjUzMDEsMjUzMDIsMjUzMDYsMjUzMjIsMjUzMzAsMjUzMzIsMjUzNDAsMjUzNDEsMjUzNDcsMjUzNDgsMjUzNTQsMjUzNTUsMjUzNTcsMjUzNjAsMjUzNjMsMjUzNjYsMjUzNjgsMjUzODUsMjUzODYsMjUzODksMjUzOTcsMjUzOTgsMjU0MDEsMjU0MDQsMjU0MDksMjU0MTAsMjU0MTEsMjU0MTIsMjU0MTQsMjU0MTgsMjU0MTksMjU0MjIsMjU0MjYsMjU0MjcsMjU0MjgsMjU0MzIsMjU0MzUsMjU0NDUsMjU0NDYsMjU0NTIsMjU0NTMsMjU0NTcsMjU0NjAsMjU0NjEsMjU0NjQsMjU0NjgsMjU0NjksMjU0NzEsMjU0NzQsMjU0NzYsMjU0NzksMjU0ODIsMjU0ODgsMjU0OTIsMjU0OTMsMjU0OTcsMjU0OTgsMjU1MDIsMjU1MDgsMjU1MTAsMjU1MTcsMjU1MTgsMjU1MTksMjU1MzMsMjU1MzcsMjU1NDEsMjU1NDQsMjU1NTAsMjU1NTMsMjU1NTUsMjU1NTYsMjU1NTcsMjU1NjQsMjU1NjgsMjU1NzMsMjU1NzgsMjU1ODAsMjU1ODYsMjU1ODcsMjU1ODksMjU1OTIsMjU1OTMsMjU2MDksMjU2MTAsMjU2MTYsMjU2MTgsMjU2MjAsMjU2MjQsMjU2MzAsMjU2MzIsMjU2MzQsMjU2MzYsMjU2MzcsMjU2NDEsMjU2NDIsMjU2NDcsMjU2NDgsMjU2NTMsMjU2NjEsMjU2NjMsMjU2NzUsMjU2NzksMjU2ODEsMjU2ODIsMjU2ODMsMjU2ODQsMjU2OTAsMjU2OTEsMjU2OTIsMjU2OTMsMjU2OTUsMjU2OTYsMjU2OTcsMjU2OTksMjU3MDksMjU3MTUsMjU3MTYsMjU3MjMsMjU3MjUsMjU3MzMsMjU3MzUsMjU3NDMsMjU3NDQsMjU3NDUsMjU3NTIsMjU3NTMsMjU3NTUsMjU3NTcsMjU3NTksMjU3NjEsMjU3NjMsMjU3NjYsMjU3NjgsMjU3NzIsMjU3NzksMjU3ODksMjU3OTAsMjU3OTEsMjU3OTYsMjU4MDEsMjU4MDIsMjU4MDMsMjU4MDQsMjU4MDYsMjU4MDgsMjU4MDksMjU4MTMsMjU4MTUsMjU4MjgsMjU4MjksMjU4MzMsMjU4MzQsMjU4MzcsMjU4NDAsMjU4NDUsMjU4NDcsMjU4NTEsMjU4NTUsMjU4NTcsMjU4NjAsMjU4NjQsMjU4NjUsMjU4NjYsMjU4NzEsMjU4NzUsMjU4NzYsMjU4NzgsMjU4ODEsMjU4ODMsMjU4ODYsMjU4ODcsMjU4OTAsMjU4OTQsMjU4OTcsMjU5MDIsMjU5MDUsMjU5MTQsMjU5MTYsMjU5MTcsMjU5MjMsMjU5MjcsMjU5MjksMjU5MzYsMjU5MzgsMjU5NDAsMjU5NTEsMjU5NTIsMjU5NTksMjU5NjMsMjU5NzgsMjU5ODEsMjU5ODUsMjU5ODksMjU5OTQsMjYwMDIsMjYwMDUsMjYwMDgsMjYwMTMsMjYwMTYsMjYwMTksMjYwMjIsMjYwMzAsMjYwMzQsMjYwMzUsMjYwMzYsMjYwNDcsMjYwNTAsMjYwNTYsMjYwNTcsMjYwNjIsMjYwNjQsMjYwNjgsMjYwNzAsMjYwNzIsMjYwNzksMjYwOTYsMjYwOTgsMjYxMDAsMjYxMDEsMjYxMDUsMjYxMTAsMjYxMTEsMjYxMTIsMjYxMTYsMjYxMjAsMjYxMjEsMjYxMjUsMjYxMjksMjYxMzAsMjYxMzMsMjYxMzQsMjYxNDEsMjYxNDIsMjYxNDUsMjYxNDYsMjYxNDcsMjYxNDgsMjYxNTAsMjYxNTMsMjYxNTQsMjYxNTUsMjYxNTYsMjYxNTgsMjYxNjAsMjYxNjEsMjYxNjMsMjYxNjksMjYxNjcsMjYxNzYsMjYxODEsMjYxODIsMjYxODYsMjYxODgsMjYxOTMsMjYxOTAsMjYxOTksMjYyMDAsMjYyMDEsMjYyMDMsMjYyMDQsMjYyMDgsMjYyMDksMjYzNjMsMjYyMTgsMjYyMTksMjYyMjAsMjYyMzgsMjYyMjcsMjYyMjksMjYyMzksMjYyMzEsMjYyMzIsMjYyMzMsMjYyMzUsMjYyNDAsMjYyMzYsMjYyNTEsMjYyNTIsMjYyNTMsMjYyNTYsMjYyNTgsMjYyNjUsMjYyNjYsMjYyNjcsMjYyNjgsMjYyNzEsMjYyNzIsMjYyNzYsMjYyODUsMjYyODksMjYyOTAsMjYyOTMsMjYyOTksMjYzMDMsMjYzMDQsMjYzMDYsMjYzMDcsMjYzMTIsMjYzMTYsMjYzMTgsMjYzMTksMjYzMjQsMjYzMzEsMjYzMzUsMjYzNDQsMjYzNDcsMjYzNDgsMjYzNTAsMjYzNjIsMjYzNzMsMjYzNzUsMjYzODIsMjYzODcsMjYzOTMsMjYzOTYsMjY0MDAsMjY0MDIsMjY0MTksMjY0MzAsMjY0MzcsMjY0MzksMjY0NDAsMjY0NDQsMjY0NTIsMjY0NTMsMjY0NjEsMjY0NzAsMjY0NzYsMjY0NzgsMjY0ODQsMjY0ODYsMjY0OTEsMjY0OTcsMjY1MDAsMjY1MTAsMjY1MTEsMjY1MTMsMjY1MTUsMjY1MTgsMjY1MjAsMjY1MjEsMjY1MjMsMjY1NDQsMjY1NDUsMjY1NDYsMjY1NDksMjY1NTUsMjY1NTYsMjY1NTcsMjY2MTcsMjY1NjAsMjY1NjIsMjY1NjMsMjY1NjUsMjY1NjgsMjY1NjksMjY1NzgsMjY1ODMsMjY1ODUsMjY1ODgsMjY1OTMsMjY1OTgsMjY2MDgsMjY2MTAsMjY2MTQsMjY2MTUsMjY3MDYsMjY2NDQsMjY2NDksMjY2NTMsMjY2NTUsMjY2NjQsMjY2NjMsMjY2NjgsMjY2NjksMjY2NzEsMjY2NzIsMjY2NzMsMjY2NzUsMjY2ODMsMjY2ODcsMjY2OTIsMjY2OTMsMjY2OTgsMjY3MDAsMjY3MDksMjY3MTEsMjY3MTIsMjY3MTUsMjY3MzEsMjY3MzQsMjY3MzUsMjY3MzYsMjY3MzcsMjY3MzgsMjY3NDEsMjY3NDUsMjY3NDYsMjY3NDcsMjY3NDgsMjY3NTQsMjY3NTYsMjY3NTgsMjY3NjAsMjY3NzQsMjY3NzYsMjY3NzgsMjY3ODAsMjY3ODUsMjY3ODcsMjY3ODksMjY3OTMsMjY3OTQsMjY3OTgsMjY4MDIsMjY4MTEsMjY4MjEsMjY4MjQsMjY4MjgsMjY4MzEsMjY4MzIsMjY4MzMsMjY4MzUsMjY4MzgsMjY4NDEsMjY4NDQsMjY4NDUsMjY4NTMsMjY4NTYsMjY4NTgsMjY4NTksMjY4NjAsMjY4NjEsMjY4NjQsMjY4NjUsMjY4NjksMjY4NzAsMjY4NzUsMjY4NzYsMjY4NzcsMjY4ODYsMjY4ODksMjY4OTAsMjY4OTYsMjY4OTcsMjY4OTksMjY5MDIsMjY5MDMsMjY5MjksMjY5MzEsMjY5MzMsMjY5MzYsMjY5MzksMjY5NDYsMjY5NDksMjY5NTMsMjY5NTgsMjY5NjcsMjY5NzEsMjY5NzksMjY5ODAsMjY5ODEsMjY5ODIsMjY5ODQsMjY5ODUsMjY5ODgsMjY5OTIsMjY5OTMsMjY5OTQsMjcwMDIsMjcwMDMsMjcwMDcsMjcwMDgsMjcwMjEsMjcwMjYsMjcwMzAsMjcwMzIsMjcwNDEsMjcwNDUsMjcwNDYsMjcwNDgsMjcwNTEsMjcwNTMsMjcwNTUsMjcwNjMsMjcwNjQsMjcwNjYsMjcwNjgsMjcwNzcsMjcwODAsMjcwODksMjcwOTQsMjcwOTUsMjcxMDYsMjcxMDksMjcxMTgsMjcxMTksMjcxMjEsMjcxMjMsMjcxMjUsMjcxMzQsMjcxMzYsMjcxMzcsMjcxMzksMjcxNTEsMjcxNTMsMjcxNTcsMjcxNjIsMjcxNjUsMjcxNjgsMjcxNzIsMjcxNzYsMjcxODQsMjcxODYsMjcxODgsMjcxOTEsMjcxOTUsMjcxOTgsMjcxOTksMjcyMDUsMjcyMDYsMjcyMDksMjcyMTAsMjcyMTQsMjcyMTYsMjcyMTcsMjcyMTgsMjcyMjEsMjcyMjIsMjcyMjcsMjcyMzYsMjcyMzksMjcyNDIsMjcyNDksMjcyNTEsMjcyNjIsMjcyNjUsMjcyNjcsMjcyNzAsMjcyNzEsMjcyNzMsMjcyNzUsMjcyODEsMjcyOTEsMjcyOTMsMjcyOTQsMjcyOTUsMjczMDEsMjczMDcsMjczMTEsMjczMTIsMjczMTMsMjczMTYsMjczMjUsMjczMjYsMjczMjcsMjczMzQsMjczMzcsMjczMzYsMjczNDAsMjczNDQsMjczNDgsMjczNDksMjczNTAsMjczNTYsMjczNTcsMjczNjQsMjczNjcsMjczNzIsMjczNzYsMjczNzcsMjczNzgsMjczODgsMjczODksMjczOTQsMjczOTUsMjczOTgsMjczOTksMjc0MDEsMjc0MDcsMjc0MDgsMjc0MDksMjc0MTUsMjc0MTksMjc0MjIsMjc0MjgsMjc0MzIsMjc0MzUsMjc0MzYsMjc0MzksMjc0NDUsMjc0NDYsMjc0NTEsMjc0NTUsMjc0NjIsMjc0NjYsMjc0NjksMjc0NzQsMjc0NzgsMjc0ODAsMjc0ODUsMjc0ODgsMjc0OTUsMjc0OTksMjc1MDIsMjc1MDQsMjc1MDksMjc1MTcsMjc1MTgsMjc1MjIsMjc1MjUsMjc1NDMsMjc1NDcsMjc1NTEsMjc1NTIsMjc1NTQsMjc1NTUsMjc1NjAsMjc1NjEsMjc1NjQsMjc1NjUsMjc1NjYsMjc1NjgsMjc1NzYsMjc1NzcsMjc1ODEsMjc1ODIsMjc1ODcsMjc1ODgsMjc1OTMsMjc1OTYsMjc2MDYsMjc2MTAsMjc2MTcsMjc2MTksMjc2MjIsMjc2MjMsMjc2MzAsMjc2MzMsMjc2MzksMjc2NDEsMjc2NDcsMjc2NTAsMjc2NTIsMjc2NTMsMjc2NTcsMjc2NjEsMjc2NjIsMjc2NjQsMjc2NjYsMjc2NzMsMjc2NzksMjc2ODYsMjc2ODcsMjc2ODgsMjc2OTIsMjc2OTQsMjc2OTksMjc3MDEsMjc3MDIsMjc3MDYsMjc3MDcsMjc3MTEsMjc3MjIsMjc3MjMsMjc3MjUsMjc3MjcsMjc3MzAsMjc3MzIsMjc3MzcsMjc3MzksMjc3NDAsMjc3NTUsMjc3NTcsMjc3NTksMjc3NjQsMjc3NjYsMjc3NjgsMjc3NjksMjc3NzEsMjc3ODEsMjc3ODIsMjc3ODMsMjc3ODUsMjc3OTYsMjc3OTcsMjc3OTksMjc4MDAsMjc4MDQsMjc4MDcsMjc4MjQsMjc4MjYsMjc4MjgsMjc4NDIsMjc4NDYsMjc4NTMsMjc4NTUsMjc4NTYsMjc4NTcsMjc4NTgsMjc4NjAsMjc4NjIsMjc4NjYsMjc4NjgsMjc4NzIsMjc4NzksMjc4ODEsMjc4ODMsMjc4ODQsMjc4ODYsMjc4OTAsMjc4OTIsMjc5MDgsMjc5MTEsMjc5MTQsMjc5MTgsMjc5MTksMjc5MjEsMjc5MjMsMjc5MzAsMjc5NDIsMjc5NDMsMjc5NDQsMjc3NTEsMjc5NTAsMjc5NTEsMjc5NTMsMjc5NjEsMjc5NjQsMjc5NjcsMjc5OTEsMjc5OTgsMjc5OTksMjgwMDEsMjgwMDUsMjgwMDcsMjgwMTUsMjgwMTYsMjgwMjgsMjgwMzQsMjgwMzksMjgwNDksMjgwNTAsMjgwNTIsMjgwNTQsMjgwNTUsMjgwNTYsMjgwNzQsMjgwNzYsMjgwODQsMjgwODcsMjgwODksMjgwOTMsMjgwOTUsMjgxMDAsMjgxMDQsMjgxMDYsMjgxMTAsMjgxMTEsMjgxMTgsMjgxMjMsMjgxMjUsMjgxMjcsMjgxMjgsMjgxMzAsMjgxMzMsMjgxMzcsMjgxNDMsMjgxNDQsMjgxNDgsMjgxNTAsMjgxNTYsMjgxNjAsMjgxNjQsMjgxOTAsMjgxOTQsMjgxOTksMjgyMTAsMjgyMTQsMjgyMTcsMjgyMTksMjgyMjAsMjgyMjgsMjgyMjksMjgyMzIsMjgyMzMsMjgyMzUsMjgyMzksMjgyNDEsMjgyNDIsMjgyNDMsMjgyNDQsMjgyNDcsMjgyNTIsMjgyNTMsMjgyNTQsMjgyNTgsMjgyNTksMjgyNjQsMjgyNzUsMjgyODMsMjgyODUsMjgzMDEsMjgzMDcsMjgzMTMsMjgzMjAsMjgzMjcsMjgzMzMsMjgzMzQsMjgzMzcsMjgzMzksMjgzNDcsMjgzNTEsMjgzNTIsMjgzNTMsMjgzNTUsMjgzNTksMjgzNjAsMjgzNjIsMjgzNjUsMjgzNjYsMjgzNjcsMjgzOTUsMjgzOTcsMjgzOTgsMjg0MDksMjg0MTEsMjg0MTMsMjg0MjAsMjg0MjQsMjg0MjYsMjg0MjgsMjg0MjksMjg0MzgsMjg0NDAsMjg0NDIsMjg0NDMsMjg0NTQsMjg0NTcsMjg0NTgsMjg0NjMsMjg0NjQsMjg0NjcsMjg0NzAsMjg0NzUsMjg0NzYsMjg0NjEsMjg0OTUsMjg0OTcsMjg0OTgsMjg0OTksMjg1MDMsMjg1MDUsMjg1MDYsMjg1MDksMjg1MTAsMjg1MTMsMjg1MTQsMjg1MjAsMjg1MjQsMjg1NDEsMjg1NDIsMjg1NDcsMjg1NTEsMjg1NTIsMjg1NTUsMjg1NTYsMjg1NTcsMjg1NjAsMjg1NjIsMjg1NjMsMjg1NjQsMjg1NjYsMjg1NzAsMjg1NzUsMjg1NzYsMjg1ODEsMjg1ODIsMjg1ODMsMjg1ODQsMjg1OTAsMjg1OTEsMjg1OTIsMjg1OTcsMjg1OTgsMjg2MDQsMjg2MTMsMjg2MTUsMjg2MTYsMjg2MTgsMjg2MzQsMjg2MzgsMjg2NDgsMjg2NDksMjg2NTYsMjg2NjEsMjg2NjUsMjg2NjgsMjg2NjksMjg2NzIsMjg2NzcsMjg2NzgsMjg2NzksMjg2ODUsMjg2OTUsMjg3MDQsMjg3MDcsMjg3MTksMjg3MjQsMjg3MjcsMjg3MjksMjg3MzIsMjg3MzksMjg3NDAsMjg3NDQsMjg3NDUsMjg3NDYsMjg3NDcsMjg3NTYsMjg3NTcsMjg3NjUsMjg3NjYsMjg3NTAsMjg3NzIsMjg3NzMsMjg3ODAsMjg3ODIsMjg3ODksMjg3OTAsMjg3OTgsMjg4MDEsMjg4MDUsMjg4MDYsMjg4MjAsMjg4MjEsMjg4MjIsMjg4MjMsMjg4MjQsMjg4MjcsMjg4MzYsMjg4NDMsMjg4NDgsMjg4NDksMjg4NTIsMjg4NTUsMjg4NzQsMjg4ODEsMjg4ODMsMjg4ODQsMjg4ODUsMjg4ODYsMjg4ODgsMjg4OTIsMjg5MDAsMjg5MjIsMjg5MzEsMjg5MzIsMjg5MzMsMjg5MzQsMjg5MzUsMjg5MzksMjg5NDAsMjg5NDMsMjg5NTgsMjg5NjAsMjg5NzEsMjg5NzMsMjg5NzUsMjg5NzYsMjg5NzcsMjg5ODQsMjg5OTMsMjg5OTcsMjg5OTgsMjg5OTksMjkwMDIsMjkwMDMsMjkwMDgsMjkwMTAsMjkwMTUsMjkwMTgsMjkwMjAsMjkwMjIsMjkwMjQsMjkwMzIsMjkwNDksMjkwNTYsMjkwNjEsMjkwNjMsMjkwNjgsMjkwNzQsMjkwODIsMjkwODMsMjkwODgsMjkwOTAsMjkxMDMsMjkxMDQsMjkxMDYsMjkxMDcsMjkxMTQsMjkxMTksMjkxMjAsMjkxMjEsMjkxMjQsMjkxMzEsMjkxMzIsMjkxMzksMjkxNDIsMjkxNDUsMjkxNDYsMjkxNDgsMjkxNzYsMjkxODIsMjkxODQsMjkxOTEsMjkxOTIsMjkxOTMsMjkyMDMsMjkyMDcsMjkyMTAsMjkyMTMsMjkyMTUsMjkyMjAsMjkyMjcsMjkyMzEsMjkyMzYsMjkyNDAsMjkyNDEsMjkyNDksMjkyNTAsMjkyNTEsMjkyNTMsMjkyNjIsMjkyNjMsMjkyNjQsMjkyNjcsMjkyNjksMjkyNzAsMjkyNzQsMjkyNzYsMjkyNzgsMjkyODAsMjkyODMsMjkyODgsMjkyOTEsMjkyOTQsMjkyOTUsMjkyOTcsMjkzMDMsMjkzMDQsMjkzMDcsMjkzMDgsMjkzMTEsMjkzMTYsMjkzMjEsMjkzMjUsMjkzMjYsMjkzMzEsMjkzMzksMjkzNTIsMjkzNTcsMjkzNTgsMjkzNjEsMjkzNjQsMjkzNzQsMjkzNzcsMjkzODMsMjkzODUsMjkzODgsMjkzOTcsMjkzOTgsMjk0MDAsMjk0MDcsMjk0MTMsMjk0MjcsMjk0MjgsMjk0MzQsMjk0MzUsMjk0MzgsMjk0NDIsMjk0NDQsMjk0NDUsMjk0NDcsMjk0NTEsMjk0NTMsMjk0NTgsMjk0NTksMjk0NjQsMjk0NjUsMjk0NzAsMjk0NzQsMjk0NzYsMjk0NzksMjk0ODAsMjk0ODQsMjk0ODksMjk0OTAsMjk0OTMsMjk0OTgsMjk0OTksMjk1MDEsMjk1MDcsMjk1MTcsMjk1MjAsMjk1MjIsMjk1MjYsMjk1MjgsMjk1MzMsMjk1MzQsMjk1MzUsMjk1MzYsMjk1NDIsMjk1NDMsMjk1NDUsMjk1NDcsMjk1NDgsMjk1NTAsMjk1NTEsMjk1NTMsMjk1NTksMjk1NjEsMjk1NjQsMjk1NjgsMjk1NjksMjk1NzEsMjk1NzMsMjk1NzQsMjk1ODIsMjk1ODQsMjk1ODcsMjk1ODksMjk1OTEsMjk1OTIsMjk1OTYsMjk1OTgsMjk1OTksMjk2MDAsMjk2MDIsMjk2MDUsMjk2MDYsMjk2MTAsMjk2MTEsMjk2MTMsMjk2MjEsMjk2MjMsMjk2MjUsMjk2MjgsMjk2MjksMjk2MzEsMjk2MzcsMjk2MzgsMjk2NDEsMjk2NDMsMjk2NDQsMjk2NDcsMjk2NTAsMjk2NTEsMjk2NTQsMjk2NTcsMjk2NjEsMjk2NjUsMjk2NjcsMjk2NzAsMjk2NzEsMjk2NzMsMjk2ODQsMjk2ODUsMjk2ODcsMjk2ODksMjk2OTAsMjk2OTEsMjk2OTMsMjk2OTUsMjk2OTYsMjk2OTcsMjk3MDAsMjk3MDMsMjk3MDYsMjk3MTMsMjk3MjIsMjk3MjMsMjk3MzIsMjk3MzQsMjk3MzYsMjk3MzcsMjk3MzgsMjk3MzksMjk3NDAsMjk3NDEsMjk3NDIsMjk3NDMsMjk3NDQsMjk3NDUsMjk3NTMsMjk3NjAsMjk3NjMsMjk3NjQsMjk3NjYsMjk3NjcsMjk3NzEsMjk3NzMsMjk3NzcsMjk3NzgsMjk3ODMsMjk3ODksMjk3OTQsMjk3OTgsMjk3OTksMjk4MDAsMjk4MDMsMjk4MDUsMjk4MDYsMjk4MDksMjk4MTAsMjk4MjQsMjk4MjUsMjk4MjksMjk4MzAsMjk4MzEsMjk4MzMsMjk4MzksMjk4NDAsMjk4NDEsMjk4NDIsMjk4NDgsMjk4NDksMjk4NTAsMjk4NTIsMjk4NTUsMjk4NTYsMjk4NTcsMjk4NTksMjk4NjIsMjk4NjQsMjk4NjUsMjk4NjYsMjk4NjcsMjk4NzAsMjk4NzEsMjk4NzMsMjk4NzQsMjk4NzcsMjk4ODEsMjk4ODMsMjk4ODcsMjk4OTYsMjk4OTcsMjk5MDAsMjk5MDQsMjk5MDcsMjk5MTIsMjk5MTQsMjk5MTUsMjk5MTgsMjk5MTksMjk5MjQsMjk5MjgsMjk5MzAsMjk5MzEsMjk5MzUsMjk5NDAsMjk5NDYsMjk5NDcsMjk5NDgsMjk5NTEsMjk5NTgsMjk5NzAsMjk5NzQsMjk5NzUsMjk5ODQsMjk5ODUsMjk5ODgsMjk5OTEsMjk5OTMsMjk5OTQsMjk5OTksMzAwMDYsMzAwMDksMzAwMTMsMzAwMTQsMzAwMTUsMzAwMTYsMzAwMTksMzAwMjMsMzAwMjQsMzAwMzAsMzAwMzIsMzAwMzQsMzAwMzksMzAwNDYsMzAwNDcsMzAwNDksMzAwNjMsMzAwNjUsMzAwNzMsMzAwNzQsMzAwNzUsMzAwNzYsMzAwNzcsMzAwNzgsMzAwODEsMzAwODUsMzAwOTYsMzAwOTgsMzAwOTksMzAxMDEsMzAxMDUsMzAxMDgsMzAxMTQsMzAxMTYsMzAxMzIsMzAxMzgsMzAxNDMsMzAxNDQsMzAxNDUsMzAxNDgsMzAxNTAsMzAxNTYsMzAxNTgsMzAxNTksMzAxNjcsMzAxNzIsMzAxNzUsMzAxNzYsMzAxNzcsMzAxODAsMzAxODMsMzAxODgsMzAxOTAsMzAxOTEsMzAxOTMsMzAyMDEsMzAyMDgsMzAyMTAsMzAyMTEsMzAyMTIsMzAyMTUsMzAyMTYsMzAyMTgsMzAyMjAsMzAyMjMsMzAyMjYsMzAyMjcsMzAyMjksMzAyMzAsMzAyMzMsMzAyMzUsMzAyMzYsMzAyMzcsMzAyMzgsMzAyNDMsMzAyNDUsMzAyNDYsMzAyNDksMzAyNTMsMzAyNTgsMzAyNTksMzAyNjEsMzAyNjQsMzAyNjUsMzAyNjYsMzAyNjgsMzAyODIsMzAyNzIsMzAyNzMsMzAyNzUsMzAyNzYsMzAyNzcsMzAyODEsMzAyODMsMzAyOTMsMzAyOTcsMzAzMDMsMzAzMDgsMzAzMDksMzAzMTcsMzAzMTgsMzAzMTksMzAzMjEsMzAzMjQsMzAzMzcsMzAzNDEsMzAzNDgsMzAzNDksMzAzNTcsMzAzNjMsMzAzNjQsMzAzNjUsMzAzNjcsMzAzNjgsMzAzNzAsMzAzNzEsMzAzNzIsMzAzNzMsMzAzNzQsMzAzNzUsMzAzNzYsMzAzNzgsMzAzODEsMzAzOTcsMzA0MDEsMzA0MDUsMzA0MDksMzA0MTEsMzA0MTIsMzA0MTQsMzA0MjAsMzA0MjUsMzA0MzIsMzA0MzgsMzA0NDAsMzA0NDQsMzA0NDgsMzA0NDksMzA0NTQsMzA0NTcsMzA0NjAsMzA0NjQsMzA0NzAsMzA0NzQsMzA0NzgsMzA0ODIsMzA0ODQsMzA0ODUsMzA0ODcsMzA0ODksMzA0OTAsMzA0OTIsMzA0OTgsMzA1MDQsMzA1MDksMzA1MTAsMzA1MTEsMzA1MTYsMzA1MTcsMzA1MTgsMzA1MjEsMzA1MjUsMzA1MjYsMzA1MzAsMzA1MzMsMzA1MzQsMzA1MzgsMzA1NDEsMzA1NDIsMzA1NDMsMzA1NDYsMzA1NTAsMzA1NTEsMzA1NTYsMzA1NTgsMzA1NTksMzA1NjAsMzA1NjIsMzA1NjQsMzA1NjcsMzA1NzAsMzA1NzIsMzA1NzYsMzA1NzgsMzA1NzksMzA1ODAsMzA1ODYsMzA1ODksMzA1OTIsMzA1OTYsMzA2MDQsMzA2MDUsMzA2MTIsMzA2MTMsMzA2MTQsMzA2MTgsMzA2MjMsMzA2MjYsMzA2MzEsMzA2MzQsMzA2MzgsMzA2MzksMzA2NDEsMzA2NDUsMzA2NTQsMzA2NTksMzA2NjUsMzA2NzMsMzA2NzQsMzA2NzcsMzA2ODEsMzA2ODYsMzA2ODcsMzA2ODgsMzA2OTIsMzA2OTQsMzA2OTgsMzA3MDAsMzA3MDQsMzA3MDUsMzA3MDgsMzA3MTIsMzA3MTUsMzA3MjUsMzA3MjYsMzA3MjksMzA3MzMsMzA3MzQsMzA3MzcsMzA3NDksMzA3NTMsMzA3NTQsMzA3NTUsMzA3NjUsMzA3NjYsMzA3NjgsMzA3NzMsMzA3NzUsMzA3ODcsMzA3ODgsMzA3OTEsMzA3OTIsMzA3OTYsMzA3OTgsMzA4MDIsMzA4MTIsMzA4MTQsMzA4MTYsMzA4MTcsMzA4MTksMzA4MjAsMzA4MjQsMzA4MjYsMzA4MzAsMzA4NDIsMzA4NDYsMzA4NTgsMzA4NjMsMzA4NjgsMzA4NzIsMzA4ODEsMzA4NzcsMzA4NzgsMzA4NzksMzA4ODQsMzA4ODgsMzA4OTIsMzA4OTMsMzA4OTYsMzA4OTcsMzA4OTgsMzA4OTksMzA5MDcsMzA5MDksMzA5MTEsMzA5MTksMzA5MjAsMzA5MjEsMzA5MjQsMzA5MjYsMzA5MzAsMzA5MzEsMzA5MzMsMzA5MzQsMzA5NDgsMzA5MzksMzA5NDMsMzA5NDQsMzA5NDUsMzA5NTAsMzA5NTQsMzA5NjIsMzA5NjMsMzA5NzYsMzA5NjYsMzA5NjcsMzA5NzAsMzA5NzEsMzA5NzUsMzA5ODIsMzA5ODgsMzA5OTIsMzEwMDIsMzEwMDQsMzEwMDYsMzEwMDcsMzEwMDgsMzEwMTMsMzEwMTUsMzEwMTcsMzEwMjEsMzEwMjUsMzEwMjgsMzEwMjksMzEwMzUsMzEwMzcsMzEwMzksMzEwNDQsMzEwNDUsMzEwNDYsMzEwNTAsMzEwNTEsMzEwNTUsMzEwNTcsMzEwNjAsMzEwNjQsMzEwNjcsMzEwNjgsMzEwNzksMzEwODEsMzEwODMsMzEwOTAsMzEwOTcsMzEwOTksMzExMDAsMzExMDIsMzExMTUsMzExMTYsMzExMjEsMzExMjMsMzExMjQsMzExMjUsMzExMjYsMzExMjgsMzExMzEsMzExMzIsMzExMzcsMzExNDQsMzExNDUsMzExNDcsMzExNTEsMzExNTMsMzExNTYsMzExNjAsMzExNjMsMzExNzAsMzExNzIsMzExNzUsMzExNzYsMzExNzgsMzExODMsMzExODgsMzExOTAsMzExOTQsMzExOTcsMzExOTgsMzEyMDAsMzEyMDIsMzEyMDUsMzEyMTAsMzEyMTEsMzEyMTMsMzEyMTcsMzEyMjQsMzEyMjgsMzEyMzQsMzEyMzUsMzEyMzksMzEyNDEsMzEyNDIsMzEyNDQsMzEyNDksMzEyNTMsMzEyNTksMzEyNjIsMzEyNjUsMzEyNzEsMzEyNzUsMzEyNzcsMzEyNzksMzEyODAsMzEyODQsMzEyODUsMzEyODgsMzEyODksMzEyOTAsMzEzMDAsMzEzMDEsMzEzMDMsMzEzMDQsMzEzMDgsMzEzMTcsMzEzMTgsMzEzMjEsMzEzMjQsMzEzMjUsMzEzMjcsMzEzMjgsMzEzMzMsMzEzMzUsMzEzMzgsMzEzNDEsMzEzNDksMzEzNTIsMzEzNTgsMzEzNjAsMzEzNjIsMzEzNjUsMzEzNjYsMzEzNzAsMzEzNzEsMzEzNzYsMzEzNzcsMzEzODAsMzEzOTAsMzEzOTIsMzEzOTUsMzE0MDQsMzE0MTEsMzE0MTMsMzE0MTcsMzE0MTksMzE0MjAsMzE0MzAsMzE0MzMsMzE0MzYsMzE0MzgsMzE0NDEsMzE0NTEsMzE0NjQsMzE0NjUsMzE0NjcsMzE0NjgsMzE0NzMsMzE0NzYsMzE0ODMsMzE0ODUsMzE0ODYsMzE0OTUsMzE1MDgsMzE1MTksMzE1MjMsMzE1MjcsMzE1MjksMzE1MzAsMzE1MzEsMzE1MzMsMzE1MzQsMzE1MzUsMzE1MzYsMzE1MzcsMzE1NDAsMzE1NDksMzE1NTEsMzE1NTIsMzE1NTMsMzE1NTksMzE1NjYsMzE1NzMsMzE1ODQsMzE1ODgsMzE1OTAsMzE1OTMsMzE1OTQsMzE1OTcsMzE1OTksMzE2MDIsMzE2MDMsMzE2MDcsMzE2MjAsMzE2MjUsMzE2MzAsMzE2MzIsMzE2MzMsMzE2MzgsMzE2NDMsMzE2NDYsMzE2NDgsMzE2NTMsMzE2NjAsMzE2NjMsMzE2NjQsMzE2NjYsMzE2NjksMzE2NzAsMzE2NzQsMzE2NzUsMzE2NzYsMzE2NzcsMzE2ODIsMzE2ODUsMzE2ODgsMzE2OTAsMzE3MDAsMzE3MDIsMzE3MDMsMzE3MDUsMzE3MDYsMzE3MDcsMzE3MjAsMzE3MjIsMzE3MzAsMzE3MzIsMzE3MzMsMzE3MzYsMzE3MzcsMzE3MzgsMzE3NDAsMzE3NDIsMzE3NDUsMzE3NDYsMzE3NDcsMzE3NDgsMzE3NTAsMzE3NTMsMzE3NTUsMzE3NTYsMzE3NTgsMzE3NTksMzE3NjksMzE3NzEsMzE3NzYsMzE3ODEsMzE3ODIsMzE3ODQsMzE3ODgsMzE3OTMsMzE3OTUsMzE3OTYsMzE3OTgsMzE4MDEsMzE4MDIsMzE4MTQsMzE4MTgsMzE4MjksMzE4MjUsMzE4MjYsMzE4MjcsMzE4MzMsMzE4MzQsMzE4MzUsMzE4MzYsMzE4MzcsMzE4MzgsMzE4NDEsMzE4NDMsMzE4NDcsMzE4NDksMzE4NTMsMzE4NTQsMzE4NTYsMzE4NTgsMzE4NjUsMzE4NjgsMzE4NjksMzE4NzgsMzE4NzksMzE4ODcsMzE4OTIsMzE5MDIsMzE5MDQsMzE5MTAsMzE5MjAsMzE5MjYsMzE5MjcsMzE5MzAsMzE5MzEsMzE5MzIsMzE5MzUsMzE5NDAsMzE5NDMsMzE5NDQsMzE5NDUsMzE5NDksMzE5NTEsMzE5NTUsMzE5NTYsMzE5NTcsMzE5NTksMzE5NjEsMzE5NjIsMzE5NjUsMzE5NzQsMzE5NzcsMzE5NzksMzE5ODksMzIwMDMsMzIwMDcsMzIwMDgsMzIwMDksMzIwMTUsMzIwMTcsMzIwMTgsMzIwMTksMzIwMjIsMzIwMjksMzIwMzAsMzIwMzUsMzIwMzgsMzIwNDIsMzIwNDUsMzIwNDksMzIwNjAsMzIwNjEsMzIwNjIsMzIwNjQsMzIwNjUsMzIwNzEsMzIwNzIsMzIwNzcsMzIwODEsMzIwODMsMzIwODcsMzIwODksMzIwOTAsMzIwOTIsMzIwOTMsMzIxMDEsMzIxMDMsMzIxMDYsMzIxMTIsMzIxMjAsMzIxMjIsMzIxMjMsMzIxMjcsMzIxMjksMzIxMzAsMzIxMzEsMzIxMzMsMzIxMzQsMzIxMzYsMzIxMzksMzIxNDAsMzIxNDEsMzIxNDUsMzIxNTAsMzIxNTEsMzIxNTcsMzIxNTgsMzIxNjYsMzIxNjcsMzIxNzAsMzIxNzksMzIxODIsMzIxODMsMzIxODUsMzIxOTQsMzIxOTUsMzIxOTYsMzIxOTcsMzIxOTgsMzIyMDQsMzIyMDUsMzIyMDYsMzIyMTUsMzIyMTcsMzIyNTYsMzIyMjYsMzIyMjksMzIyMzAsMzIyMzQsMzIyMzUsMzIyMzcsMzIyNDEsMzIyNDUsMzIyNDYsMzIyNDksMzIyNTAsMzIyNjQsMzIyNzIsMzIyNzMsMzIyNzcsMzIyNzksMzIyODQsMzIyODUsMzIyODgsMzIyOTUsMzIyOTYsMzIzMDAsMzIzMDEsMzIzMDMsMzIzMDcsMzIzMTAsMzIzMTksMzIzMjQsMzIzMjUsMzIzMjcsMzIzMzQsMzIzMzYsMzIzMzgsMzIzNDQsMzIzNTEsMzIzNTMsMzIzNTQsMzIzNTcsMzIzNjMsMzIzNjYsMzIzNjcsMzIzNzEsMzIzNzYsMzIzODIsMzIzODUsMzIzOTAsMzIzOTEsMzIzOTQsMzIzOTcsMzI0MDEsMzI0MDUsMzI0MDgsMzI0MTAsMzI0MTMsMzI0MTQsMzI1NzIsMzI1NzEsMzI1NzMsMzI1NzQsMzI1NzUsMzI1NzksMzI1ODAsMzI1ODMsMzI1OTEsMzI1OTQsMzI1OTUsMzI2MDMsMzI2MDQsMzI2MDUsMzI2MDksMzI2MTEsMzI2MTIsMzI2MTMsMzI2MTQsMzI2MjEsMzI2MjUsMzI2MzcsMzI2MzgsMzI2MzksMzI2NDAsMzI2NTEsMzI2NTMsMzI2NTUsMzI2NTYsMzI2NTcsMzI2NjIsMzI2NjMsMzI2NjgsMzI2NzMsMzI2NzQsMzI2NzgsMzI2ODIsMzI2ODUsMzI2OTIsMzI3MDAsMzI3MDMsMzI3MDQsMzI3MDcsMzI3MTIsMzI3MTgsMzI3MTksMzI3MzEsMzI3MzUsMzI3MzksMzI3NDEsMzI3NDQsMzI3NDgsMzI3NTAsMzI3NTEsMzI3NTQsMzI3NjIsMzI3NjUsMzI3NjYsMzI3NjcsMzI3NzUsMzI3NzYsMzI3NzgsMzI3ODEsMzI3ODIsMzI3ODMsMzI3ODUsMzI3ODcsMzI3ODgsMzI3OTAsMzI3OTcsMzI3OTgsMzI3OTksMzI4MDAsMzI4MDQsMzI4MDYsMzI4MTIsMzI4MTQsMzI4MTYsMzI4MjAsMzI4MjEsMzI4MjMsMzI4MjUsMzI4MjYsMzI4MjgsMzI4MzAsMzI4MzIsMzI4MzYsMzI4NjQsMzI4NjgsMzI4NzAsMzI4NzcsMzI4ODEsMzI4ODUsMzI4OTcsMzI5MDQsMzI5MTAsMzI5MjQsMzI5MjYsMzI5MzQsMzI5MzUsMzI5MzksMzI5NTIsMzI5NTMsMzI5NjgsMzI5NzMsMzI5NzUsMzI5NzgsMzI5ODAsMzI5ODEsMzI5ODMsMzI5ODQsMzI5OTIsMzMwMDUsMzMwMDYsMzMwMDgsMzMwMTAsMzMwMTEsMzMwMTQsMzMwMTcsMzMwMTgsMzMwMjIsMzMwMjcsMzMwMzUsMzMwNDYsMzMwNDcsMzMwNDgsMzMwNTIsMzMwNTQsMzMwNTYsMzMwNjAsMzMwNjMsMzMwNjgsMzMwNzIsMzMwNzcsMzMwODIsMzMwODQsMzMwOTMsMzMwOTUsMzMwOTgsMzMxMDAsMzMxMDYsMzMxMTEsMzMxMjAsMzMxMjEsMzMxMjcsMzMxMjgsMzMxMjksMzMxMzMsMzMxMzUsMzMxNDMsMzMxNTMsMzMxNjgsMzMxNTYsMzMxNTcsMzMxNTgsMzMxNjMsMzMxNjYsMzMxNzQsMzMxNzYsMzMxNzksMzMxODIsMzMxODYsMzMxOTgsMzMyMDIsMzMyMDQsMzMyMTEsMzMyMjcsMzMyMTksMzMyMjEsMzMyMjYsMzMyMzAsMzMyMzEsMzMyMzcsMzMyMzksMzMyNDMsMzMyNDUsMzMyNDYsMzMyNDksMzMyNTIsMzMyNTksMzMyNjAsMzMyNjQsMzMyNjUsMzMyNjYsMzMyNjksMzMyNzAsMzMyNzIsMzMyNzMsMzMyNzcsMzMyNzksMzMyODAsMzMyODMsMzMyOTUsMzMyOTksMzMzMDAsMzMzMDUsMzMzMDYsMzMzMDksMzMzMTMsMzMzMTQsMzMzMjAsMzMzMzAsMzMzMzIsMzMzMzgsMzMzNDcsMzMzNDgsMzMzNDksMzMzNTAsMzMzNTUsMzMzNTgsMzMzNTksMzMzNjEsMzMzNjYsMzMzNzIsMzMzNzYsMzMzNzksMzMzODMsMzMzODksMzMzOTYsMzM0MDMsMzM0MDUsMzM0MDcsMzM0MDgsMzM0MDksMzM0MTEsMzM0MTIsMzM0MTUsMzM0MTcsMzM0MTgsMzM0MjIsMzM0MjUsMzM0MjgsMzM0MzAsMzM0MzIsMzM0MzQsMzM0MzUsMzM0NDAsMzM0NDEsMzM0NDMsMzM0NDQsMzM0NDcsMzM0NDgsMzM0NDksMzM0NTAsMzM0NTQsMzM0NTYsMzM0NTgsMzM0NjAsMzM0NjMsMzM0NjYsMzM0NjgsMzM0NzAsMzM0NzEsMzM0NzgsMzM0ODgsMzM0OTMsMzM0OTgsMzM1MDQsMzM1MDYsMzM1MDgsMzM1MTIsMzM1MTQsMzM1MTcsMzM1MTksMzM1MjYsMzM1MjcsMzM1MzMsMzM1MzQsMzM1MzYsMzM1MzcsMzM1NDMsMzM1NDQsMzM1NDYsMzM1NDcsMzM2MjAsMzM1NjMsMzM1NjUsMzM1NjYsMzM1NjcsMzM1NjksMzM1NzAsMzM1ODAsMzM1ODEsMzM1ODIsMzM1ODQsMzM1ODcsMzM1OTEsMzM1OTQsMzM1OTYsMzM1OTcsMzM2MDIsMzM2MDMsMzM2MDQsMzM2MDcsMzM2MTMsMzM2MTQsMzM2MTcsMzM2MjEsMzM2MjIsMzM2MjMsMzM2NDgsMzM2NTYsMzM2NjEsMzM2NjMsMzM2NjQsMzM2NjYsMzM2NjgsMzM2NzAsMzM2NzcsMzM2ODIsMzM2ODQsMzM2ODUsMzM2ODgsMzM2ODksMzM2OTEsMzM2OTIsMzM2OTMsMzM3MDIsMzM3MDMsMzM3MDUsMzM3MDgsMzM3MjYsMzM3MjcsMzM3MjgsMzM3MzUsMzM3MzcsMzM3NDMsMzM3NDQsMzM3NDUsMzM3NDgsMzM3NTcsMzM2MTksMzM3NjgsMzM3NzAsMzM3ODIsMzM3ODQsMzM3ODUsMzM3ODgsMzM3OTMsMzM3OTgsMzM4MDIsMzM4MDcsMzM4MDksMzM4MTMsMzM4MTcsMzM3MDksMzM4MzksMzM4NDksMzM4NjEsMzM4NjMsMzM4NjQsMzM4NjYsMzM4NjksMzM4NzEsMzM4NzMsMzM4NzQsMzM4NzgsMzM4ODAsMzM4ODEsMzM4ODIsMzM4ODQsMzM4ODgsMzM4OTIsMzM4OTMsMzM4OTUsMzM4OTgsMzM5MDQsMzM5MDcsMzM5MDgsMzM5MTAsMzM5MTIsMzM5MTYsMzM5MTcsMzM5MjEsMzM5MjUsMzM5MzgsMzM5MzksMzM5NDEsMzM5NTAsMzM5NTgsMzM5NjAsMzM5NjEsMzM5NjIsMzM5NjcsMzM5NjksMzM5NzIsMzM5NzgsMzM5ODEsMzM5ODIsMzM5ODQsMzM5ODYsMzM5OTEsMzM5OTIsMzM5OTYsMzM5OTksMzQwMDMsMzQwMTIsMzQwMjMsMzQwMjYsMzQwMzEsMzQwMzIsMzQwMzMsMzQwMzQsMzQwMzksMzQwOTgsMzQwNDIsMzQwNDMsMzQwNDUsMzQwNTAsMzQwNTEsMzQwNTUsMzQwNjAsMzQwNjIsMzQwNjQsMzQwNzYsMzQwNzgsMzQwODIsMzQwODMsMzQwODQsMzQwODUsMzQwODcsMzQwOTAsMzQwOTEsMzQwOTUsMzQwOTksMzQxMDAsMzQxMDIsMzQxMTEsMzQxMTgsMzQxMjcsMzQxMjgsMzQxMjksMzQxMzAsMzQxMzEsMzQxMzQsMzQxMzcsMzQxNDAsMzQxNDEsMzQxNDIsMzQxNDMsMzQxNDQsMzQxNDUsMzQxNDYsMzQxNDgsMzQxNTUsMzQxNTksMzQxNjksMzQxNzAsMzQxNzEsMzQxNzMsMzQxNzUsMzQxNzcsMzQxODEsMzQxODIsMzQxODUsMzQxODcsMzQxODgsMzQxOTEsMzQxOTUsMzQyMDAsMzQyMDUsMzQyMDcsMzQyMDgsMzQyMTAsMzQyMTMsMzQyMTUsMzQyMjgsMzQyMzAsMzQyMzEsMzQyMzIsMzQyMzYsMzQyMzcsMzQyMzgsMzQyMzksMzQyNDIsMzQyNDcsMzQyNTAsMzQyNTEsMzQyNTQsMzQyMjEsMzQyNjQsMzQyNjYsMzQyNzEsMzQyNzIsMzQyNzgsMzQyODAsMzQyODUsMzQyOTEsMzQyOTQsMzQzMDAsMzQzMDMsMzQzMDQsMzQzMDgsMzQzMDksMzQzMTcsMzQzMTgsMzQzMjAsMzQzMjEsMzQzMjIsMzQzMjgsMzQzMjksMzQzMzEsMzQzMzQsMzQzMzcsMzQzNDMsMzQzNDUsMzQzNTgsMzQzNjAsMzQzNjIsMzQzNjQsMzQzNjUsMzQzNjgsMzQzNzAsMzQzNzQsMzQzODYsMzQzODcsMzQzOTAsMzQzOTEsMzQzOTIsMzQzOTMsMzQzOTcsMzQ0MDAsMzQ0MDEsMzQ0MDIsMzQ0MDMsMzQ0MDQsMzQ0MDksMzQ0MTIsMzQ0MTUsMzQ0MjEsMzQ0MjIsMzQ0MjMsMzQ0MjYsMzQ0NDUsMzQ0NDksMzQ0NTQsMzQ0NTYsMzQ0NTgsMzQ0NjAsMzQ0NjUsMzQ0NzAsMzQ0NzEsMzQ0NzIsMzQ0NzcsMzQ0ODEsMzQ0ODMsMzQ0ODQsMzQ0ODUsMzQ0ODcsMzQ0ODgsMzQ0ODksMzQ0OTUsMzQ0OTYsMzQ0OTcsMzQ0OTksMzQ1MDEsMzQ1MTMsMzQ1MTQsMzQ1MTcsMzQ1MTksMzQ1MjIsMzQ1MjQsMzQ1MjgsMzQ1MzEsMzQ1MzMsMzQ1MzUsMzQ0NDAsMzQ1NTQsMzQ1NTYsMzQ1NTcsMzQ1NjQsMzQ1NjUsMzQ1NjcsMzQ1NzEsMzQ1NzQsMzQ1NzUsMzQ1NzYsMzQ1NzksMzQ1ODAsMzQ1ODUsMzQ1OTAsMzQ1OTEsMzQ1OTMsMzQ1OTUsMzQ2MDAsMzQ2MDYsMzQ2MDcsMzQ2MDksMzQ2MTAsMzQ2MTcsMzQ2MTgsMzQ2MjAsMzQ2MjEsMzQ2MjIsMzQ2MjQsMzQ2MjcsMzQ2MjksMzQ2MzcsMzQ2NDgsMzQ2NTMsMzQ2NTcsMzQ2NjAsMzQ2NjEsMzQ2NzEsMzQ2NzMsMzQ2NzQsMzQ2ODMsMzQ2OTEsMzQ2OTIsMzQ2OTMsMzQ2OTQsMzQ2OTUsMzQ2OTYsMzQ2OTcsMzQ2OTksMzQ3MDAsMzQ3MDQsMzQ3MDcsMzQ3MDksMzQ3MTEsMzQ3MTIsMzQ3MTMsMzQ3MTgsMzQ3MjAsMzQ3MjMsMzQ3MjcsMzQ3MzIsMzQ3MzMsMzQ3MzQsMzQ3MzcsMzQ3NDEsMzQ3NTAsMzQ3NTEsMzQ3NTMsMzQ3NjAsMzQ3NjEsMzQ3NjIsMzQ3NjYsMzQ3NzMsMzQ3NzQsMzQ3NzcsMzQ3NzgsMzQ3ODAsMzQ3ODMsMzQ3ODYsMzQ3ODcsMzQ3ODgsMzQ3OTQsMzQ3OTUsMzQ3OTcsMzQ4MDEsMzQ4MDMsMzQ4MDgsMzQ4MTAsMzQ4MTUsMzQ4MTcsMzQ4MTksMzQ4MjIsMzQ4MjUsMzQ4MjYsMzQ4MjcsMzQ4MzIsMzQ4NDEsMzQ4MzQsMzQ4MzUsMzQ4MzYsMzQ4NDAsMzQ4NDIsMzQ4NDMsMzQ4NDQsMzQ4NDYsMzQ4NDcsMzQ4NTYsMzQ4NjEsMzQ4NjIsMzQ4NjQsMzQ4NjYsMzQ4NjksMzQ4NzQsMzQ4NzYsMzQ4ODEsMzQ4ODMsMzQ4ODUsMzQ4ODgsMzQ4ODksMzQ4OTAsMzQ4OTEsMzQ4OTQsMzQ4OTcsMzQ5MDEsMzQ5MDIsMzQ5MDQsMzQ5MDYsMzQ5MDgsMzQ5MTEsMzQ5MTIsMzQ5MTYsMzQ5MjEsMzQ5MjksMzQ5MzcsMzQ5MzksMzQ5NDQsMzQ5NjgsMzQ5NzAsMzQ5NzEsMzQ5NzIsMzQ5NzUsMzQ5NzYsMzQ5ODQsMzQ5ODYsMzUwMDIsMzUwMDUsMzUwMDYsMzUwMDgsMzUwMTgsMzUwMTksMzUwMjAsMzUwMjEsMzUwMjIsMzUwMjUsMzUwMjYsMzUwMjcsMzUwMzUsMzUwMzgsMzUwNDcsMzUwNTUsMzUwNTYsMzUwNTcsMzUwNjEsMzUwNjMsMzUwNzMsMzUwNzgsMzUwODUsMzUwODYsMzUwODcsMzUwOTMsMzUwOTQsMzUwOTYsMzUwOTcsMzUwOTgsMzUxMDAsMzUxMDQsMzUxMTAsMzUxMTEsMzUxMTIsMzUxMjAsMzUxMjEsMzUxMjIsMzUxMjUsMzUxMjksMzUxMzAsMzUxMzQsMzUxMzYsMzUxMzgsMzUxNDEsMzUxNDIsMzUxNDUsMzUxNTEsMzUxNTQsMzUxNTksMzUxNjIsMzUxNjMsMzUxNjQsMzUxNjksMzUxNzAsMzUxNzEsMzUxNzksMzUxODIsMzUxODQsMzUxODcsMzUxODksMzUxOTQsMzUxOTUsMzUxOTYsMzUxOTcsMzUyMDksMzUyMTMsMzUyMTYsMzUyMjAsMzUyMjEsMzUyMjcsMzUyMjgsMzUyMzEsMzUyMzIsMzUyMzcsMzUyNDgsMzUyNTIsMzUyNTMsMzUyNTQsMzUyNTUsMzUyNjAsMzUyODQsMzUyODUsMzUyODYsMzUyODcsMzUyODgsMzUzMDEsMzUzMDUsMzUzMDcsMzUzMDksMzUzMTMsMzUzMTUsMzUzMTgsMzUzMjEsMzUzMjUsMzUzMjcsMzUzMzIsMzUzMzMsMzUzMzUsMzUzNDMsMzUzNDUsMzUzNDYsMzUzNDgsMzUzNDksMzUzNTgsMzUzNjAsMzUzNjIsMzUzNjQsMzUzNjYsMzUzNzEsMzUzNzIsMzUzNzUsMzUzODEsMzUzODMsMzUzODksMzUzOTAsMzUzOTIsMzUzOTUsMzUzOTcsMzUzOTksMzU0MDEsMzU0MDUsMzU0MDYsMzU0MTEsMzU0MTQsMzU0MTUsMzU0MTYsMzU0MjAsMzU0MjEsMzU0MjUsMzU0MjksMzU0MzEsMzU0NDUsMzU0NDYsMzU0NDcsMzU0NDksMzU0NTAsMzU0NTEsMzU0NTQsMzU0NTUsMzU0NTYsMzU0NTksMzU0NjIsMzU0NjcsMzU0NzEsMzU0NzIsMzU0NzQsMzU0NzgsMzU0NzksMzU0ODEsMzU0ODcsMzU0OTUsMzU0OTcsMzU1MDIsMzU1MDMsMzU1MDcsMzU1MTAsMzU1MTEsMzU1MTUsMzU1MTgsMzU1MjMsMzU1MjYsMzU1MjgsMzU1MjksMzU1MzAsMzU1MzcsMzU1MzksMzU1NDAsMzU1NDEsMzU1NDMsMzU1NDksMzU1NTEsMzU1NjQsMzU1NjgsMzU1NzIsMzU1NzMsMzU1NzQsMzU1ODAsMzU1ODMsMzU1ODksMzU1OTAsMzU1OTUsMzU2MDEsMzU2MTIsMzU2MTQsMzU2MTUsMzU1OTQsMzU2MjksMzU2MzIsMzU2MzksMzU2NDQsMzU2NTAsMzU2NTEsMzU2NTIsMzU2NTMsMzU2NTQsMzU2NTYsMzU2NjYsMzU2NjcsMzU2NjgsMzU2NzMsMzU2NjEsMzU2NzgsMzU2ODMsMzU2OTMsMzU3MDIsMzU3MDQsMzU3MDUsMzU3MDgsMzU3MTAsMzU3MTMsMzU3MTYsMzU3MTcsMzU3MjMsMzU3MjUsMzU3MjcsMzU3MzIsMzU3MzMsMzU3NDAsMzU3NDIsMzU3NDMsMzU4OTYsMzU4OTcsMzU5MDEsMzU5MDIsMzU5MDksMzU5MTEsMzU5MTMsMzU5MTUsMzU5MTksMzU5MjEsMzU5MjMsMzU5MjQsMzU5MjcsMzU5MjgsMzU5MzEsMzU5MzMsMzU5MjksMzU5MzksMzU5NDAsMzU5NDIsMzU5NDQsMzU5NDUsMzU5NDksMzU5NTUsMzU5NTcsMzU5NTgsMzU5NjMsMzU5NjYsMzU5NzQsMzU5NzUsMzU5NzksMzU5ODQsMzU5ODYsMzU5ODcsMzU5OTMsMzU5OTUsMzU5OTYsMzYwMDQsMzYwMjUsMzYwMjYsMzYwMzcsMzYwMzgsMzYwNDEsMzYwNDMsMzYwNDcsMzYwNTQsMzYwNTMsMzYwNTcsMzYwNjEsMzYwNjUsMzYwNzIsMzYwNzYsMzYwNzksMzYwODAsMzYwODIsMzYwODUsMzYwODcsMzYwODgsMzYwOTQsMzYwOTUsMzYwOTcsMzYwOTksMzYxMDUsMzYxMTQsMzYxMTksMzYxMjMsMzYxOTcsMzYyMDEsMzYyMDQsMzYyMDYsMzYyMjMsMzYyMjYsMzYyMjgsMzYyMzIsMzYyMzcsMzYyNDAsMzYyNDEsMzYyNDUsMzYyNTQsMzYyNTUsMzYyNTYsMzYyNjIsMzYyNjcsMzYyNjgsMzYyNzEsMzYyNzQsMzYyNzcsMzYyNzksMzYyODEsMzYyODMsMzYyODgsMzYyOTMsMzYyOTQsMzYyOTUsMzYyOTYsMzYyOTgsMzYzMDIsMzYzMDUsMzYzMDgsMzYzMDksMzYzMTEsMzYzMTMsMzYzMjQsMzYzMjUsMzYzMjcsMzYzMzIsMzYzMzYsMzYyODQsMzYzMzcsMzYzMzgsMzYzNDAsMzYzNDksMzYzNTMsMzYzNTYsMzYzNTcsMzYzNTgsMzYzNjMsMzYzNjksMzYzNzIsMzYzNzQsMzYzODQsMzYzODUsMzYzODYsMzYzODcsMzYzOTAsMzYzOTEsMzY0MDEsMzY0MDMsMzY0MDYsMzY0MDcsMzY0MDgsMzY0MDksMzY0MTMsMzY0MTYsMzY0MTcsMzY0MjcsMzY0MjksMzY0MzAsMzY0MzEsMzY0MzYsMzY0NDMsMzY0NDQsMzY0NDUsMzY0NDYsMzY0NDksMzY0NTAsMzY0NTcsMzY0NjAsMzY0NjEsMzY0NjMsMzY0NjQsMzY0NjUsMzY0NzMsMzY0NzQsMzY0NzUsMzY0ODIsMzY0ODMsMzY0ODksMzY0OTYsMzY0OTgsMzY1MDEsMzY1MDYsMzY1MDcsMzY1MDksMzY1MTAsMzY1MTQsMzY1MTksMzY1MjEsMzY1MjUsMzY1MjYsMzY1MzEsMzY1MzMsMzY1MzgsMzY1MzksMzY1NDQsMzY1NDUsMzY1NDcsMzY1NDgsMzY1NTEsMzY1NTksMzY1NjEsMzY1NjQsMzY1NzIsMzY1ODQsMzY1OTAsMzY1OTIsMzY1OTMsMzY1OTksMzY2MDEsMzY2MDIsMzY1ODksMzY2MDgsMzY2MTAsMzY2MTUsMzY2MTYsMzY2MjMsMzY2MjQsMzY2MzAsMzY2MzEsMzY2MzIsMzY2MzgsMzY2NDAsMzY2NDEsMzY2NDMsMzY2NDUsMzY2NDcsMzY2NDgsMzY2NTIsMzY2NTMsMzY2NTQsMzY2NjAsMzY2NjEsMzY2NjIsMzY2NjMsMzY2NjYsMzY2NzIsMzY2NzMsMzY2NzUsMzY2NzksMzY2ODcsMzY2ODksMzY2OTAsMzY2OTEsMzY2OTIsMzY2OTMsMzY2OTYsMzY3MDEsMzY3MDIsMzY3MDksMzY3NjUsMzY3NjgsMzY3NjksMzY3NzIsMzY3NzMsMzY3NzQsMzY3ODksMzY3OTAsMzY3OTIsMzY3OTgsMzY4MDAsMzY4MDEsMzY4MDYsMzY4MTAsMzY4MTEsMzY4MTMsMzY4MTYsMzY4MTgsMzY4MTksMzY4MjEsMzY4MzIsMzY4MzUsMzY4MzYsMzY4NDAsMzY4NDYsMzY4NDksMzY4NTMsMzY4NTQsMzY4NTksMzY4NjIsMzY4NjYsMzY4NjgsMzY4NzIsMzY4NzYsMzY4ODgsMzY4OTEsMzY5MDQsMzY5MDUsMzY5MTEsMzY5MDYsMzY5MDgsMzY5MDksMzY5MTUsMzY5MTYsMzY5MTksMzY5MjcsMzY5MzEsMzY5MzIsMzY5NDAsMzY5NTUsMzY5NTcsMzY5NjIsMzY5NjYsMzY5NjcsMzY5NzIsMzY5NzYsMzY5ODAsMzY5ODUsMzY5OTcsMzcwMDAsMzcwMDMsMzcwMDQsMzcwMDYsMzcwMDgsMzcwMTMsMzcwMTUsMzcwMTYsMzcwMTcsMzcwMTksMzcwMjQsMzcwMjUsMzcwMjYsMzcwMjksMzcwNDAsMzcwNDIsMzcwNDMsMzcwNDQsMzcwNDYsMzcwNTMsMzcwNjgsMzcwNTQsMzcwNTksMzcwNjAsMzcwNjEsMzcwNjMsMzcwNjQsMzcwNzcsMzcwNzksMzcwODAsMzcwODEsMzcwODQsMzcwODUsMzcwODcsMzcwOTMsMzcwNzQsMzcxMTAsMzcwOTksMzcxMDMsMzcxMDQsMzcxMDgsMzcxMTgsMzcxMTksMzcxMjAsMzcxMjQsMzcxMjUsMzcxMjYsMzcxMjgsMzcxMzMsMzcxMzYsMzcxNDAsMzcxNDIsMzcxNDMsMzcxNDQsMzcxNDYsMzcxNDgsMzcxNTAsMzcxNTIsMzcxNTcsMzcxNTQsMzcxNTUsMzcxNTksMzcxNjEsMzcxNjYsMzcxNjcsMzcxNjksMzcxNzIsMzcxNzQsMzcxNzUsMzcxNzcsMzcxNzgsMzcxODAsMzcxODEsMzcxODcsMzcxOTEsMzcxOTIsMzcxOTksMzcyMDMsMzcyMDcsMzcyMDksMzcyMTAsMzcyMTEsMzcyMTcsMzcyMjAsMzcyMjMsMzcyMjksMzcyMzYsMzcyNDEsMzcyNDIsMzcyNDMsMzcyNDksMzcyNTEsMzcyNTMsMzcyNTQsMzcyNTgsMzcyNjIsMzcyNjUsMzcyNjcsMzcyNjgsMzcyNjksMzcyNzIsMzcyNzgsMzcyODEsMzcyODYsMzcyODgsMzcyOTIsMzcyOTMsMzcyOTQsMzcyOTYsMzcyOTcsMzcyOTgsMzcyOTksMzczMDIsMzczMDcsMzczMDgsMzczMDksMzczMTEsMzczMTQsMzczMTUsMzczMTcsMzczMzEsMzczMzIsMzczMzUsMzczMzcsMzczMzgsMzczNDIsMzczNDgsMzczNDksMzczNTMsMzczNTQsMzczNTYsMzczNTcsMzczNTgsMzczNTksMzczNjAsMzczNjEsMzczNjcsMzczNjksMzczNzEsMzczNzMsMzczNzYsMzczNzcsMzczODAsMzczODEsMzczODIsMzczODMsMzczODUsMzczODYsMzczODgsMzczOTIsMzczOTQsMzczOTUsMzczOTgsMzc0MDAsMzc0MDQsMzc0MDUsMzc0MTEsMzc0MTIsMzc0MTMsMzc0MTQsMzc0MTYsMzc0MjIsMzc0MjMsMzc0MjQsMzc0MjcsMzc0MjksMzc0MzAsMzc0MzIsMzc0MzMsMzc0MzQsMzc0MzYsMzc0MzgsMzc0NDAsMzc0NDIsMzc0NDMsMzc0NDYsMzc0NDcsMzc0NTAsMzc0NTMsMzc0NTQsMzc0NTUsMzc0NTcsMzc0NjQsMzc0NjUsMzc0NjgsMzc0NjksMzc0NzIsMzc0NzMsMzc0NzcsMzc0NzksMzc0ODAsMzc0ODEsMzc0ODYsMzc0ODcsMzc0ODgsMzc0OTMsMzc0OTQsMzc0OTUsMzc0OTYsMzc0OTcsMzc0OTksMzc1MDAsMzc1MDEsMzc1MDMsMzc1MTIsMzc1MTMsMzc1MTQsMzc1MTcsMzc1MTgsMzc1MjIsMzc1MjcsMzc1MjksMzc1MzUsMzc1MzYsMzc1NDAsMzc1NDEsMzc1NDMsMzc1NDQsMzc1NDcsMzc1NTEsMzc1NTQsMzc1NTgsMzc1NjAsMzc1NjIsMzc1NjMsMzc1NjQsMzc1NjUsMzc1NjcsMzc1NjgsMzc1NjksMzc1NzAsMzc1NzEsMzc1NzMsMzc1NzQsMzc1NzUsMzc1NzYsMzc1NzksMzc1ODAsMzc1ODEsMzc1ODIsMzc1ODQsMzc1ODcsMzc1ODksMzc1OTEsMzc1OTIsMzc1OTMsMzc1OTYsMzc1OTcsMzc1OTksMzc2MDAsMzc2MDEsMzc2MDMsMzc2MDUsMzc2MDcsMzc2MDgsMzc2MTIsMzc2MTQsMzc2MTYsMzc2MjUsMzc2MjcsMzc2MzEsMzc2MzIsMzc2MzQsMzc2NDAsMzc2NDUsMzc2NDksMzc2NTIsMzc2NTMsMzc2NjAsMzc2NjEsMzc2NjIsMzc2NjMsMzc2NjUsMzc2NjgsMzc2NjksMzc2NzEsMzc2NzMsMzc2NzQsMzc2ODMsMzc2ODQsMzc2ODYsMzc2ODcsMzc3MDMsMzc3MDQsMzc3MDUsMzc3MTIsMzc3MTMsMzc3MTQsMzc3MTcsMzc3MTksMzc3MjAsMzc3MjIsMzc3MjYsMzc3MzIsMzc3MzMsMzc3MzUsMzc3MzcsMzc3MzgsMzc3NDEsMzc3NDMsMzc3NDQsMzc3NDUsMzc3NDcsMzc3NDgsMzc3NTAsMzc3NTQsMzc3NTcsMzc3NTksMzc3NjAsMzc3NjEsMzc3NjIsMzc3NjgsMzc3NzAsMzc3NzEsMzc3NzMsMzc3NzUsMzc3NzgsMzc3ODEsMzc3ODQsMzc3ODcsMzc3OTAsMzc3OTMsMzc3OTUsMzc3OTYsMzc3OTgsMzc4MDAsMzc4MDMsMzc4MTIsMzc4MTMsMzc4MTQsMzc4MTgsMzc4MDEsMzc4MjUsMzc4MjgsMzc4MjksMzc4MzAsMzc4MzEsMzc4MzMsMzc4MzQsMzc4MzUsMzc4MzYsMzc4MzcsMzc4NDMsMzc4NDksMzc4NTIsMzc4NTQsMzc4NTUsMzc4NTgsMzc4NjIsMzc4NjMsMzc4ODEsMzc4NzksMzc4ODAsMzc4ODIsMzc4ODMsMzc4ODUsMzc4ODksMzc4OTAsMzc4OTIsMzc4OTYsMzc4OTcsMzc5MDEsMzc5MDIsMzc5MDMsMzc5MDksMzc5MTAsMzc5MTEsMzc5MTksMzc5MzQsMzc5MzUsMzc5MzcsMzc5MzgsMzc5MzksMzc5NDAsMzc5NDcsMzc5NTEsMzc5NDksMzc5NTUsMzc5NTcsMzc5NjAsMzc5NjIsMzc5NjQsMzc5NzMsMzc5NzcsMzc5ODAsMzc5ODMsMzc5ODUsMzc5ODcsMzc5OTIsMzc5OTUsMzc5OTcsMzc5OTgsMzc5OTksMzgwMDEsMzgwMDIsMzgwMjAsMzgwMTksMzgyNjQsMzgyNjUsMzgyNzAsMzgyNzYsMzgyODAsMzgyODQsMzgyODUsMzgyODYsMzgzMDEsMzgzMDIsMzgzMDMsMzgzMDUsMzgzMTAsMzgzMTMsMzgzMTUsMzgzMTYsMzgzMjQsMzgzMjYsMzgzMzAsMzgzMzMsMzgzMzUsMzgzNDIsMzgzNDQsMzgzNDUsMzgzNDcsMzgzNTIsMzgzNTMsMzgzNTQsMzgzNTUsMzgzNjEsMzgzNjIsMzgzNjUsMzgzNjYsMzgzNjcsMzgzNjgsMzgzNzIsMzgzNzQsMzg0MjksMzg0MzAsMzg0MzQsMzg0MzYsMzg0MzcsMzg0MzgsMzg0NDQsMzg0NDksMzg0NTEsMzg0NTUsMzg0NTYsMzg0NTcsMzg0NTgsMzg0NjAsMzg0NjEsMzg0NjUsMzg0ODIsMzg0ODQsMzg0ODYsMzg0ODcsMzg0ODgsMzg0OTcsMzg1MTAsMzg1MTYsMzg1MjMsMzg1MjQsMzg1MjYsMzg1MjcsMzg1MjksMzg1MzAsMzg1MzEsMzg1MzIsMzg1MzcsMzg1NDUsMzg1NTAsMzg1NTQsMzg1NTcsMzg1NTksMzg1NjQsMzg1NjUsMzg1NjYsMzg1NjksMzg1NzQsMzg1NzUsMzg1NzksMzg1ODYsMzg2MDIsMzg2MTAsMjM5ODYsMzg2MTYsMzg2MTgsMzg2MjEsMzg2MjIsMzg2MjMsMzg2MzMsMzg2MzksMzg2NDEsMzg2NTAsMzg2NTgsMzg2NTksMzg2NjEsMzg2NjUsMzg2ODIsMzg2ODMsMzg2ODUsMzg2ODksMzg2OTAsMzg2OTEsMzg2OTYsMzg3MDUsMzg3MDcsMzg3MjEsMzg3MjMsMzg3MzAsMzg3MzQsMzg3MzUsMzg3NDEsMzg3NDMsMzg3NDQsMzg3NDYsMzg3NDcsMzg3NTUsMzg3NTksMzg3NjIsMzg3NjYsMzg3NzEsMzg3NzQsMzg3NzUsMzg3NzYsMzg3NzksMzg3ODEsMzg3ODMsMzg3ODQsMzg3OTMsMzg4MDUsMzg4MDYsMzg4MDcsMzg4MDksMzg4MTAsMzg4MTQsMzg4MTUsMzg4MTgsMzg4MjgsMzg4MzAsMzg4MzMsMzg4MzQsMzg4MzcsMzg4MzgsMzg4NDAsMzg4NDEsMzg4NDIsMzg4NDQsMzg4NDYsMzg4NDcsMzg4NDksMzg4NTIsMzg4NTMsMzg4NTUsMzg4NTcsMzg4NTgsMzg4NjAsMzg4NjEsMzg4NjIsMzg4NjQsMzg4NjUsMzg4NjgsMzg4NzEsMzg4NzIsMzg4NzMsMzg4NzcsMzg4NzgsMzg4ODAsMzg4NzUsMzg4ODEsMzg4ODQsMzg4OTUsMzg4OTcsMzg5MDAsMzg5MDMsMzg5MDQsMzg5MDYsMzg5MTksMzg5MjIsMzg5MzcsMzg5MjUsMzg5MjYsMzg5MzIsMzg5MzQsMzg5NDAsMzg5NDIsMzg5NDQsMzg5NDcsMzg5NTAsMzg5NTUsMzg5NTgsMzg5NTksMzg5NjAsMzg5NjIsMzg5NjMsMzg5NjUsMzg5NDksMzg5NzQsMzg5ODAsMzg5ODMsMzg5ODYsMzg5OTMsMzg5OTQsMzg5OTUsMzg5OTgsMzg5OTksMzkwMDEsMzkwMDIsMzkwMTAsMzkwMTEsMzkwMTMsMzkwMTQsMzkwMTgsMzkwMjAsMzkwODMsMzkwODUsMzkwODYsMzkwODgsMzkwOTIsMzkwOTUsMzkwOTYsMzkwOTgsMzkwOTksMzkxMDMsMzkxMDYsMzkxMDksMzkxMTIsMzkxMTYsMzkxMzcsMzkxMzksMzkxNDEsMzkxNDIsMzkxNDMsMzkxNDYsMzkxNTUsMzkxNTgsMzkxNzAsMzkxNzUsMzkxNzYsMzkxODUsMzkxODksMzkxOTAsMzkxOTEsMzkxOTQsMzkxOTUsMzkxOTYsMzkxOTksMzkyMDIsMzkyMDYsMzkyMDcsMzkyMTEsMzkyMTcsMzkyMTgsMzkyMTksMzkyMjAsMzkyMjEsMzkyMjUsMzkyMjYsMzkyMjcsMzkyMjgsMzkyMzIsMzkyMzMsMzkyMzgsMzkyMzksMzkyNDAsMzkyNDUsMzkyNDYsMzkyNTIsMzkyNTYsMzkyNTcsMzkyNTksMzkyNjAsMzkyNjIsMzkyNjMsMzkyNjQsMzkzMjMsMzkzMjUsMzkzMjcsMzkzMzQsMzkzNDQsMzkzNDUsMzkzNDYsMzkzNDksMzkzNTMsMzkzNTQsMzkzNTcsMzkzNTksMzkzNjMsMzkzNjksMzkzNzksMzkzODAsMzkzODUsMzkzODYsMzkzODgsMzkzOTAsMzkzOTksMzk0MDIsMzk0MDMsMzk0MDQsMzk0MDgsMzk0MTIsMzk0MTMsMzk0MTcsMzk0MjEsMzk0MjIsMzk0MjYsMzk0MjcsMzk0MjgsMzk0MzUsMzk0MzYsMzk0NDAsMzk0NDEsMzk0NDYsMzk0NTQsMzk0NTYsMzk0NTgsMzk0NTksMzk0NjAsMzk0NjMsMzk0NjksMzk0NzAsMzk0NzUsMzk0NzcsMzk0NzgsMzk0ODAsMzk0OTUsMzk0ODksMzk0OTIsMzk0OTgsMzk0OTksMzk1MDAsMzk1MDIsMzk1MDUsMzk1MDgsMzk1MTAsMzk1MTcsMzk1OTQsMzk1OTYsMzk1OTgsMzk1OTksMzk2MDIsMzk2MDQsMzk2MDUsMzk2MDYsMzk2MDksMzk2MTEsMzk2MTQsMzk2MTUsMzk2MTcsMzk2MTksMzk2MjIsMzk2MjQsMzk2MzAsMzk2MzIsMzk2MzQsMzk2MzcsMzk2MzgsMzk2MzksMzk2NDMsMzk2NDQsMzk2NDgsMzk2NTIsMzk2NTMsMzk2NTUsMzk2NTcsMzk2NjAsMzk2NjYsMzk2NjcsMzk2NjksMzk2NzMsMzk2NzQsMzk2NzcsMzk2NzksMzk2ODAsMzk2ODEsMzk2ODIsMzk2ODMsMzk2ODQsMzk2ODUsMzk2ODgsMzk2ODksMzk2OTEsMzk2OTIsMzk2OTMsMzk2OTQsMzk2OTYsMzk2OTgsMzk3MDIsMzk3MDUsMzk3MDcsMzk3MDgsMzk3MTIsMzk3MTgsMzk3MjMsMzk3MjUsMzk3MzEsMzk3MzIsMzk3MzMsMzk3MzUsMzk3MzcsMzk3MzgsMzk3NDEsMzk3NTIsMzk3NTUsMzk3NTYsMzk3NjUsMzk3NjYsMzk3NjcsMzk3NzEsMzk3NzQsMzk3NzcsMzk3NzksMzk3ODEsMzk3ODIsMzk3ODQsMzk3ODYsMzk3ODcsMzk3ODgsMzk3ODksMzk3OTAsMzk3OTUsMzk3OTcsMzk3OTksMzk4MDAsMzk4MDEsMzk4MDcsMzk4MDgsMzk4MTIsMzk4MTMsMzk4MTQsMzk4MTUsMzk4MTcsMzk4MTgsMzk4MTksMzk4MjEsMzk4MjMsMzk4MjQsMzk4MjgsMzk4MzQsMzk4MzcsMzk4MzgsMzk4NDYsMzk4NDcsMzk4NDksMzk4NTIsMzk4NTYsMzk4NTcsMzk4NTgsMzk4NjMsMzk4NjQsMzk4NjcsMzk4NjgsMzk4NzAsMzk4NzEsMzk4NzMsMzk4NzksMzk4ODAsMzk4ODYsMzk4ODgsMzk4OTUsMzk4OTYsMzk5MDEsMzk5MDMsMzk5MDksMzk5MTEsMzk5MTQsMzk5MTUsMzk5MTksMzk5MjMsMzk5MjcsMzk5MjgsMzk5MjksMzk5MzAsMzk5MzMsMzk5MzUsMzk5MzYsMzk5MzgsMzk5NDcsMzk5NTEsMzk5NTMsMzk5NTgsMzk5NjAsMzk5NjEsMzk5NjIsMzk5NjQsMzk5NjYsMzk5NzAsMzk5NzEsMzk5NzQsMzk5NzUsMzk5NzYsMzk5NzcsMzk5NzgsMzk5ODUsMzk5ODksMzk5OTAsMzk5OTEsMzk5OTcsNDAwMDEsNDAwMDMsNDAwMDQsNDAwMDUsNDAwMDksNDAwMTAsNDAwMTQsNDAwMTUsNDAwMTYsNDAwMTksNDAwMjAsNDAwMjIsNDAwMjQsNDAwMjcsNDAwMjksNDAwMzAsNDAwMzEsNDAwMzUsNDAwNDEsNDAwNDIsNDAwMjgsNDAwNDMsNDAwNDAsNDAwNDYsNDAwNDgsNDAwNTAsNDAwNTMsNDAwNTUsNDAwNTksNDAxNjYsNDAxNzgsNDAxODMsNDAxODUsNDAyMDMsNDAxOTQsNDAyMDksNDAyMTUsNDAyMTYsNDAyMjAsNDAyMjEsNDAyMjIsNDAyMzksNDAyNDAsNDAyNDIsNDAyNDMsNDAyNDQsNDAyNTAsNDAyNTIsNDAyNjEsNDAyNTMsNDAyNTgsNDAyNTksNDAyNjMsNDAyNjYsNDAyNzUsNDAyNzYsNDAyODcsNDAyOTEsNDAyOTAsNDAyOTMsNDAyOTcsNDAyOTgsNDAyOTksNDAzMDQsNDAzMTAsNDAzMTEsNDAzMTUsNDAzMTYsNDAzMTgsNDAzMjMsNDAzMjQsNDAzMjYsNDAzMzAsNDAzMzMsNDAzMzQsNDAzMzgsNDAzMzksNDAzNDEsNDAzNDIsNDAzNDMsNDAzNDQsNDAzNTMsNDAzNjIsNDAzNjQsNDAzNjYsNDAzNjksNDAzNzMsNDAzNzcsNDAzODAsNDAzODMsNDAzODcsNDAzOTEsNDAzOTMsNDAzOTQsNDA0MDQsNDA0MDUsNDA0MDYsNDA0MDcsNDA0MTAsNDA0MTQsNDA0MTUsNDA0MTYsNDA0MjEsNDA0MjMsNDA0MjUsNDA0MjcsNDA0MzAsNDA0MzIsNDA0MzUsNDA0MzYsNDA0NDYsNDA0NTgsNDA0NTAsNDA0NTUsNDA0NjIsNDA0NjQsNDA0NjUsNDA0NjYsNDA0NjksNDA0NzAsNDA0NzMsNDA0NzYsNDA0NzcsNDA1NzAsNDA1NzEsNDA1NzIsNDA1NzYsNDA1NzgsNDA1NzksNDA1ODAsNDA1ODEsNDA1ODMsNDA1OTAsNDA1OTEsNDA1OTgsNDA2MDAsNDA2MDMsNDA2MDYsNDA2MTIsNDA2MTYsNDA2MjAsNDA2MjIsNDA2MjMsNDA2MjQsNDA2MjcsNDA2MjgsNDA2MjksNDA2NDYsNDA2NDgsNDA2NTEsNDA2NjEsNDA2NzEsNDA2NzYsNDA2NzksNDA2ODQsNDA2ODUsNDA2ODYsNDA2ODgsNDA2ODksNDA2OTAsNDA2OTMsNDA2OTYsNDA3MDMsNDA3MDYsNDA3MDcsNDA3MTMsNDA3MTksNDA3MjAsNDA3MjEsNDA3MjIsNDA3MjQsNDA3MjYsNDA3MjcsNDA3MjksNDA3MzAsNDA3MzEsNDA3MzUsNDA3MzgsNDA3NDIsNDA3NDYsNDA3NDcsNDA3NTEsNDA3NTMsNDA3NTQsNDA3NTYsNDA3NTksNDA3NjEsNDA3NjIsNDA3NjQsNDA3NjUsNDA3NjcsNDA3NjksNDA3NzEsNDA3NzIsNDA3NzMsNDA3NzQsNDA3NzUsNDA3ODcsNDA3ODksNDA3OTAsNDA3OTEsNDA3OTIsNDA3OTQsNDA3OTcsNDA3OTgsNDA4MDgsNDA4MDksNDA4MTMsNDA4MTQsNDA4MTUsNDA4MTYsNDA4MTcsNDA4MTksNDA4MjEsNDA4MjYsNDA4MjksNDA4NDcsNDA4NDgsNDA4NDksNDA4NTAsNDA4NTIsNDA4NTQsNDA4NTUsNDA4NjIsNDA4NjUsNDA4NjYsNDA4NjcsNDA4NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxcbiAgXCJpYm04NjZcIjpbMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsOTYxNyw5NjE4LDk2MTksOTQ3NCw5NTA4LDk1NjksOTU3MCw5NTU4LDk1NTcsOTU3MSw5NTUzLDk1NTksOTU2NSw5NTY0LDk1NjMsOTQ4OCw5NDkyLDk1MjQsOTUxNiw5NTAwLDk0NzIsOTUzMiw5NTY2LDk1NjcsOTU2Miw5NTU2LDk1NzcsOTU3NCw5NTY4LDk1NTIsOTU4MCw5NTc1LDk1NzYsOTU3Miw5NTczLDk1NjEsOTU2MCw5NTU0LDk1NTUsOTU3OSw5NTc4LDk0OTYsOTQ4NCw5NjA4LDk2MDQsOTYxMiw5NjE2LDk2MDAsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMywxMDI1LDExMDUsMTAyOCwxMTA4LDEwMzEsMTExMSwxMDM4LDExMTgsMTc2LDg3MjksMTgzLDg3MzAsODQ3MCwxNjQsOTYzMiwxNjBdLFxuICBcImlzby04ODU5LTJcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMjYwLDcyOCwzMjEsMTY0LDMxNywzNDYsMTY3LDE2OCwzNTIsMzUwLDM1NiwzNzcsMTczLDM4MSwzNzksMTc2LDI2MSw3MzEsMzIyLDE4MCwzMTgsMzQ3LDcxMSwxODQsMzUzLDM1MSwzNTcsMzc4LDczMywzODIsMzgwLDM0MCwxOTMsMTk0LDI1OCwxOTYsMzEzLDI2MiwxOTksMjY4LDIwMSwyODAsMjAzLDI4MiwyMDUsMjA2LDI3MCwyNzIsMzIzLDMyNywyMTEsMjEyLDMzNiwyMTQsMjE1LDM0NCwzNjYsMjE4LDM2OCwyMjAsMjIxLDM1NCwyMjMsMzQxLDIyNSwyMjYsMjU5LDIyOCwzMTQsMjYzLDIzMSwyNjksMjMzLDI4MSwyMzUsMjgzLDIzNywyMzgsMjcxLDI3MywzMjQsMzI4LDI0MywyNDQsMzM3LDI0NiwyNDcsMzQ1LDM2NywyNTAsMzY5LDI1MiwyNTMsMzU1LDcyOV0sXG4gIFwiaXNvLTg4NTktM1wiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwyOTQsNzI4LDE2MywxNjQsbnVsbCwyOTIsMTY3LDE2OCwzMDQsMzUwLDI4NiwzMDgsMTczLG51bGwsMzc5LDE3NiwyOTUsMTc4LDE3OSwxODAsMTgxLDI5MywxODMsMTg0LDMwNSwzNTEsMjg3LDMwOSwxODksbnVsbCwzODAsMTkyLDE5MywxOTQsbnVsbCwxOTYsMjY2LDI2NCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNyxudWxsLDIwOSwyMTAsMjExLDIxMiwyODgsMjE0LDIxNSwyODQsMjE3LDIxOCwyMTksMjIwLDM2NCwzNDgsMjIzLDIyNCwyMjUsMjI2LG51bGwsMjI4LDI2NywyNjUsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksbnVsbCwyNDEsMjQyLDI0MywyNDQsMjg5LDI0NiwyNDcsMjg1LDI0OSwyNTAsMjUxLDI1MiwzNjUsMzQ5LDcyOV0sXG4gIFwiaXNvLTg4NTktNFwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwyNjAsMzEyLDM0MiwxNjQsMjk2LDMxNSwxNjcsMTY4LDM1MiwyNzQsMjkwLDM1OCwxNzMsMzgxLDE3NSwxNzYsMjYxLDczMSwzNDMsMTgwLDI5NywzMTYsNzExLDE4NCwzNTMsMjc1LDI5MSwzNTksMzMwLDM4MiwzMzEsMjU2LDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDMwMiwyNjgsMjAxLDI4MCwyMDMsMjc4LDIwNSwyMDYsMjk4LDI3MiwzMjUsMzMyLDMxMCwyMTIsMjEzLDIxNCwyMTUsMjE2LDM3MCwyMTgsMjE5LDIyMCwzNjAsMzYyLDIyMywyNTcsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMzAzLDI2OSwyMzMsMjgxLDIzNSwyNzksMjM3LDIzOCwyOTksMjczLDMyNiwzMzMsMzExLDI0NCwyNDUsMjQ2LDI0NywyNDgsMzcxLDI1MCwyNTEsMjUyLDM2MSwzNjMsNzI5XSxcbiAgXCJpc28tODg1OS01XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDEwMjUsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDE3MywxMDM4LDEwMzksMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyw4NDcwLDExMDUsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDE2NywxMTE4LDExMTldLFxuICBcImlzby04ODU5LTZcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsbnVsbCxudWxsLG51bGwsMTY0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTU0OCwxNzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxNTYzLG51bGwsbnVsbCxudWxsLDE1NjcsbnVsbCwxNTY5LDE1NzAsMTU3MSwxNTcyLDE1NzMsMTU3NCwxNTc1LDE1NzYsMTU3NywxNTc4LDE1NzksMTU4MCwxNTgxLDE1ODIsMTU4MywxNTg0LDE1ODUsMTU4NiwxNTg3LDE1ODgsMTU4OSwxNTkwLDE1OTEsMTU5MiwxNTkzLDE1OTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE2MDAsMTYwMSwxNjAyLDE2MDMsMTYwNCwxNjA1LDE2MDYsMTYwNywxNjA4LDE2MDksMTYxMCwxNjExLDE2MTIsMTYxMywxNjE0LDE2MTUsMTYxNiwxNjE3LDE2MTgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXG4gIFwiaXNvLTg4NTktN1wiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCw4MjE2LDgyMTcsMTYzLDgzNjQsODM2NywxNjYsMTY3LDE2OCwxNjksODkwLDE3MSwxNzIsMTczLG51bGwsODIxMywxNzYsMTc3LDE3OCwxNzksOTAwLDkwMSw5MDIsMTgzLDkwNCw5MDUsOTA2LDE4Nyw5MDgsMTg5LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksbnVsbCw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LG51bGxdLFxuICBcImlzby04ODU5LThcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsbnVsbCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDIxNSwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwyNDcsMTg3LDE4OCwxODksMTkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4MjE1LDE0ODgsMTQ4OSwxNDkwLDE0OTEsMTQ5MiwxNDkzLDE0OTQsMTQ5NSwxNDk2LDE0OTcsMTQ5OCwxNDk5LDE1MDAsMTUwMSwxNTAyLDE1MDMsMTUwNCwxNTA1LDE1MDYsMTUwNywxNTA4LDE1MDksMTUxMCwxNTExLDE1MTIsMTUxMywxNTE0LG51bGwsbnVsbCw4MjA2LDgyMDcsbnVsbF0sXG4gIFwiaXNvLTg4NTktMTBcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMjYwLDI3NCwyOTAsMjk4LDI5NiwzMTAsMTY3LDMxNSwyNzIsMzUyLDM1OCwzODEsMTczLDM2MiwzMzAsMTc2LDI2MSwyNzUsMjkxLDI5OSwyOTcsMzExLDE4MywzMTYsMjczLDM1MywzNTksMzgyLDgyMTMsMzYzLDMzMSwyNTYsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMzAyLDI2OCwyMDEsMjgwLDIwMywyNzgsMjA1LDIwNiwyMDcsMjA4LDMyNSwzMzIsMjExLDIxMiwyMTMsMjE0LDM2MCwyMTYsMzcwLDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDI1NywyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwzMDMsMjY5LDIzMywyODEsMjM1LDI3OSwyMzcsMjM4LDIzOSwyNDAsMzI2LDMzMywyNDMsMjQ0LDI0NSwyNDYsMzYxLDI0OCwzNzEsMjUwLDI1MSwyNTIsMjUzLDI1NCwzMTJdLFxuICBcImlzby04ODU5LTEzXCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDgyMjEsMTYyLDE2MywxNjQsODIyMiwxNjYsMTY3LDIxNiwxNjksMzQyLDE3MSwxNzIsMTczLDE3NCwxOTgsMTc2LDE3NywxNzgsMTc5LDgyMjAsMTgxLDE4MiwxODMsMjQ4LDE4NSwzNDMsMTg3LDE4OCwxODksMTkwLDIzMCwyNjAsMzAyLDI1NiwyNjIsMTk2LDE5NywyODAsMjc0LDI2OCwyMDEsMzc3LDI3OCwyOTAsMzEwLDI5OCwzMTUsMzUyLDMyMywzMjUsMjExLDMzMiwyMTMsMjE0LDIxNSwzNzAsMzIxLDM0NiwzNjIsMjIwLDM3OSwzODEsMjIzLDI2MSwzMDMsMjU3LDI2MywyMjgsMjI5LDI4MSwyNzUsMjY5LDIzMywzNzgsMjc5LDI5MSwzMTEsMjk5LDMxNiwzNTMsMzI0LDMyNiwyNDMsMzMzLDI0NSwyNDYsMjQ3LDM3MSwzMjIsMzQ3LDM2MywyNTIsMzgwLDM4Miw4MjE3XSxcbiAgXCJpc28tODg1OS0xNFwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCw3NjgyLDc2ODMsMTYzLDI2NiwyNjcsNzY5MCwxNjcsNzgwOCwxNjksNzgxMCw3NjkxLDc5MjIsMTczLDE3NCwzNzYsNzcxMCw3NzExLDI4OCwyODksNzc0NCw3NzQ1LDE4Miw3NzY2LDc4MDksNzc2Nyw3ODExLDc3NzYsNzkyMyw3ODEyLDc4MTMsNzc3NywxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMzcyLDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDc3ODYsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMzc0LDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMzczLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDc3ODcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMzc1LDI1NV0sXG4gIFwiaXNvLTg4NTktMTVcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsODM2NCwxNjUsMzUyLDE2NywzNTMsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwzODEsMTgxLDE4MiwxODMsMzgyLDE4NSwxODYsMTg3LDMzOCwzMzksMzc2LDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTVdLFxuICBcImlzby04ODU5LTE2XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDI2MCwyNjEsMzIxLDgzNjQsODIyMiwzNTIsMTY3LDM1MywxNjksNTM2LDE3MSwzNzcsMTczLDM3OCwzNzksMTc2LDE3NywyNjgsMzIyLDM4MSw4MjIxLDE4MiwxODMsMzgyLDI2OSw1MzcsMTg3LDMzOCwzMzksMzc2LDM4MCwxOTIsMTkzLDE5NCwyNTgsMTk2LDI2MiwxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjcyLDMyMywyMTAsMjExLDIxMiwzMzYsMjE0LDM0NiwzNjgsMjE3LDIxOCwyMTksMjIwLDI4MCw1MzgsMjIzLDIyNCwyMjUsMjI2LDI1OSwyMjgsMjYzLDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNzMsMzI0LDI0MiwyNDMsMjQ0LDMzNywyNDYsMzQ3LDM2OSwyNDksMjUwLDI1MSwyNTIsMjgxLDUzOSwyNTVdLFxuICBcImtvaTgtclwiOls5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDg5OTIsOTYzMiw4NzI5LDg3MzAsODc3Niw4ODA0LDg4MDUsMTYwLDg5OTMsMTc2LDE3OCwxODMsMjQ3LDk1NTIsOTU1Myw5NTU0LDExMDUsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksMTAyNSw5NTcwLDk1NzEsOTU3Miw5NTczLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCw5NTc5LDk1ODAsMTY5LDExMDIsMTA3MiwxMDczLDEwOTQsMTA3NiwxMDc3LDEwOTIsMTA3NSwxMDkzLDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMTAzLDEwODgsMTA4OSwxMDkwLDEwOTEsMTA3OCwxMDc0LDExMDAsMTA5OSwxMDc5LDEwOTYsMTEwMSwxMDk3LDEwOTUsMTA5OCwxMDcwLDEwNDAsMTA0MSwxMDYyLDEwNDQsMTA0NSwxMDYwLDEwNDMsMTA2MSwxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA3MSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNDYsMTA0MiwxMDY4LDEwNjcsMTA0NywxMDY0LDEwNjksMTA2NSwxMDYzLDEwNjZdLFxuICBcImtvaTgtdVwiOls5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDg5OTIsOTYzMiw4NzI5LDg3MzAsODc3Niw4ODA0LDg4MDUsMTYwLDg5OTMsMTc2LDE3OCwxODMsMjQ3LDk1NTIsOTU1Myw5NTU0LDExMDUsMTEwOCw5NTU2LDExMTAsMTExMSw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsMTE2OSwxMTE4LDk1NjYsOTU2Nyw5NTY4LDk1NjksMTAyNSwxMDI4LDk1NzEsMTAzMCwxMDMxLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCwxMTY4LDEwMzgsMTY5LDExMDIsMTA3MiwxMDczLDEwOTQsMTA3NiwxMDc3LDEwOTIsMTA3NSwxMDkzLDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMTAzLDEwODgsMTA4OSwxMDkwLDEwOTEsMTA3OCwxMDc0LDExMDAsMTA5OSwxMDc5LDEwOTYsMTEwMSwxMDk3LDEwOTUsMTA5OCwxMDcwLDEwNDAsMTA0MSwxMDYyLDEwNDQsMTA0NSwxMDYwLDEwNDMsMTA2MSwxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA3MSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNDYsMTA0MiwxMDY4LDEwNjcsMTA0NywxMDY0LDEwNjksMTA2NSwxMDYzLDEwNjZdLFxuICBcIm1hY2ludG9zaFwiOlsxOTYsMTk3LDE5OSwyMDEsMjA5LDIxNCwyMjAsMjI1LDIyNCwyMjYsMjI4LDIyNywyMjksMjMxLDIzMywyMzIsMjM0LDIzNSwyMzcsMjM2LDIzOCwyMzksMjQxLDI0MywyNDIsMjQ0LDI0NiwyNDUsMjUwLDI0OSwyNTEsMjUyLDgyMjQsMTc2LDE2MiwxNjMsMTY3LDgyMjYsMTgyLDIyMywxNzQsMTY5LDg0ODIsMTgwLDE2OCw4ODAwLDE5OCwyMTYsODczNCwxNzcsODgwNCw4ODA1LDE2NSwxODEsODcwNiw4NzIxLDg3MTksOTYwLDg3NDcsMTcwLDE4Niw5MzcsMjMwLDI0OCwxOTEsMTYxLDE3Miw4NzMwLDQwMiw4Nzc2LDg3MTAsMTcxLDE4Nyw4MjMwLDE2MCwxOTIsMTk1LDIxMywzMzgsMzM5LDgyMTEsODIxMiw4MjIwLDgyMjEsODIxNiw4MjE3LDI0Nyw5Njc0LDI1NSwzNzYsODI2MCw4MzY0LDgyNDksODI1MCw2NDI1Nyw2NDI1OCw4MjI1LDE4Myw4MjE4LDgyMjIsODI0MCwxOTQsMjAyLDE5MywyMDMsMjAwLDIwNSwyMDYsMjA3LDIwNCwyMTEsMjEyLDYzNzQzLDIxMCwyMTgsMjE5LDIxNywzMDUsNzEwLDczMiwxNzUsNzI4LDcyOSw3MzAsMTg0LDczMyw3MzEsNzExXSxcbiAgXCJ3aW5kb3dzLTg3NFwiOls4MzY0LDEyOSwxMzAsMTMxLDEzMiw4MjMwLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwzNTg1LDM1ODYsMzU4NywzNTg4LDM1ODksMzU5MCwzNTkxLDM1OTIsMzU5MywzNTk0LDM1OTUsMzU5NiwzNTk3LDM1OTgsMzU5OSwzNjAwLDM2MDEsMzYwMiwzNjAzLDM2MDQsMzYwNSwzNjA2LDM2MDcsMzYwOCwzNjA5LDM2MTAsMzYxMSwzNjEyLDM2MTMsMzYxNCwzNjE1LDM2MTYsMzYxNywzNjE4LDM2MTksMzYyMCwzNjIxLDM2MjIsMzYyMywzNjI0LDM2MjUsMzYyNiwzNjI3LDM2MjgsMzYyOSwzNjMwLDM2MzEsMzYzMiwzNjMzLDM2MzQsMzYzNSwzNjM2LDM2MzcsMzYzOCwzNjM5LDM2NDAsMzY0MSwzNjQyLG51bGwsbnVsbCxudWxsLG51bGwsMzY0NywzNjQ4LDM2NDksMzY1MCwzNjUxLDM2NTIsMzY1MywzNjU0LDM2NTUsMzY1NiwzNjU3LDM2NTgsMzY1OSwzNjYwLDM2NjEsMzY2MiwzNjYzLDM2NjQsMzY2NSwzNjY2LDM2NjcsMzY2OCwzNjY5LDM2NzAsMzY3MSwzNjcyLDM2NzMsMzY3NCwzNjc1LG51bGwsbnVsbCxudWxsLG51bGxdLFxuICBcIndpbmRvd3MtMTI1MFwiOls4MzY0LDEyOSw4MjE4LDEzMSw4MjIyLDgyMzAsODIyNCw4MjI1LDEzNiw4MjQwLDM1Miw4MjQ5LDM0NiwzNTYsMzgxLDM3NywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsODQ4MiwzNTMsODI1MCwzNDcsMzU3LDM4MiwzNzgsMTYwLDcxMSw3MjgsMzIxLDE2NCwyNjAsMTY2LDE2NywxNjgsMTY5LDM1MCwxNzEsMTcyLDE3MywxNzQsMzc5LDE3NiwxNzcsNzMxLDMyMiwxODAsMTgxLDE4MiwxODMsMTg0LDI2MSwzNTEsMTg3LDMxNyw3MzMsMzE4LDM4MCwzNDAsMTkzLDE5NCwyNTgsMTk2LDMxMywyNjIsMTk5LDI2OCwyMDEsMjgwLDIwMywyODIsMjA1LDIwNiwyNzAsMjcyLDMyMywzMjcsMjExLDIxMiwzMzYsMjE0LDIxNSwzNDQsMzY2LDIxOCwzNjgsMjIwLDIyMSwzNTQsMjIzLDM0MSwyMjUsMjI2LDI1OSwyMjgsMzE0LDI2MywyMzEsMjY5LDIzMywyODEsMjM1LDI4MywyMzcsMjM4LDI3MSwyNzMsMzI0LDMyOCwyNDMsMjQ0LDMzNywyNDYsMjQ3LDM0NSwzNjcsMjUwLDM2OSwyNTIsMjUzLDM1NSw3MjldLFxuICBcIndpbmRvd3MtMTI1MVwiOlsxMDI2LDEwMjcsODIxOCwxMTA3LDgyMjIsODIzMCw4MjI0LDgyMjUsODM2NCw4MjQwLDEwMzMsODI0OSwxMDM0LDEwMzYsMTAzNSwxMDM5LDExMDYsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsODQ4MiwxMTEzLDgyNTAsMTExNCwxMTE2LDExMTUsMTExOSwxNjAsMTAzOCwxMTE4LDEwMzIsMTY0LDExNjgsMTY2LDE2NywxMDI1LDE2OSwxMDI4LDE3MSwxNzIsMTczLDE3NCwxMDMxLDE3NiwxNzcsMTAzMCwxMTEwLDExNjksMTgxLDE4MiwxODMsMTEwNSw4NDcwLDExMDgsMTg3LDExMTIsMTAyOSwxMTA5LDExMTEsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwM10sXG4gIFwid2luZG93cy0xMjUyXCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMzUyLDgyNDksMzM4LDE0MSwzODEsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDczMiw4NDgyLDM1Myw4MjUwLDMzOSwxNTcsMzgyLDM3NiwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NV0sXG4gIFwid2luZG93cy0xMjUzXCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsMTM2LDgyNDAsMTM4LDgyNDksMTQwLDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE1Miw4NDgyLDE1NCw4MjUwLDE1NiwxNTcsMTU4LDE1OSwxNjAsOTAxLDkwMiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksbnVsbCwxNzEsMTcyLDE3MywxNzQsODIxMywxNzYsMTc3LDE3OCwxNzksOTAwLDE4MSwxODIsMTgzLDkwNCw5MDUsOTA2LDE4Nyw5MDgsMTg5LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksbnVsbCw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LG51bGxdLFxuICBcIndpbmRvd3MtMTI1NFwiOls4MzY0LDEyOSw4MjE4LDQwMiw4MjIyLDgyMzAsODIyNCw4MjI1LDcxMCw4MjQwLDM1Miw4MjQ5LDMzOCwxNDEsMTQyLDE0MywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiw3MzIsODQ4MiwzNTMsODI1MCwzMzksMTU3LDE1OCwzNzYsMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjg2LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDMwNCwzNTAsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyODcsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMzA1LDM1MSwyNTVdLFxuICBcIndpbmRvd3MtMTI1NVwiOls4MzY0LDEyOSw4MjE4LDQwMiw4MjIyLDgyMzAsODIyNCw4MjI1LDcxMCw4MjQwLDEzOCw4MjQ5LDE0MCwxNDEsMTQyLDE0MywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiw3MzIsODQ4MiwxNTQsODI1MCwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDgzNjIsMTY1LDE2NiwxNjcsMTY4LDE2OSwyMTUsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMjQ3LDE4NywxODgsMTg5LDE5MCwxOTEsMTQ1NiwxNDU3LDE0NTgsMTQ1OSwxNDYwLDE0NjEsMTQ2MiwxNDYzLDE0NjQsMTQ2NSwxNDY2LDE0NjcsMTQ2OCwxNDY5LDE0NzAsMTQ3MSwxNDcyLDE0NzMsMTQ3NCwxNDc1LDE1MjAsMTUyMSwxNTIyLDE1MjMsMTUyNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE0ODgsMTQ4OSwxNDkwLDE0OTEsMTQ5MiwxNDkzLDE0OTQsMTQ5NSwxNDk2LDE0OTcsMTQ5OCwxNDk5LDE1MDAsMTUwMSwxNTAyLDE1MDMsMTUwNCwxNTA1LDE1MDYsMTUwNywxNTA4LDE1MDksMTUxMCwxNTExLDE1MTIsMTUxMywxNTE0LG51bGwsbnVsbCw4MjA2LDgyMDcsbnVsbF0sXG4gIFwid2luZG93cy0xMjU2XCI6WzgzNjQsMTY2Miw4MjE4LDQwMiw4MjIyLDgyMzAsODIyNCw4MjI1LDcxMCw4MjQwLDE2NTcsODI0OSwzMzgsMTY3MCwxNjg4LDE2NzIsMTcxMSw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE3MDUsODQ4MiwxNjgxLDgyNTAsMzM5LDgyMDQsODIwNSwxNzIyLDE2MCwxNTQ4LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcyNiwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxNTYzLDE4NywxODgsMTg5LDE5MCwxNTY3LDE3MjksMTU2OSwxNTcwLDE1NzEsMTU3MiwxNTczLDE1NzQsMTU3NSwxNTc2LDE1NzcsMTU3OCwxNTc5LDE1ODAsMTU4MSwxNTgyLDE1ODMsMTU4NCwxNTg1LDE1ODYsMTU4NywxNTg4LDE1ODksMTU5MCwyMTUsMTU5MSwxNTkyLDE1OTMsMTU5NCwxNjAwLDE2MDEsMTYwMiwxNjAzLDIyNCwxNjA0LDIyNiwxNjA1LDE2MDYsMTYwNywxNjA4LDIzMSwyMzIsMjMzLDIzNCwyMzUsMTYwOSwxNjEwLDIzOCwyMzksMTYxMSwxNjEyLDE2MTMsMTYxNCwyNDQsMTYxNSwxNjE2LDI0NywxNjE3LDI0OSwxNjE4LDI1MSwyNTIsODIwNiw4MjA3LDE3NDZdLFxuICBcIndpbmRvd3MtMTI1N1wiOls4MzY0LDEyOSw4MjE4LDEzMSw4MjIyLDgyMzAsODIyNCw4MjI1LDEzNiw4MjQwLDEzOCw4MjQ5LDE0MCwxNjgsNzExLDE4NCwxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsODQ4MiwxNTQsODI1MCwxNTYsMTc1LDczMSwxNTksMTYwLG51bGwsMTYyLDE2MywxNjQsbnVsbCwxNjYsMTY3LDIxNiwxNjksMzQyLDE3MSwxNzIsMTczLDE3NCwxOTgsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywyNDgsMTg1LDM0MywxODcsMTg4LDE4OSwxOTAsMjMwLDI2MCwzMDIsMjU2LDI2MiwxOTYsMTk3LDI4MCwyNzQsMjY4LDIwMSwzNzcsMjc4LDI5MCwzMTAsMjk4LDMxNSwzNTIsMzIzLDMyNSwyMTEsMzMyLDIxMywyMTQsMjE1LDM3MCwzMjEsMzQ2LDM2MiwyMjAsMzc5LDM4MSwyMjMsMjYxLDMwMywyNTcsMjYzLDIyOCwyMjksMjgxLDI3NSwyNjksMjMzLDM3OCwyNzksMjkxLDMxMSwyOTksMzE2LDM1MywzMjQsMzI2LDI0MywzMzMsMjQ1LDI0NiwyNDcsMzcxLDMyMiwzNDcsMzYzLDI1MiwzODAsMzgyLDcyOV0sXG4gIFwid2luZG93cy0xMjU4XCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMTM4LDgyNDksMzM4LDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDczMiw4NDgyLDE1NCw4MjUwLDMzOSwxNTcsMTU4LDM3NiwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDI1OCwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDc2OCwyMDUsMjA2LDIwNywyNzIsMjA5LDc3NywyMTEsMjEyLDQxNiwyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsNDMxLDc3MSwyMjMsMjI0LDIyNSwyMjYsMjU5LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsNzY5LDIzNywyMzgsMjM5LDI3MywyNDEsODAzLDI0MywyNDQsNDE3LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1Miw0MzIsODM2MywyNTVdLFxuICBcIngtbWFjLWN5cmlsbGljXCI6WzEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSw4MjI0LDE3NiwxMTY4LDE2MywxNjcsODIyNiwxODIsMTAzMCwxNzQsMTY5LDg0ODIsMTAyNiwxMTA2LDg4MDAsMTAyNywxMTA3LDg3MzQsMTc3LDg4MDQsODgwNSwxMTEwLDE4MSwxMTY5LDEwMzIsMTAyOCwxMTA4LDEwMzEsMTExMSwxMDMzLDExMTMsMTAzNCwxMTE0LDExMTIsMTAyOSwxNzIsODczMCw0MDIsODc3Niw4NzEwLDE3MSwxODcsODIzMCwxNjAsMTAzNSwxMTE1LDEwMzYsMTExNiwxMTA5LDgyMTEsODIxMiw4MjIwLDgyMjEsODIxNiw4MjE3LDI0Nyw4MjIyLDEwMzgsMTExOCwxMDM5LDExMTksODQ3MCwxMDI1LDExMDUsMTEwMywxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDgzNjRdXG59O1xuXG4vLyBGb3Igc3RyaWN0IGVudmlyb25tZW50cyB3aGVyZSBgdGhpc2AgaW5zaWRlIHRoZSBnbG9iYWwgc2NvcGVcbi8vIGlzIGB1bmRlZmluZWRgLCB0YWtlIGEgcHVyZSBvYmplY3QgaW5zdGVhZFxufSh0aGlzIHx8IHt9KSk7IiwiLy8gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbi8vIFNlZSBMSUNFTlNFLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgR2xvYmFsIHx0aGlzfCByZXF1aXJlZCBmb3IgcmVzb2x2aW5nIGluZGV4ZXMgaW4gbm9kZS5cbiAqIEBzdXBwcmVzcyB7Z2xvYmFsVGhpc31cbiAqL1xuKGZ1bmN0aW9uKGdsb2JhbCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gSWYgd2UncmUgaW4gbm9kZSByZXF1aXJlIGVuY29kaW5nLWluZGV4ZXMgYW5kIGF0dGFjaCBpdCB0byB0aGUgZ2xvYmFsLlxuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cyAmJlxuICAgICFnbG9iYWxbXCJlbmNvZGluZy1pbmRleGVzXCJdKSB7XG4gICAgZ2xvYmFsW1wiZW5jb2RpbmctaW5kZXhlc1wiXSA9XG4gICAgICByZXF1aXJlKFwiLi9lbmNvZGluZy1pbmRleGVzLmpzXCIpW1wiZW5jb2RpbmctaW5kZXhlc1wiXTtcbiAgfVxuXG4gIC8vXG4gIC8vIFV0aWxpdGllc1xuICAvL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgbnVtYmVyIHRvIHRlc3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLCBpbmNsdXNpdmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLCBpbmNsdXNpdmUuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYSA+PSBtaW4gYW5kIGEgPD0gbWF4LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5SYW5nZShhLCBtaW4sIG1heCkge1xuICAgIHJldHVybiBtaW4gPD0gYSAmJiBhIDw9IG1heDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyFBcnJheS48Kj59IGFycmF5IFRoZSBhcnJheSB0byBjaGVjay5cbiAgICogQHBhcmFtIHsqfSBpdGVtIFRoZSBpdGVtIHRvIGxvb2sgZm9yIGluIHRoZSBhcnJheS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgaXRlbSBhcHBlYXJzIGluIHRoZSBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGluY2x1ZGVzKGFycmF5LCBpdGVtKSB7XG4gICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSkgIT09IC0xO1xuICB9XG5cbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIFRvRGljdGlvbmFyeShvKSB7XG4gICAgaWYgKG8gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHt9O1xuICAgIGlmIChvID09PSBPYmplY3QobykpIHJldHVybiBvO1xuICAgIHRocm93IFR5cGVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgYXJndW1lbnQgdG8gZGljdGlvbmFyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgSW5wdXQgc3RyaW5nIG9mIFVURi0xNiBjb2RlIHVuaXRzLlxuICAgKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59IENvZGUgcG9pbnRzLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nVG9Db2RlUG9pbnRzKHN0cmluZykge1xuICAgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vYnRhaW4tdW5pY29kZVxuXG4gICAgLy8gMS4gTGV0IFMgYmUgdGhlIERPTVN0cmluZyB2YWx1ZS5cbiAgICB2YXIgcyA9IFN0cmluZyhzdHJpbmcpO1xuXG4gICAgLy8gMi4gTGV0IG4gYmUgdGhlIGxlbmd0aCBvZiBTLlxuICAgIHZhciBuID0gcy5sZW5ndGg7XG5cbiAgICAvLyAzLiBJbml0aWFsaXplIGkgdG8gMC5cbiAgICB2YXIgaSA9IDA7XG5cbiAgICAvLyA0LiBJbml0aWFsaXplIFUgdG8gYmUgYW4gZW1wdHkgc2VxdWVuY2Ugb2YgVW5pY29kZSBjaGFyYWN0ZXJzLlxuICAgIHZhciB1ID0gW107XG5cbiAgICAvLyA1LiBXaGlsZSBpIDwgbjpcbiAgICB3aGlsZSAoaSA8IG4pIHtcblxuICAgICAgLy8gMS4gTGV0IGMgYmUgdGhlIGNvZGUgdW5pdCBpbiBTIGF0IGluZGV4IGkuXG4gICAgICB2YXIgYyA9IHMuY2hhckNvZGVBdChpKTtcblxuICAgICAgLy8gMi4gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjOlxuXG4gICAgICAvLyBjIDwgMHhEODAwIG9yIGMgPiAweERGRkZcbiAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPiAweERGRkYpIHtcbiAgICAgICAgLy8gQXBwZW5kIHRvIFUgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludCBjLlxuICAgICAgICB1LnB1c2goYyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDB4REMwMCDiiaQgYyDiiaQgMHhERkZGXG4gICAgICBlbHNlIGlmICgweERDMDAgPD0gYyAmJiBjIDw9IDB4REZGRikge1xuICAgICAgICAvLyBBcHBlbmQgdG8gVSBhIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIuXG4gICAgICAgIHUucHVzaCgweEZGRkQpO1xuICAgICAgfVxuXG4gICAgICAvLyAweEQ4MDAg4omkIGMg4omkIDB4REJGRlxuICAgICAgZWxzZSBpZiAoMHhEODAwIDw9IGMgJiYgYyA8PSAweERCRkYpIHtcbiAgICAgICAgLy8gMS4gSWYgaSA9IG7iiJIxLCB0aGVuIGFwcGVuZCB0byBVIGEgVStGRkZEIFJFUExBQ0VNRU5UXG4gICAgICAgIC8vIENIQVJBQ1RFUi5cbiAgICAgICAgaWYgKGkgPT09IG4gLSAxKSB7XG4gICAgICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpIDwgbuKIkjE6XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIDEuIExldCBkIGJlIHRoZSBjb2RlIHVuaXQgaW4gUyBhdCBpbmRleCBpKzEuXG4gICAgICAgICAgdmFyIGQgPSBzLmNoYXJDb2RlQXQoaSArIDEpO1xuXG4gICAgICAgICAgLy8gMi4gSWYgMHhEQzAwIOKJpCBkIOKJpCAweERGRkYsIHRoZW46XG4gICAgICAgICAgaWYgKDB4REMwMCA8PSBkICYmIGQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICAvLyAxLiBMZXQgYSBiZSBjICYgMHgzRkYuXG4gICAgICAgICAgICB2YXIgYSA9IGMgJiAweDNGRjtcblxuICAgICAgICAgICAgLy8gMi4gTGV0IGIgYmUgZCAmIDB4M0ZGLlxuICAgICAgICAgICAgdmFyIGIgPSBkICYgMHgzRkY7XG5cbiAgICAgICAgICAgIC8vIDMuIEFwcGVuZCB0byBVIHRoZSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIC8vIDJeMTYrMl4xMCphK2IuXG4gICAgICAgICAgICB1LnB1c2goMHgxMDAwMCArIChhIDw8IDEwKSArIGIpO1xuXG4gICAgICAgICAgICAvLyA0LiBTZXQgaSB0byBpKzEuXG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBkIDwgMHhEQzAwIG9yIGQgPiAweERGRkYuIEFwcGVuZCB0byBVIGFcbiAgICAgICAgICAvLyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLlxuICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgIHUucHVzaCgweEZGRkQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBTZXQgaSB0byBpKzEuXG4gICAgICBpICs9IDE7XG4gICAgfVxuXG4gICAgLy8gNi4gUmV0dXJuIFUuXG4gICAgcmV0dXJuIHU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGNvZGVfcG9pbnRzIEFycmF5IG9mIGNvZGUgcG9pbnRzLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHN0cmluZyBTdHJpbmcgb2YgVVRGLTE2IGNvZGUgdW5pdHMuXG4gICAqL1xuICBmdW5jdGlvbiBjb2RlUG9pbnRzVG9TdHJpbmcoY29kZV9wb2ludHMpIHtcbiAgICB2YXIgcyA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZV9wb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjcCA9IGNvZGVfcG9pbnRzW2ldO1xuICAgICAgaWYgKGNwIDw9IDB4RkZGRikge1xuICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3AgLT0gMHgxMDAwMDtcbiAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjcCA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3AgJiAweDNGRikgKyAweERDMDApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfVxuXG5cbiAgLy9cbiAgLy8gSW1wbGVtZW50YXRpb24gb2YgRW5jb2Rpbmcgc3BlY2lmaWNhdGlvblxuICAvLyBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy9cbiAgLy9cblxuICAvL1xuICAvLyA0LiBUZXJtaW5vbG9neVxuICAvL1xuXG4gIC8qKlxuICAgKiBBbiBBU0NJSSBieXRlIGlzIGEgYnl0ZSBpbiB0aGUgcmFuZ2UgMHgwMCB0byAweDdGLCBpbmNsdXNpdmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhIFRoZSBudW1iZXIgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGlzIGluIHRoZSByYW5nZSAweDAwIHRvIDB4N0YsIGluY2x1c2l2ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGlzQVNDSUlCeXRlKGEpIHtcbiAgICByZXR1cm4gMHgwMCA8PSBhICYmIGEgPD0gMHg3RjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBBU0NJSSBjb2RlIHBvaW50IGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgVSswMDAwIHRvXG4gICAqIFUrMDA3RiwgaW5jbHVzaXZlLlxuICAgKi9cbiAgdmFyIGlzQVNDSUlDb2RlUG9pbnQgPSBpc0FTQ0lJQnl0ZTtcblxuXG4gIC8qKlxuICAgKiBFbmQtb2Ytc3RyZWFtIGlzIGEgc3BlY2lhbCB0b2tlbiB0aGF0IHNpZ25pZmllcyBubyBtb3JlIHRva2Vuc1xuICAgKiBhcmUgaW4gdGhlIHN0cmVhbS5cbiAgICogQGNvbnN0XG4gICAqLyB2YXIgZW5kX29mX3N0cmVhbSA9IC0xO1xuXG4gIC8qKlxuICAgKiBBIHN0cmVhbSByZXByZXNlbnRzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHshKEFycmF5LjxudW1iZXI+fFVpbnQ4QXJyYXkpfSB0b2tlbnMgQXJyYXkgb2YgdG9rZW5zIHRoYXQgcHJvdmlkZVxuICAgKiB0aGUgc3RyZWFtLlxuICAgKi9cbiAgZnVuY3Rpb24gU3RyZWFtKHRva2Vucykge1xuICAgIC8qKiBAdHlwZSB7IUFycmF5LjxudW1iZXI+fSAqL1xuICAgIHRoaXMudG9rZW5zID0gW10uc2xpY2UuY2FsbCh0b2tlbnMpO1xuICAgIC8vIFJldmVyc2VkIGFzIHB1c2gvcG9wIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gc2hpZnQvdW5zaGlmdC5cbiAgICB0aGlzLnRva2Vucy5yZXZlcnNlKCk7XG4gIH1cblxuICBTdHJlYW0ucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgZW5kLW9mLXN0cmVhbSBoYXMgYmVlbiBoaXQuXG4gICAgICovXG4gICAgZW5kT2ZTdHJlYW06IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICF0aGlzLnRva2Vucy5sZW5ndGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSB0b2tlbiBpcyByZWFkIGZyb20gYSBzdHJlYW0sIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICAgKiBzdHJlYW0gbXVzdCBiZSByZXR1cm5lZCBhbmQgc3Vic2VxdWVudGx5IHJlbW92ZWQsIGFuZFxuICAgICAqIGVuZC1vZi1zdHJlYW0gbXVzdCBiZSByZXR1cm5lZCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEdldCB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBzdHJlYW0sIG9yXG4gICAgICogZW5kX29mX3N0cmVhbS5cbiAgICAgKi9cbiAgICAgcmVhZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXRoaXMudG9rZW5zLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGVuZF9vZl9zdHJlYW07XG4gICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnBvcCgpO1xuICAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHByZXBlbmRlZCB0byBhIHN0cmVhbSwgdGhvc2UgdG9rZW5zXG4gICAgICogbXVzdCBiZSBpbnNlcnRlZCwgaW4gZ2l2ZW4gb3JkZXIsIGJlZm9yZSB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlXG4gICAgICogc3RyZWFtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IHRva2VuIFRoZSB0b2tlbihzKSB0byBwcmVwZW5kIHRvIHRoZVxuICAgICAqIHN0cmVhbS5cbiAgICAgKi9cbiAgICBwcmVwZW5kOiBmdW5jdGlvbih0b2tlbikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHRva2VuKTtcbiAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpXG4gICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbnMucG9wKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZW4gb25lIG9yIG1vcmUgdG9rZW5zIGFyZSBwdXNoZWQgdG8gYSBzdHJlYW0sIHRob3NlIHRva2Vuc1xuICAgICAqIG11c3QgYmUgaW5zZXJ0ZWQsIGluIGdpdmVuIG9yZGVyLCBhZnRlciB0aGUgbGFzdCB0b2tlbiBpbiB0aGVcbiAgICAgKiBzdHJlYW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VucyhzKSB0byBwdXNoIHRvIHRoZVxuICAgICAqIHN0cmVhbS5cbiAgICAgKi9cbiAgICBwdXNoOiBmdW5jdGlvbih0b2tlbikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHRva2VuKTtcbiAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpXG4gICAgICAgICAgdGhpcy50b2tlbnMudW5zaGlmdCh0b2tlbnMuc2hpZnQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRva2Vucy51bnNoaWZ0KHRva2VuKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy8gNS4gRW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gNS4xIEVuY29kZXJzIGFuZCBkZWNvZGVyc1xuXG4gIC8qKiBAY29uc3QgKi9cbiAgdmFyIGZpbmlzaGVkID0gLTE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmF0YWwgSWYgdHJ1ZSwgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFuIGV4Y2VwdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBvcHRfY29kZV9wb2ludCBPdmVycmlkZSB0aGUgc3RhbmRhcmQgZmFsbGJhY2sgY29kZSBwb2ludC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29kZSBwb2ludCB0byBpbnNlcnQgb24gYSBkZWNvZGluZyBlcnJvci5cbiAgICovXG4gIGZ1bmN0aW9uIGRlY29kZXJFcnJvcihmYXRhbCwgb3B0X2NvZGVfcG9pbnQpIHtcbiAgICBpZiAoZmF0YWwpXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0RlY29kZXIgZXJyb3InKTtcbiAgICByZXR1cm4gb3B0X2NvZGVfcG9pbnQgfHwgMHhGRkZEO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IFRoZSBjb2RlIHBvaW50IHRoYXQgY291bGQgbm90IGJlIGVuY29kZWQuXG4gICAqIEByZXR1cm4ge251bWJlcn0gQWx3YXlzIHRocm93cywgbm8gdmFsdWUgaXMgYWN0dWFsbHkgcmV0dXJuZWQuXG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCkge1xuICAgIHRocm93IFR5cGVFcnJvcignVGhlIGNvZGUgcG9pbnQgJyArIGNvZGVfcG9pbnQgKyAnIGNvdWxkIG5vdCBiZSBlbmNvZGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbnRlcmZhY2UgKi9cbiAgZnVuY3Rpb24gRGVjb2RlcigpIHt9XG4gIERlY29kZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LCBvciB8ZmluaXNoZWR8LlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge31cbiAgfTtcblxuICAvKiogQGludGVyZmFjZSAqL1xuICBmdW5jdGlvbiBFbmNvZGVyKCkge31cbiAgRW5jb2Rlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGNvZGUgcG9pbnRzIGJlaW5nIGVuY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LCBvciB8ZmluaXNoZWR8LlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge31cbiAgfTtcblxuICAvLyA1LjIgTmFtZXMgYW5kIGxhYmVsc1xuXG4gIC8vIFRPRE86IERlZmluZSBAdHlwZWRlZiBmb3IgRW5jb2Rpbmc6IHtuYW1lOnN0cmluZyxsYWJlbHM6QXJyYXkuPHN0cmluZz59XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMjQ3XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBUaGUgZW5jb2RpbmcgbGFiZWwuXG4gICAqIEByZXR1cm4gez97bmFtZTpzdHJpbmcsbGFiZWxzOkFycmF5LjxzdHJpbmc+fX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEVuY29kaW5nKGxhYmVsKSB7XG4gICAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gbGFiZWwuXG4gICAgbGFiZWwgPSBTdHJpbmcobGFiZWwpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gMi4gSWYgbGFiZWwgaXMgYW4gQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgYW55IG9mIHRoZVxuICAgIC8vIGxhYmVscyBsaXN0ZWQgaW4gdGhlIHRhYmxlIGJlbG93LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBlbmNvZGluZywgYW5kIGZhaWx1cmUgb3RoZXJ3aXNlLlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGFiZWxfdG9fZW5jb2RpbmcsIGxhYmVsKSkge1xuICAgICAgcmV0dXJuIGxhYmVsX3RvX2VuY29kaW5nW2xhYmVsXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RpbmdzIHRhYmxlOiBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy9lbmNvZGluZ3MuanNvblxuICAgKiBAY29uc3RcbiAgICogQHR5cGUgeyFBcnJheS48e1xuICAgKiAgICAgICAgICBoZWFkaW5nOiBzdHJpbmcsXG4gICAqICAgICAgICAgIGVuY29kaW5nczogQXJyYXkuPHtuYW1lOnN0cmluZyxsYWJlbHM6QXJyYXkuPHN0cmluZz59PlxuICAgKiAgICAgICAgfT59XG4gICAqL1xuICB2YXIgZW5jb2RpbmdzID0gW1xuICAgIHtcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwidW5pY29kZS0xLTEtdXRmLThcIixcbiAgICAgICAgICAgIFwidXRmLThcIixcbiAgICAgICAgICAgIFwidXRmOFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJVVEYtOFwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJUaGUgRW5jb2RpbmdcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCI4NjZcIixcbiAgICAgICAgICAgIFwiY3A4NjZcIixcbiAgICAgICAgICAgIFwiY3NpYm04NjZcIixcbiAgICAgICAgICAgIFwiaWJtODY2XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklCTTg2NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW4yXCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTJcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEwMVwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTJcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTJcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMlwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0yOjE5ODdcIixcbiAgICAgICAgICAgIFwibDJcIixcbiAgICAgICAgICAgIFwibGF0aW4yXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzb2xhdGluM1wiLFxuICAgICAgICAgICAgXCJpc28tODg1OS0zXCIsXG4gICAgICAgICAgICBcImlzby1pci0xMDlcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0zXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkzXCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTNcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMzoxOTg4XCIsXG4gICAgICAgICAgICBcImwzXCIsXG4gICAgICAgICAgICBcImxhdGluM1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjRcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktNFwiLFxuICAgICAgICAgICAgXCJpc28taXItMTEwXCIsXG4gICAgICAgICAgICBcImlzbzg4NTktNFwiLFxuICAgICAgICAgICAgXCJpc284ODU5NFwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS00XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTQ6MTk4OFwiLFxuICAgICAgICAgICAgXCJsNFwiLFxuICAgICAgICAgICAgXCJsYXRpbjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW5jeXJpbGxpY1wiLFxuICAgICAgICAgICAgXCJjeXJpbGxpY1wiLFxuICAgICAgICAgICAgXCJpc28tODg1OS01XCIsXG4gICAgICAgICAgICBcImlzby1pci0xNDRcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS01XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk1XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTVcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNToxOTg4XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJhcmFiaWNcIixcbiAgICAgICAgICAgIFwiYXNtby03MDhcIixcbiAgICAgICAgICAgIFwiY3Npc284ODU5NmVcIixcbiAgICAgICAgICAgIFwiY3Npc284ODU5NmlcIixcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbmFyYWJpY1wiLFxuICAgICAgICAgICAgXCJlY21hLTExNFwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS02XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTYtZVwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS02LWlcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEyN1wiLFxuICAgICAgICAgICAgXCJpc284ODU5LTZcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTZcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNlwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS02OjE5ODdcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW5ncmVla1wiLFxuICAgICAgICAgICAgXCJlY21hLTExOFwiLFxuICAgICAgICAgICAgXCJlbG90XzkyOFwiLFxuICAgICAgICAgICAgXCJncmVla1wiLFxuICAgICAgICAgICAgXCJncmVlazhcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktN1wiLFxuICAgICAgICAgICAgXCJpc28taXItMTI2XCIsXG4gICAgICAgICAgICBcImlzbzg4NTktN1wiLFxuICAgICAgICAgICAgXCJpc284ODU5N1wiLFxuICAgICAgICAgICAgXCJpc29fODg1OS03XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTc6MTk4N1wiLFxuICAgICAgICAgICAgXCJzdW5fZXVfZ3JlZWtcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktN1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvODg1OThlXCIsXG4gICAgICAgICAgICBcImNzaXNvbGF0aW5oZWJyZXdcIixcbiAgICAgICAgICAgIFwiaGVicmV3XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LThcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktOC1lXCIsXG4gICAgICAgICAgICBcImlzby1pci0xMzhcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS04XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk4XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LThcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktODoxOTg4XCIsXG4gICAgICAgICAgICBcInZpc3VhbFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS04XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc284ODU5OGlcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktOC1pXCIsXG4gICAgICAgICAgICBcImxvZ2ljYWxcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktOC1JXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjZcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTBcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTE1N1wiLFxuICAgICAgICAgICAgXCJpc284ODU5LTEwXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkxMFwiLFxuICAgICAgICAgICAgXCJsNlwiLFxuICAgICAgICAgICAgXCJsYXRpbjZcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktMTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJpc28tODg1OS0xM1wiLFxuICAgICAgICAgICAgXCJpc284ODU5LTEzXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkxM1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0xM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImlzby04ODU5LTE0XCIsXG4gICAgICAgICAgICBcImlzbzg4NTktMTRcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTE0XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTE0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjlcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTVcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0xNVwiLFxuICAgICAgICAgICAgXCJpc284ODU5MTVcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMTVcIixcbiAgICAgICAgICAgIFwibDlcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktMTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJpc28tODg1OS0xNlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0xNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNza29pOHJcIixcbiAgICAgICAgICAgIFwia29pXCIsXG4gICAgICAgICAgICBcImtvaThcIixcbiAgICAgICAgICAgIFwia29pOC1yXCIsXG4gICAgICAgICAgICBcImtvaThfclwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJLT0k4LVJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJrb2k4LXJ1XCIsXG4gICAgICAgICAgICBcImtvaTgtdVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJLT0k4LVVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc21hY2ludG9zaFwiLFxuICAgICAgICAgICAgXCJtYWNcIixcbiAgICAgICAgICAgIFwibWFjaW50b3NoXCIsXG4gICAgICAgICAgICBcIngtbWFjLXJvbWFuXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm1hY2ludG9zaFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImRvcy04NzRcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTFcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0xMVwiLFxuICAgICAgICAgICAgXCJpc284ODU5MTFcIixcbiAgICAgICAgICAgIFwidGlzLTYyMFwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTg3NFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTg3NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1MFwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTBcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTBcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjUwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjUxXCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1MVwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1MVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJhbnNpX3gzLjQtMTk2OFwiLFxuICAgICAgICAgICAgXCJhc2NpaVwiLFxuICAgICAgICAgICAgXCJjcDEyNTJcIixcbiAgICAgICAgICAgIFwiY3A4MTlcIixcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjFcIixcbiAgICAgICAgICAgIFwiaWJtODE5XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTFcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEwMFwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTFcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTFcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMVwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0xOjE5ODdcIixcbiAgICAgICAgICAgIFwibDFcIixcbiAgICAgICAgICAgIFwibGF0aW4xXCIsXG4gICAgICAgICAgICBcInVzLWFzY2lpXCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1MlwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1MlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNTNcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjUzXCIsXG4gICAgICAgICAgICBcIngtY3AxMjUzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1NFwiLFxuICAgICAgICAgICAgXCJjc2lzb2xhdGluNVwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS05XCIsXG4gICAgICAgICAgICBcImlzby1pci0xNDhcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS05XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk5XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTlcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktOToxOTg5XCIsXG4gICAgICAgICAgICBcImw1XCIsXG4gICAgICAgICAgICBcImxhdGluNVwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTRcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjU0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjU1XCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1NVwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1NVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNTZcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjU2XCIsXG4gICAgICAgICAgICBcIngtY3AxMjU2XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1N1wiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTdcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTdcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjU3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjU4XCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1OFwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1OFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJ4LW1hYy1jeXJpbGxpY1wiLFxuICAgICAgICAgICAgXCJ4LW1hYy11a3JhaW5pYW5cIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwieC1tYWMtY3lyaWxsaWNcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IHNpbmdsZS1ieXRlIGVuY29kaW5nc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNoaW5lc2VcIixcbiAgICAgICAgICAgIFwiY3NnYjIzMTJcIixcbiAgICAgICAgICAgIFwiY3Npc281OGdiMjMxMjgwXCIsXG4gICAgICAgICAgICBcImdiMjMxMlwiLFxuICAgICAgICAgICAgXCJnYl8yMzEyXCIsXG4gICAgICAgICAgICBcImdiXzIzMTItODBcIixcbiAgICAgICAgICAgIFwiZ2JrXCIsXG4gICAgICAgICAgICBcImlzby1pci01OFwiLFxuICAgICAgICAgICAgXCJ4LWdia1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJHQktcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJnYjE4MDMwXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcImdiMTgwMzBcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG11bHRpLWJ5dGUgQ2hpbmVzZSAoc2ltcGxpZmllZCkgZW5jb2RpbmdzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiYmlnNVwiLFxuICAgICAgICAgICAgXCJiaWc1LWhrc2NzXCIsXG4gICAgICAgICAgICBcImNuLWJpZzVcIixcbiAgICAgICAgICAgIFwiY3NiaWc1XCIsXG4gICAgICAgICAgICBcIngteC1iaWc1XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIkJpZzVcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG11bHRpLWJ5dGUgQ2hpbmVzZSAodHJhZGl0aW9uYWwpIGVuY29kaW5nc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzZXVjcGtkZm10amFwYW5lc2VcIixcbiAgICAgICAgICAgIFwiZXVjLWpwXCIsXG4gICAgICAgICAgICBcIngtZXVjLWpwXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIkVVQy1KUFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvMjAyMmpwXCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWpwXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy0yMDIyLUpQXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3NzaGlmdGppc1wiLFxuICAgICAgICAgICAgXCJtczkzMlwiLFxuICAgICAgICAgICAgXCJtc19rYW5qaVwiLFxuICAgICAgICAgICAgXCJzaGlmdC1qaXNcIixcbiAgICAgICAgICAgIFwic2hpZnRfamlzXCIsXG4gICAgICAgICAgICBcInNqaXNcIixcbiAgICAgICAgICAgIFwid2luZG93cy0zMWpcIixcbiAgICAgICAgICAgIFwieC1zamlzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlNoaWZ0X0pJU1wiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJMZWdhY3kgbXVsdGktYnl0ZSBKYXBhbmVzZSBlbmNvZGluZ3NcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2V1Y2tyXCIsXG4gICAgICAgICAgICBcImNza3NjNTYwMTE5ODdcIixcbiAgICAgICAgICAgIFwiZXVjLWtyXCIsXG4gICAgICAgICAgICBcImlzby1pci0xNDlcIixcbiAgICAgICAgICAgIFwia29yZWFuXCIsXG4gICAgICAgICAgICBcImtzX2NfNTYwMS0xOTg3XCIsXG4gICAgICAgICAgICBcImtzX2NfNTYwMS0xOTg5XCIsXG4gICAgICAgICAgICBcImtzYzU2MDFcIixcbiAgICAgICAgICAgIFwia3NjXzU2MDFcIixcbiAgICAgICAgICAgIFwid2luZG93cy05NDlcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiRVVDLUtSXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiaGVhZGluZ1wiOiBcIkxlZ2FjeSBtdWx0aS1ieXRlIEtvcmVhbiBlbmNvZGluZ3NcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzbzIwMjJrclwiLFxuICAgICAgICAgICAgXCJoei1nYi0yMzEyXCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWNuXCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWNuLWV4dFwiLFxuICAgICAgICAgICAgXCJpc28tMjAyMi1rclwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZXBsYWNlbWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcInV0Zi0xNmJlXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlVURi0xNkJFXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwidXRmLTE2XCIsXG4gICAgICAgICAgICBcInV0Zi0xNmxlXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlVURi0xNkxFXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwieC11c2VyLWRlZmluZWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwieC11c2VyLWRlZmluZWRcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG1pc2NlbGxhbmVvdXMgZW5jb2RpbmdzXCJcbiAgICB9XG4gIF07XG5cbiAgLy8gTGFiZWwgdG8gZW5jb2RpbmcgcmVnaXN0cnkuXG4gIC8qKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcse25hbWU6c3RyaW5nLGxhYmVsczpBcnJheS48c3RyaW5nPn0+fSAqL1xuICB2YXIgbGFiZWxfdG9fZW5jb2RpbmcgPSB7fTtcbiAgZW5jb2RpbmdzLmZvckVhY2goZnVuY3Rpb24oY2F0ZWdvcnkpIHtcbiAgICBjYXRlZ29yeS5lbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgZW5jb2RpbmcubGFiZWxzLmZvckVhY2goZnVuY3Rpb24obGFiZWwpIHtcbiAgICAgICAgbGFiZWxfdG9fZW5jb2RpbmdbbGFiZWxdID0gZW5jb2Rpbmc7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUmVnaXN0cnkgb2Ygb2YgZW5jb2Rlci9kZWNvZGVyIGZhY3RvcmllcywgYnkgZW5jb2RpbmcgbmFtZS5cbiAgLyoqIEB0eXBlIHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24oe2ZhdGFsOmJvb2xlYW59KTogRW5jb2Rlcj59ICovXG4gIHZhciBlbmNvZGVycyA9IHt9O1xuICAvKiogQHR5cGUge09iamVjdC48c3RyaW5nLCBmdW5jdGlvbih7ZmF0YWw6Ym9vbGVhbn0pOiBEZWNvZGVyPn0gKi9cbiAgdmFyIGRlY29kZXJzID0ge307XG5cbiAgLy9cbiAgLy8gNi4gSW5kZXhlc1xuICAvL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcG9pbnRlciBUaGUgfHBvaW50ZXJ8IHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7KCFBcnJheS48P251bWJlcj58dW5kZWZpbmVkKX0gaW5kZXggVGhlIHxpbmRleHwgdG8gc2VhcmNoIHdpdGhpbi5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB8aW5kZXh8LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhDb2RlUG9pbnRGb3IocG9pbnRlciwgaW5kZXgpIHtcbiAgICBpZiAoIWluZGV4KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gaW5kZXhbcG9pbnRlcl0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBUaGUgfGNvZGUgcG9pbnR8IHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7IUFycmF5Ljw/bnVtYmVyPn0gaW5kZXggVGhlIHxpbmRleHwgdG8gc2VhcmNoIHdpdGhpbi5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGZpcnN0IHBvaW50ZXIgY29ycmVzcG9uZGluZyB0byB8Y29kZSBwb2ludHwgaW5cbiAgICogICAgIHxpbmRleHwsIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB8aW5kZXh8LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KSB7XG4gICAgdmFyIHBvaW50ZXIgPSBpbmRleC5pbmRleE9mKGNvZGVfcG9pbnQpO1xuICAgIHJldHVybiBwb2ludGVyID09PSAtMSA/IG51bGwgOiBwb2ludGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGluZGV4LlxuICAgKiBAcmV0dXJuIHsoIUFycmF5LjxudW1iZXI+fCFBcnJheS48QXJyYXkuPG51bWJlcj4+KX1cbiAgICogICovXG4gIGZ1bmN0aW9uIGluZGV4KG5hbWUpIHtcbiAgICBpZiAoISgnZW5jb2RpbmctaW5kZXhlcycgaW4gZ2xvYmFsKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXCJJbmRleGVzIG1pc3NpbmcuXCIgK1xuICAgICAgICAgICAgICAgICAgXCIgRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSBlbmNvZGluZy1pbmRleGVzLmpzIGZpcnN0P1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbFsnZW5jb2RpbmctaW5kZXhlcyddW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb2ludGVyIFRoZSB8cG9pbnRlcnwgdG8gc2VhcmNoIGZvciBpbiB0aGUgZ2IxODAzMCBpbmRleC5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB0aGUgZ2IxODAzMCBpbmRleC5cbiAgICovXG4gIGZ1bmN0aW9uIGluZGV4R0IxODAzMFJhbmdlc0NvZGVQb2ludEZvcihwb2ludGVyKSB7XG4gICAgLy8gMS4gSWYgcG9pbnRlciBpcyBncmVhdGVyIHRoYW4gMzk0MTkgYW5kIGxlc3MgdGhhbiAxODkwMDAsIG9yXG4gICAgLy8gcG9pbnRlciBpcyBncmVhdGVyIHRoYW4gMTIzNzU3NSwgcmV0dXJuIG51bGwuXG4gICAgaWYgKChwb2ludGVyID4gMzk0MTkgJiYgcG9pbnRlciA8IDE4OTAwMCkgfHwgKHBvaW50ZXIgPiAxMjM3NTc1KSlcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy8gMi4gSWYgcG9pbnRlciBpcyA3NDU3LCByZXR1cm4gY29kZSBwb2ludCBVK0U3QzcuXG4gICAgaWYgKHBvaW50ZXIgPT09IDc0NTcpIHJldHVybiAweEU3Qzc7XG5cbiAgICAvLyAzLiBMZXQgb2Zmc2V0IGJlIHRoZSBsYXN0IHBvaW50ZXIgaW4gaW5kZXggZ2IxODAzMCByYW5nZXMgdGhhdFxuICAgIC8vIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiBwb2ludGVyIGFuZCBsZXQgY29kZSBwb2ludCBvZmZzZXQgYmVcbiAgICAvLyBpdHMgY29ycmVzcG9uZGluZyBjb2RlIHBvaW50LlxuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIHZhciBjb2RlX3BvaW50X29mZnNldCA9IDA7XG4gICAgdmFyIGlkeCA9IGluZGV4KCdnYjE4MDMwLXJhbmdlcycpO1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBpZHgubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxudW1iZXI+fSAqL1xuICAgICAgdmFyIGVudHJ5ID0gaWR4W2ldO1xuICAgICAgaWYgKGVudHJ5WzBdIDw9IHBvaW50ZXIpIHtcbiAgICAgICAgb2Zmc2V0ID0gZW50cnlbMF07XG4gICAgICAgIGNvZGVfcG9pbnRfb2Zmc2V0ID0gZW50cnlbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQgb2Zmc2V0ICtcbiAgICAvLyBwb2ludGVyIOKIkiBvZmZzZXQuXG4gICAgcmV0dXJuIGNvZGVfcG9pbnRfb2Zmc2V0ICsgcG9pbnRlciAtIG9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBUaGUgfGNvZGUgcG9pbnR8IHRvIGxvY2F0ZSBpbiB0aGUgZ2IxODAzMCBpbmRleC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZmlyc3QgcG9pbnRlciBjb3JyZXNwb25kaW5nIHRvIHxjb2RlIHBvaW50fCBpbiB0aGVcbiAgICogICAgIGdiMTgwMzAgaW5kZXguXG4gICAqL1xuICBmdW5jdGlvbiBpbmRleEdCMTgwMzBSYW5nZXNQb2ludGVyRm9yKGNvZGVfcG9pbnQpIHtcbiAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIFUrRTdDNywgcmV0dXJuIHBvaW50ZXIgNzQ1Ny5cbiAgICBpZiAoY29kZV9wb2ludCA9PT0gMHhFN0M3KSByZXR1cm4gNzQ1NztcblxuICAgIC8vIDIuIExldCBvZmZzZXQgYmUgdGhlIGxhc3QgY29kZSBwb2ludCBpbiBpbmRleCBnYjE4MDMwIHJhbmdlc1xuICAgIC8vIHRoYXQgaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIGNvZGUgcG9pbnQgYW5kIGxldCBwb2ludGVyIG9mZnNldFxuICAgIC8vIGJlIGl0cyBjb3JyZXNwb25kaW5nIHBvaW50ZXIuXG4gICAgdmFyIG9mZnNldCA9IDA7XG4gICAgdmFyIHBvaW50ZXJfb2Zmc2V0ID0gMDtcbiAgICB2YXIgaWR4ID0gaW5kZXgoJ2diMTgwMzAtcmFuZ2VzJyk7XG4gICAgdmFyIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGlkeC5sZW5ndGg7ICsraSkge1xuICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPG51bWJlcj59ICovXG4gICAgICB2YXIgZW50cnkgPSBpZHhbaV07XG4gICAgICBpZiAoZW50cnlbMV0gPD0gY29kZV9wb2ludCkge1xuICAgICAgICBvZmZzZXQgPSBlbnRyeVsxXTtcbiAgICAgICAgcG9pbnRlcl9vZmZzZXQgPSBlbnRyeVswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiBhIHBvaW50ZXIgd2hvc2UgdmFsdWUgaXMgcG9pbnRlciBvZmZzZXQgKyBjb2RlIHBvaW50XG4gICAgLy8g4oiSIG9mZnNldC5cbiAgICByZXR1cm4gcG9pbnRlcl9vZmZzZXQgKyBjb2RlX3BvaW50IC0gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IFRoZSB8Y29kZV9wb2ludHwgdG8gc2VhcmNoIGZvciBpbiB0aGUgU2hpZnRfSklTXG4gICAqICAgICBpbmRleC5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB0aGUgU2hpZnRfSklTIGluZGV4LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhTaGlmdEpJU1BvaW50ZXJGb3IoY29kZV9wb2ludCkge1xuICAgIC8vIDEuIExldCBpbmRleCBiZSBpbmRleCBqaXMwMjA4IGV4Y2x1ZGluZyBhbGwgZW50cmllcyB3aG9zZVxuICAgIC8vIHBvaW50ZXIgaXMgaW4gdGhlIHJhbmdlIDgyNzIgdG8gODgzNSwgaW5jbHVzaXZlLlxuICAgIHNoaWZ0X2ppc19pbmRleCA9IHNoaWZ0X2ppc19pbmRleCB8fFxuICAgICAgaW5kZXgoJ2ppczAyMDgnKS5tYXAoZnVuY3Rpb24oY29kZV9wb2ludCwgcG9pbnRlcikge1xuICAgICAgICByZXR1cm4gaW5SYW5nZShwb2ludGVyLCA4MjcyLCA4ODM1KSA/IG51bGwgOiBjb2RlX3BvaW50O1xuICAgICAgfSk7XG4gICAgdmFyIGluZGV4XyA9IHNoaWZ0X2ppc19pbmRleDtcblxuICAgIC8vIDIuIFJldHVybiB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleC5cbiAgICByZXR1cm4gaW5kZXhfLmluZGV4T2YoY29kZV9wb2ludCk7XG4gIH1cbiAgdmFyIHNoaWZ0X2ppc19pbmRleDtcblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgVGhlIHxjb2RlX3BvaW50fCB0byBzZWFyY2ggZm9yIGluIHRoZSBiaWc1XG4gICAqICAgICBpbmRleC5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB0aGUgYmlnNSBpbmRleC5cbiAgICovXG4gIGZ1bmN0aW9uIGluZGV4QmlnNVBvaW50ZXJGb3IoY29kZV9wb2ludCkge1xuICAgIC8vIDEuIExldCBpbmRleCBiZSBpbmRleCBCaWc1IGV4Y2x1ZGluZyBhbGwgZW50cmllcyB3aG9zZSBwb2ludGVyXG4gICAgYmlnNV9pbmRleF9ub19oa3NjcyA9IGJpZzVfaW5kZXhfbm9faGtzY3MgfHxcbiAgICAgIGluZGV4KCdiaWc1JykubWFwKGZ1bmN0aW9uKGNvZGVfcG9pbnQsIHBvaW50ZXIpIHtcbiAgICAgICAgcmV0dXJuIChwb2ludGVyIDwgKDB4QTEgLSAweDgxKSAqIDE1NykgPyBudWxsIDogY29kZV9wb2ludDtcbiAgICAgIH0pO1xuICAgIHZhciBpbmRleF8gPSBiaWc1X2luZGV4X25vX2hrc2NzO1xuXG4gICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBVKzI1NTAsIFUrMjU1RSwgVSsyNTYxLCBVKzI1NkEsIFUrNTM0MSwgb3JcbiAgICAvLyBVKzUzNDUsIHJldHVybiB0aGUgbGFzdCBwb2ludGVyIGNvcnJlc3BvbmRpbmcgdG8gY29kZSBwb2ludCBpblxuICAgIC8vIGluZGV4LlxuICAgIGlmIChjb2RlX3BvaW50ID09PSAweDI1NTAgfHwgY29kZV9wb2ludCA9PT0gMHgyNTVFIHx8XG4gICAgICAgIGNvZGVfcG9pbnQgPT09IDB4MjU2MSB8fCBjb2RlX3BvaW50ID09PSAweDI1NkEgfHxcbiAgICAgICAgY29kZV9wb2ludCA9PT0gMHg1MzQxIHx8IGNvZGVfcG9pbnQgPT09IDB4NTM0NSkge1xuICAgICAgcmV0dXJuIGluZGV4Xy5sYXN0SW5kZXhPZihjb2RlX3BvaW50KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZXR1cm4gdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXguXG4gICAgcmV0dXJuIGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleF8pO1xuICB9XG4gIHZhciBiaWc1X2luZGV4X25vX2hrc2NzO1xuXG4gIC8vXG4gIC8vIDguIEFQSVxuICAvL1xuXG4gIC8qKiBAY29uc3QgKi8gdmFyIERFRkFVTFRfRU5DT0RJTkcgPSAndXRmLTgnO1xuXG4gIC8vIDguMSBJbnRlcmZhY2UgVGV4dERlY29kZXJcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSBlbmNvZGluZztcbiAgICogICAgIGRlZmF1bHRzIHRvICd1dGYtOCcuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVGV4dERlY29kZXIobGFiZWwsIG9wdGlvbnMpIHtcbiAgICAvLyBXZWIgSURMIGNvbnZlbnRpb25zXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRleHREZWNvZGVyKSlcbiAgICAgIHRocm93IFR5cGVFcnJvcignQ2FsbGVkIGFzIGEgZnVuY3Rpb24uIERpZCB5b3UgZm9yZ2V0IFxcJ25ld1xcJz8nKTtcbiAgICBsYWJlbCA9IGxhYmVsICE9PSB1bmRlZmluZWQgPyBTdHJpbmcobGFiZWwpIDogREVGQVVMVF9FTkNPRElORztcbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gQSBUZXh0RGVjb2RlciBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgZW5jb2RpbmcsIGRlY29kZXIsXG4gICAgLy8gc3RyZWFtLCBpZ25vcmUgQk9NIGZsYWcgKGluaXRpYWxseSB1bnNldCksIEJPTSBzZWVuIGZsYWdcbiAgICAvLyAoaW5pdGlhbGx5IHVuc2V0KSwgZXJyb3IgbW9kZSAoaW5pdGlhbGx5IHJlcGxhY2VtZW50KSwgYW5kIGRvXG4gICAgLy8gbm90IGZsdXNoIGZsYWcgKGluaXRpYWxseSB1bnNldCkuXG5cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICB0aGlzLl9lbmNvZGluZyA9IG51bGw7XG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHs/RGVjb2Rlcn0gKi9cbiAgICB0aGlzLl9kZWNvZGVyID0gbnVsbDtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5faWdub3JlQk9NID0gZmFsc2U7XG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuX0JPTXNlZW4gPSBmYWxzZTtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLl9lcnJvcl9tb2RlID0gJ3JlcGxhY2VtZW50JztcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fZG9fbm90X2ZsdXNoID0gZmFsc2U7XG5cblxuICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSB0aGUgcmVzdWx0IG9mIGdldHRpbmcgYW4gZW5jb2RpbmcgZnJvbVxuICAgIC8vIGxhYmVsLlxuICAgIHZhciBlbmNvZGluZyA9IGdldEVuY29kaW5nKGxhYmVsKTtcblxuICAgIC8vIDIuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUgb3IgcmVwbGFjZW1lbnQsIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwgfHwgZW5jb2RpbmcubmFtZSA9PT0gJ3JlcGxhY2VtZW50JylcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBsYWJlbCk7XG4gICAgaWYgKCFkZWNvZGVyc1tlbmNvZGluZy5uYW1lXSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RlY29kZXIgbm90IHByZXNlbnQuJyArXG4gICAgICAgICAgICAgICAgICAnIERpZCB5b3UgZm9yZ2V0IHRvIGluY2x1ZGUgZW5jb2RpbmctaW5kZXhlcy5qcyBmaXJzdD8nKTtcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgZGVjIGJlIGEgbmV3IFRleHREZWNvZGVyIG9iamVjdC5cbiAgICB2YXIgZGVjID0gdGhpcztcblxuICAgIC8vIDQuIFNldCBkZWMncyBlbmNvZGluZyB0byBlbmNvZGluZy5cbiAgICBkZWMuX2VuY29kaW5nID0gZW5jb2Rpbmc7XG5cbiAgICAvLyA1LiBJZiBvcHRpb25zJ3MgZmF0YWwgbWVtYmVyIGlzIHRydWUsIHNldCBkZWMncyBlcnJvciBtb2RlIHRvXG4gICAgLy8gZmF0YWwuXG4gICAgaWYgKEJvb2xlYW4ob3B0aW9uc1snZmF0YWwnXSkpXG4gICAgICBkZWMuX2Vycm9yX21vZGUgPSAnZmF0YWwnO1xuXG4gICAgLy8gNi4gSWYgb3B0aW9ucydzIGlnbm9yZUJPTSBtZW1iZXIgaXMgdHJ1ZSwgc2V0IGRlYydzIGlnbm9yZSBCT01cbiAgICAvLyBmbGFnLlxuICAgIGlmIChCb29sZWFuKG9wdGlvbnNbJ2lnbm9yZUJPTSddKSlcbiAgICAgIGRlYy5faWdub3JlQk9NID0gdHJ1ZTtcblxuICAgIC8vIEZvciBwcmUtRVM1IHJ1bnRpbWVzOlxuICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICB0aGlzLmVuY29kaW5nID0gZGVjLl9lbmNvZGluZy5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmZhdGFsID0gZGVjLl9lcnJvcl9tb2RlID09PSAnZmF0YWwnO1xuICAgICAgdGhpcy5pZ25vcmVCT00gPSBkZWMuX2lnbm9yZUJPTTtcbiAgICB9XG5cbiAgICAvLyA3LiBSZXR1cm4gZGVjLlxuICAgIHJldHVybiBkZWM7XG4gIH1cblxuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgLy8gVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSdzIGdldHRlciBtdXN0IHJldHVybiBlbmNvZGluZydzIG5hbWUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHREZWNvZGVyLnByb3RvdHlwZSwgJ2VuY29kaW5nJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RGVjb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9lbmNvZGluZy5uYW1lLnRvTG93ZXJDYXNlKCk7IH1cbiAgICB9KTtcblxuICAgIC8vIFRoZSBmYXRhbCBhdHRyaWJ1dGUncyBnZXR0ZXIgbXVzdCByZXR1cm4gdHJ1ZSBpZiBlcnJvciBtb2RlXG4gICAgLy8gaXMgZmF0YWwsIGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHREZWNvZGVyLnByb3RvdHlwZSwgJ2ZhdGFsJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RGVjb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9lcnJvcl9tb2RlID09PSAnZmF0YWwnOyB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgaWdub3JlQk9NIGF0dHJpYnV0ZSdzIGdldHRlciBtdXN0IHJldHVybiB0cnVlIGlmIGlnbm9yZVxuICAgIC8vIEJPTSBmbGFnIGlzIHNldCwgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dERlY29kZXIucHJvdG90eXBlLCAnaWdub3JlQk9NJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RGVjb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9pZ25vcmVCT007IH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZT19IGlucHV0IFRoZSBidWZmZXIgb2YgYnl0ZXMgdG8gZGVjb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmcuXG4gICAqL1xuICBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBvcHRpb25zKSB7XG4gICAgdmFyIGJ5dGVzO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiAnYnVmZmVyJyBpbiBpbnB1dCAmJlxuICAgICAgICAgICAgICAgaW5wdXQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQuYnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ieXRlTGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gMS4gSWYgdGhlIGRvIG5vdCBmbHVzaCBmbGFnIGlzIHVuc2V0LCBzZXQgZGVjb2RlciB0byBhIG5ld1xuICAgIC8vIGVuY29kaW5nJ3MgZGVjb2Rlciwgc2V0IHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCB1bnNldCB0aGVcbiAgICAvLyBCT00gc2VlbiBmbGFnLlxuICAgIGlmICghdGhpcy5fZG9fbm90X2ZsdXNoKSB7XG4gICAgICB0aGlzLl9kZWNvZGVyID0gZGVjb2RlcnNbdGhpcy5fZW5jb2RpbmcubmFtZV0oe1xuICAgICAgICBmYXRhbDogdGhpcy5fZXJyb3JfbW9kZSA9PT0gJ2ZhdGFsJ30pO1xuICAgICAgdGhpcy5fQk9Nc2VlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDIuIElmIG9wdGlvbnMncyBzdHJlYW0gaXMgdHJ1ZSwgc2V0IHRoZSBkbyBub3QgZmx1c2ggZmxhZywgYW5kXG4gICAgLy8gdW5zZXQgdGhlIGRvIG5vdCBmbHVzaCBmbGFnIG90aGVyd2lzZS5cbiAgICB0aGlzLl9kb19ub3RfZmx1c2ggPSBCb29sZWFuKG9wdGlvbnNbJ3N0cmVhbSddKTtcblxuICAgIC8vIDMuIElmIGlucHV0IGlzIGdpdmVuLCBwdXNoIGEgY29weSBvZiBpbnB1dCB0byBzdHJlYW0uXG4gICAgLy8gVE9ETzogQWxpZ24gd2l0aCBzcGVjIGFsZ29yaXRobSAtIG1haW50YWluIHN0cmVhbSBvbiBpbnN0YW5jZS5cbiAgICB2YXIgaW5wdXRfc3RyZWFtID0gbmV3IFN0cmVhbShieXRlcyk7XG5cbiAgICAvLyA0LiBMZXQgb3V0cHV0IGJlIGEgbmV3IHN0cmVhbS5cbiAgICB2YXIgb3V0cHV0ID0gW107XG5cbiAgICAvKiogQHR5cGUgez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9ICovXG4gICAgdmFyIHJlc3VsdDtcblxuICAgIC8vIDUuIFdoaWxlIHRydWU6XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEuIExldCB0b2tlbiBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgZnJvbSBzdHJlYW0uXG4gICAgICB2YXIgdG9rZW4gPSBpbnB1dF9zdHJlYW0ucmVhZCgpO1xuXG4gICAgICAvLyAyLiBJZiB0b2tlbiBpcyBlbmQtb2Ytc3RyZWFtIGFuZCB0aGUgZG8gbm90IGZsdXNoIGZsYWcgaXNcbiAgICAgIC8vIHNldCwgcmV0dXJuIG91dHB1dCwgc2VyaWFsaXplZC5cbiAgICAgIC8vIFRPRE86IEFsaWduIHdpdGggc3BlYyBhbGdvcml0aG0uXG4gICAgICBpZiAodG9rZW4gPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvLyAzLiBPdGhlcndpc2UsIHJ1biB0aGVzZSBzdWJzdWJzdGVwczpcblxuICAgICAgLy8gMS4gTGV0IHJlc3VsdCBiZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgdG9rZW4gZm9yIGRlY29kZXIsXG4gICAgICAvLyBzdHJlYW0sIG91dHB1dCwgYW5kIGVycm9yIG1vZGUuXG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVyLmhhbmRsZXIoaW5wdXRfc3RyZWFtLCB0b2tlbik7XG5cbiAgICAgIC8vIDIuIElmIHJlc3VsdCBpcyBmaW5pc2hlZCwgcmV0dXJuIG91dHB1dCwgc2VyaWFsaXplZC5cbiAgICAgIGlmIChyZXN1bHQgPT09IGZpbmlzaGVkKVxuICAgICAgICBicmVhaztcblxuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKVxuICAgICAgICAgIG91dHB1dC5wdXNoLmFwcGx5KG91dHB1dCwgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgcmVzdWx0IGlzIGVycm9yLCB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIC8vIChUaHJvd24gaW4gaGFuZGxlcilcblxuICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBkbyBub3RoaW5nLlxuICAgIH1cbiAgICAvLyBUT0RPOiBBbGlnbiB3aXRoIHNwZWMgYWxnb3JpdGhtLlxuICAgIGlmICghdGhpcy5fZG9fbm90X2ZsdXNoKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZXIuaGFuZGxlcihpbnB1dF9zdHJlYW0sIGlucHV0X3N0cmVhbS5yZWFkKCkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmaW5pc2hlZClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSlcbiAgICAgICAgICBvdXRwdXQucHVzaC5hcHBseShvdXRwdXQsIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8ocmVzdWx0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfSB3aGlsZSAoIWlucHV0X3N0cmVhbS5lbmRPZlN0cmVhbSgpKTtcbiAgICAgIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEEgVGV4dERlY29kZXIgb2JqZWN0IGFsc28gaGFzIGFuIGFzc29jaWF0ZWQgc2VyaWFsaXplIHN0cmVhbVxuICAgIC8vIGFsZ29yaXRobS4uLlxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBzdHJlYW1cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICogQHRoaXMge1RleHREZWNvZGVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZVN0cmVhbShzdHJlYW0pIHtcbiAgICAgIC8vIDEuIExldCB0b2tlbiBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgZnJvbSBzdHJlYW0uXG4gICAgICAvLyAoRG9uZSBpbi1wbGFjZSBvbiBhcnJheSwgcmF0aGVyIHRoYW4gYXMgYSBzdHJlYW0pXG5cbiAgICAgIC8vIDIuIElmIGVuY29kaW5nIGlzIFVURi04LCBVVEYtMTZCRSwgb3IgVVRGLTE2TEUsIGFuZCBpZ25vcmVcbiAgICAgIC8vIEJPTSBmbGFnIGFuZCBCT00gc2VlbiBmbGFnIGFyZSB1bnNldCwgcnVuIHRoZXNlIHN1YnN1YnN0ZXBzOlxuICAgICAgaWYgKGluY2x1ZGVzKFsnVVRGLTgnLCAnVVRGLTE2TEUnLCAnVVRGLTE2QkUnXSwgdGhpcy5fZW5jb2RpbmcubmFtZSkgJiZcbiAgICAgICAgICAhdGhpcy5faWdub3JlQk9NICYmICF0aGlzLl9CT01zZWVuKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubGVuZ3RoID4gMCAmJiBzdHJlYW1bMF0gPT09IDB4RkVGRikge1xuICAgICAgICAgIC8vIDEuIElmIHRva2VuIGlzIFUrRkVGRiwgc2V0IEJPTSBzZWVuIGZsYWcuXG4gICAgICAgICAgdGhpcy5fQk9Nc2VlbiA9IHRydWU7XG4gICAgICAgICAgc3RyZWFtLnNoaWZ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyAyLiBPdGhlcndpc2UsIGlmIHRva2VuIGlzIG5vdCBlbmQtb2Ytc3RyZWFtLCBzZXQgQk9NIHNlZW5cbiAgICAgICAgICAvLyBmbGFnIGFuZCBhcHBlbmQgdG9rZW4gdG8gc3RyZWFtLlxuICAgICAgICAgIHRoaXMuX0JPTXNlZW4gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgdG9rZW4gaXMgbm90IGVuZC1vZi1zdHJlYW0sIGFwcGVuZCB0b2tlblxuICAgICAgICAgIC8vIHRvIG91dHB1dC5cbiAgICAgICAgICAvLyAobm8tb3ApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgcmV0dXJuIG91dHB1dC5cbiAgICAgIHJldHVybiBjb2RlUG9pbnRzVG9TdHJpbmcoc3RyZWFtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplU3RyZWFtLmNhbGwodGhpcywgb3V0cHV0KTtcbiAgfTtcblxuICAvLyA4LjIgSW50ZXJmYWNlIFRleHRFbmNvZGVyXG5cbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IGxhYmVsIFRoZSBsYWJlbCBvZiB0aGUgZW5jb2RpbmcuIE5PTlNUQU5EQVJELlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgTk9OU1RBTkRBUkQuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0RW5jb2RlcihsYWJlbCwgb3B0aW9ucykge1xuICAgIC8vIFdlYiBJREwgY29udmVudGlvbnNcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGV4dEVuY29kZXIpKVxuICAgICAgdGhyb3cgVHlwZUVycm9yKCdDYWxsZWQgYXMgYSBmdW5jdGlvbi4gRGlkIHlvdSBmb3JnZXQgXFwnbmV3XFwnPycpO1xuICAgIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgICAvLyBBIFRleHRFbmNvZGVyIG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCBlbmNvZGluZyBhbmQgZW5jb2Rlci5cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUgez9FbmNvZGVyfSAqL1xuICAgIHRoaXMuX2VuY29kZXIgPSBudWxsO1xuXG4gICAgLy8gTm9uLXN0YW5kYXJkXG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuX2RvX25vdF9mbHVzaCA9IGZhbHNlO1xuICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIHRoaXMuX2ZhdGFsID0gQm9vbGVhbihvcHRpb25zWydmYXRhbCddKSA/ICdmYXRhbCcgOiAncmVwbGFjZW1lbnQnO1xuXG4gICAgLy8gMS4gTGV0IGVuYyBiZSBhIG5ldyBUZXh0RW5jb2RlciBvYmplY3QuXG4gICAgdmFyIGVuYyA9IHRoaXM7XG5cbiAgICAvLyAyLiBTZXQgZW5jJ3MgZW5jb2RpbmcgdG8gVVRGLTgncyBlbmNvZGVyLlxuICAgIGlmIChCb29sZWFuKG9wdGlvbnNbJ05PTlNUQU5EQVJEX2FsbG93TGVnYWN5RW5jb2RpbmcnXSkpIHtcbiAgICAgIC8vIE5PTlNUQU5EQVJEIGJlaGF2aW9yLlxuICAgICAgbGFiZWwgPSBsYWJlbCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGxhYmVsKSA6IERFRkFVTFRfRU5DT0RJTkc7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhsYWJlbCk7XG4gICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwgfHwgZW5jb2RpbmcubmFtZSA9PT0gJ3JlcGxhY2VtZW50JylcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGxhYmVsKTtcbiAgICAgIGlmICghZW5jb2RlcnNbZW5jb2RpbmcubmFtZV0pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0VuY29kZXIgbm90IHByZXNlbnQuJyArXG4gICAgICAgICAgICAgICAgICAgICcgRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSBlbmNvZGluZy1pbmRleGVzLmpzIGZpcnN0PycpO1xuICAgICAgfVxuICAgICAgZW5jLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGFuZGFyZCBiZWhhdmlvci5cbiAgICAgIGVuYy5fZW5jb2RpbmcgPSBnZXRFbmNvZGluZygndXRmLTgnKTtcblxuICAgICAgaWYgKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgJ2NvbnNvbGUnIGluIGdsb2JhbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RleHRFbmNvZGVyIGNvbnN0cnVjdG9yIGNhbGxlZCB3aXRoIGVuY29kaW5nIGxhYmVsLCAnXG4gICAgICAgICAgICAgICAgICAgICArICd3aGljaCBpcyBpZ25vcmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvciBwcmUtRVM1IHJ1bnRpbWVzOlxuICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5KVxuICAgICAgdGhpcy5lbmNvZGluZyA9IGVuYy5fZW5jb2RpbmcubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gMy4gUmV0dXJuIGVuYy5cbiAgICByZXR1cm4gZW5jO1xuICB9XG5cbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIC8vIFRoZSBlbmNvZGluZyBhdHRyaWJ1dGUncyBnZXR0ZXIgbXVzdCByZXR1cm4gZW5jb2RpbmcncyBuYW1lLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZXh0RW5jb2Rlci5wcm90b3R5cGUsICdlbmNvZGluZycsIHtcbiAgICAgIC8qKiBAdGhpcyB7VGV4dEVuY29kZXJ9ICovXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fZW5jb2RpbmcubmFtZS50b0xvd2VyQ2FzZSgpOyB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBvcHRfc3RyaW5nIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAgICogQHJldHVybiB7IVVpbnQ4QXJyYXl9IEVuY29kZWQgYnl0ZXMsIGFzIGEgVWludDhBcnJheS5cbiAgICovXG4gIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUob3B0X3N0cmluZywgb3B0aW9ucykge1xuICAgIG9wdF9zdHJpbmcgPSBvcHRfc3RyaW5nID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhvcHRfc3RyaW5nKTtcbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gTk9URTogVGhpcyBvcHRpb24gaXMgbm9uc3RhbmRhcmQuIE5vbmUgb2YgdGhlIGVuY29kaW5nc1xuICAgIC8vIHBlcm1pdHRlZCBmb3IgZW5jb2RpbmcgKGkuZS4gVVRGLTgsIFVURi0xNikgYXJlIHN0YXRlZnVsIHdoZW5cbiAgICAvLyB0aGUgaW5wdXQgaXMgYSBVU1ZTdHJpbmcgc28gc3RyZWFtaW5nIGlzIG5vdCBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9kb19ub3RfZmx1c2gpXG4gICAgICB0aGlzLl9lbmNvZGVyID0gZW5jb2RlcnNbdGhpcy5fZW5jb2RpbmcubmFtZV0oe1xuICAgICAgICBmYXRhbDogdGhpcy5fZmF0YWwgPT09ICdmYXRhbCd9KTtcbiAgICB0aGlzLl9kb19ub3RfZmx1c2ggPSBCb29sZWFuKG9wdGlvbnNbJ3N0cmVhbSddKTtcblxuICAgIC8vIDEuIENvbnZlcnQgaW5wdXQgdG8gYSBzdHJlYW0uXG4gICAgdmFyIGlucHV0ID0gbmV3IFN0cmVhbShzdHJpbmdUb0NvZGVQb2ludHMob3B0X3N0cmluZykpO1xuXG4gICAgLy8gMi4gTGV0IG91dHB1dCBiZSBhIG5ldyBzdHJlYW1cbiAgICB2YXIgb3V0cHV0ID0gW107XG5cbiAgICAvKiogQHR5cGUgez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9ICovXG4gICAgdmFyIHJlc3VsdDtcbiAgICAvLyAzLiBXaGlsZSB0cnVlLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEuIExldCB0b2tlbiBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgZnJvbSBpbnB1dC5cbiAgICAgIHZhciB0b2tlbiA9IGlucHV0LnJlYWQoKTtcbiAgICAgIGlmICh0b2tlbiA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyAyLiBMZXQgcmVzdWx0IGJlIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyB0b2tlbiBmb3IgZW5jb2RlcixcbiAgICAgIC8vIGlucHV0LCBvdXRwdXQuXG4gICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIoaW5wdXQsIHRva2VuKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IGZpbmlzaGVkKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpXG4gICAgICAgIG91dHB1dC5wdXNoLmFwcGx5KG91dHB1dCwgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgLy8gVE9ETzogQWxpZ24gd2l0aCBzcGVjIGFsZ29yaXRobS5cbiAgICBpZiAoIXRoaXMuX2RvX25vdF9mbHVzaCkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZW5jb2Rlci5oYW5kbGVyKGlucHV0LCBpbnB1dC5yZWFkKCkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmaW5pc2hlZClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSlcbiAgICAgICAgICBvdXRwdXQucHVzaC5hcHBseShvdXRwdXQsIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8ocmVzdWx0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZW5jb2RlciA9IG51bGw7XG4gICAgfVxuICAgIC8vIDMuIElmIHJlc3VsdCBpcyBmaW5pc2hlZCwgY29udmVydCBvdXRwdXQgaW50byBhIGJ5dGUgc2VxdWVuY2UsXG4gICAgLy8gYW5kIHRoZW4gcmV0dXJuIGEgVWludDhBcnJheSBvYmplY3Qgd3JhcHBpbmcgYW4gQXJyYXlCdWZmZXJcbiAgICAvLyBjb250YWluaW5nIG91dHB1dC5cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkob3V0cHV0KTtcbiAgfTtcblxuXG4gIC8vXG4gIC8vIDkuIFRoZSBlbmNvZGluZ1xuICAvL1xuXG4gIC8vIDkuMSB1dGYtOFxuXG4gIC8vIDkuMS4xIHV0Zi04IGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBVVEY4RGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcblxuICAgIC8vIHV0Zi04J3MgZGVjb2RlcidzIGhhcyBhbiBhc3NvY2lhdGVkIHV0Zi04IGNvZGUgcG9pbnQsIHV0Zi04XG4gICAgLy8gYnl0ZXMgc2VlbiwgYW5kIHV0Zi04IGJ5dGVzIG5lZWRlZCAoYWxsIGluaXRpYWxseSAwKSwgYSB1dGYtOFxuICAgIC8vIGxvd2VyIGJvdW5kYXJ5IChpbml0aWFsbHkgMHg4MCksIGFuZCBhIHV0Zi04IHVwcGVyIGJvdW5kYXJ5XG4gICAgLy8gKGluaXRpYWxseSAweEJGKS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIHV0ZjhfY29kZV9wb2ludCA9IDAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X2J5dGVzX3NlZW4gPSAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gdXRmOF9ieXRlc19uZWVkZWQgPSAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4ODAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHhCRjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCB1dGYtOCBieXRlcyBuZWVkZWQgaXMgbm90IDAsXG4gICAgICAvLyBzZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDAgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIHV0ZjhfYnl0ZXNfbmVlZGVkICE9PSAwKSB7XG4gICAgICAgIHV0ZjhfYnl0ZXNfbmVlZGVkID0gMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMy4gSWYgdXRmLTggYnl0ZXMgbmVlZGVkIGlzIDAsIGJhc2VkIG9uIGJ5dGU6XG4gICAgICBpZiAodXRmOF9ieXRlc19uZWVkZWQgPT09IDApIHtcblxuICAgICAgICAvLyAweDAwIHRvIDB4N0ZcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgwMCwgMHg3RikpIHtcbiAgICAgICAgICAvLyBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGJ5dGUuXG4gICAgICAgICAgcmV0dXJuIGJpdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweEMyIHRvIDB4REZcbiAgICAgICAgZWxzZSBpZiAoaW5SYW5nZShiaXRlLCAweEMyLCAweERGKSkge1xuICAgICAgICAgIC8vIDEuIFNldCB1dGYtOCBieXRlcyBuZWVkZWQgdG8gMS5cbiAgICAgICAgICB1dGY4X2J5dGVzX25lZWRlZCA9IDE7XG5cbiAgICAgICAgICAvLyAyLiBTZXQgVVRGLTggY29kZSBwb2ludCB0byBieXRlICYgMHgxRi5cbiAgICAgICAgICB1dGY4X2NvZGVfcG9pbnQgPSBiaXRlICYgMHgxRjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4RTAgdG8gMHhFRlxuICAgICAgICBlbHNlIGlmIChpblJhbmdlKGJpdGUsIDB4RTAsIDB4RUYpKSB7XG4gICAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyAweEUwLCBzZXQgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gMHhBMC5cbiAgICAgICAgICBpZiAoYml0ZSA9PT0gMHhFMClcbiAgICAgICAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweEEwO1xuICAgICAgICAgIC8vIDIuIElmIGJ5dGUgaXMgMHhFRCwgc2V0IHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4OUYuXG4gICAgICAgICAgaWYgKGJpdGUgPT09IDB4RUQpXG4gICAgICAgICAgICB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHg5RjtcbiAgICAgICAgICAvLyAzLiBTZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDIuXG4gICAgICAgICAgdXRmOF9ieXRlc19uZWVkZWQgPSAyO1xuICAgICAgICAgIC8vIDQuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIGJ5dGUgJiAweEYuXG4gICAgICAgICAgdXRmOF9jb2RlX3BvaW50ID0gYml0ZSAmIDB4RjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4RjAgdG8gMHhGNFxuICAgICAgICBlbHNlIGlmIChpblJhbmdlKGJpdGUsIDB4RjAsIDB4RjQpKSB7XG4gICAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyAweEYwLCBzZXQgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gMHg5MC5cbiAgICAgICAgICBpZiAoYml0ZSA9PT0gMHhGMClcbiAgICAgICAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweDkwO1xuICAgICAgICAgIC8vIDIuIElmIGJ5dGUgaXMgMHhGNCwgc2V0IHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4OEYuXG4gICAgICAgICAgaWYgKGJpdGUgPT09IDB4RjQpXG4gICAgICAgICAgICB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHg4RjtcbiAgICAgICAgICAvLyAzLiBTZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDMuXG4gICAgICAgICAgdXRmOF9ieXRlc19uZWVkZWQgPSAzO1xuICAgICAgICAgIC8vIDQuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIGJ5dGUgJiAweDcuXG4gICAgICAgICAgdXRmOF9jb2RlX3BvaW50ID0gYml0ZSAmIDB4NztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IuXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gY29udGludWUuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBieXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2UgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gdXRmLThcbiAgICAgIC8vIHVwcGVyIGJvdW5kYXJ5LCBpbmNsdXNpdmUsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmICghaW5SYW5nZShiaXRlLCB1dGY4X2xvd2VyX2JvdW5kYXJ5LCB1dGY4X3VwcGVyX2JvdW5kYXJ5KSkge1xuXG4gICAgICAgIC8vIDEuIFNldCB1dGYtOCBjb2RlIHBvaW50LCB1dGYtOCBieXRlcyBuZWVkZWQsIGFuZCB1dGYtOFxuICAgICAgICAvLyBieXRlcyBzZWVuIHRvIDAsIHNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDgwLCBhbmQgc2V0XG4gICAgICAgIC8vIHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4QkYuXG4gICAgICAgIHV0ZjhfY29kZV9wb2ludCA9IHV0ZjhfYnl0ZXNfbmVlZGVkID0gdXRmOF9ieXRlc19zZWVuID0gMDtcbiAgICAgICAgdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4ODA7XG4gICAgICAgIHV0ZjhfdXBwZXJfYm91bmRhcnkgPSAweEJGO1xuXG4gICAgICAgIC8vIDIuIFByZXBlbmQgYnl0ZSB0byBzdHJlYW0uXG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGJpdGUpO1xuXG4gICAgICAgIC8vIDMuIFJldHVybiBlcnJvci5cbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIFNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDgwIGFuZCB1dGYtOCB1cHBlciBib3VuZGFyeVxuICAgICAgLy8gdG8gMHhCRi5cbiAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweDgwO1xuICAgICAgdXRmOF91cHBlcl9ib3VuZGFyeSA9IDB4QkY7XG5cbiAgICAgIC8vIDYuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIChVVEYtOCBjb2RlIHBvaW50IDw8IDYpIHwgKGJ5dGUgJlxuICAgICAgLy8gMHgzRilcbiAgICAgIHV0ZjhfY29kZV9wb2ludCA9ICh1dGY4X2NvZGVfcG9pbnQgPDwgNikgfCAoYml0ZSAmIDB4M0YpO1xuXG4gICAgICAvLyA3LiBJbmNyZWFzZSB1dGYtOCBieXRlcyBzZWVuIGJ5IG9uZS5cbiAgICAgIHV0ZjhfYnl0ZXNfc2VlbiArPSAxO1xuXG4gICAgICAvLyA4LiBJZiB1dGYtOCBieXRlcyBzZWVuIGlzIG5vdCBlcXVhbCB0byB1dGYtOCBieXRlcyBuZWVkZWQsXG4gICAgICAvLyBjb250aW51ZS5cbiAgICAgIGlmICh1dGY4X2J5dGVzX3NlZW4gIT09IHV0ZjhfYnl0ZXNfbmVlZGVkKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gOS4gTGV0IGNvZGUgcG9pbnQgYmUgdXRmLTggY29kZSBwb2ludC5cbiAgICAgIHZhciBjb2RlX3BvaW50ID0gdXRmOF9jb2RlX3BvaW50O1xuXG4gICAgICAvLyAxMC4gU2V0IHV0Zi04IGNvZGUgcG9pbnQsIHV0Zi04IGJ5dGVzIG5lZWRlZCwgYW5kIHV0Zi04IGJ5dGVzXG4gICAgICAvLyBzZWVuIHRvIDAuXG4gICAgICB1dGY4X2NvZGVfcG9pbnQgPSB1dGY4X2J5dGVzX25lZWRlZCA9IHV0ZjhfYnl0ZXNfc2VlbiA9IDA7XG5cbiAgICAgIC8vIDExLiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICB9O1xuICB9XG5cbiAgLy8gOS4xLjIgdXRmLTggZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIFVURjhFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBTZXQgY291bnQgYW5kIG9mZnNldCBiYXNlZCBvbiB0aGUgcmFuZ2UgY29kZSBwb2ludCBpcyBpbjpcbiAgICAgIHZhciBjb3VudCwgb2Zmc2V0O1xuICAgICAgLy8gVSswMDgwIHRvIFUrMDdGRiwgaW5jbHVzaXZlOlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHgwMDgwLCAweDA3RkYpKSB7XG4gICAgICAgIC8vIDEgYW5kIDB4QzBcbiAgICAgICAgY291bnQgPSAxO1xuICAgICAgICBvZmZzZXQgPSAweEMwO1xuICAgICAgfVxuICAgICAgLy8gVSswODAwIHRvIFUrRkZGRiwgaW5jbHVzaXZlOlxuICAgICAgZWxzZSBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweDA4MDAsIDB4RkZGRikpIHtcbiAgICAgICAgLy8gMiBhbmQgMHhFMFxuICAgICAgICBjb3VudCA9IDI7XG4gICAgICAgIG9mZnNldCA9IDB4RTA7XG4gICAgICB9XG4gICAgICAvLyBVKzEwMDAwIHRvIFUrMTBGRkZGLCBpbmNsdXNpdmU6XG4gICAgICBlbHNlIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4MTAwMDAsIDB4MTBGRkZGKSkge1xuICAgICAgICAvLyAzIGFuZCAweEYwXG4gICAgICAgIGNvdW50ID0gMztcbiAgICAgICAgb2Zmc2V0ID0gMHhGMDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gTGV0IGJ5dGVzIGJlIGEgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCBieXRlIGlzIChjb2RlXG4gICAgICAvLyBwb2ludCA+PiAoNiDDlyBjb3VudCkpICsgb2Zmc2V0LlxuICAgICAgdmFyIGJ5dGVzID0gWyhjb2RlX3BvaW50ID4+ICg2ICogY291bnQpKSArIG9mZnNldF07XG5cbiAgICAgIC8vIDUuIFJ1biB0aGVzZSBzdWJzdGVwcyB3aGlsZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gMDpcbiAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcblxuICAgICAgICAvLyAxLiBTZXQgdGVtcCB0byBjb2RlIHBvaW50ID4+ICg2IMOXIChjb3VudCDiiJIgMSkpLlxuICAgICAgICB2YXIgdGVtcCA9IGNvZGVfcG9pbnQgPj4gKDYgKiAoY291bnQgLSAxKSk7XG5cbiAgICAgICAgLy8gMi4gQXBwZW5kIHRvIGJ5dGVzIDB4ODAgfCAodGVtcCAmIDB4M0YpLlxuICAgICAgICBieXRlcy5wdXNoKDB4ODAgfCAodGVtcCAmIDB4M0YpKTtcblxuICAgICAgICAvLyAzLiBEZWNyZWFzZSBjb3VudCBieSBvbmUuXG4gICAgICAgIGNvdW50IC09IDE7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIFJldHVybiBieXRlcyBieXRlcywgaW4gb3JkZXIuXG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ1VURi04J10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBVVEY4RW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snVVRGLTgnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjhEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vXG4gIC8vIDEwLiBMZWdhY3kgc2luZ2xlLWJ5dGUgZW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gMTAuMSBzaW5nbGUtYnl0ZSBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBpbmRleCBUaGUgZW5jb2RpbmcgaW5kZXguXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2luZ2xlQnl0ZURlY29kZXIoaW5kZXgsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGFuIEFTQ0lJIGJ5dGUsIHJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWVcbiAgICAgIC8vIGlzIGJ5dGUuXG4gICAgICBpZiAoaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgIHJldHVybiBiaXRlO1xuXG4gICAgICAvLyAzLiBMZXQgY29kZSBwb2ludCBiZSB0aGUgaW5kZXggY29kZSBwb2ludCBmb3IgYnl0ZSDiiJIgMHg4MCBpblxuICAgICAgLy8gaW5kZXggc2luZ2xlLWJ5dGUuXG4gICAgICB2YXIgY29kZV9wb2ludCA9IGluZGV4W2JpdGUgLSAweDgwXTtcblxuICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgIC8vIDUuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuICAgIH07XG4gIH1cblxuICAvLyAxMC4yIHNpbmdsZS1ieXRlIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHshQXJyYXkuPD9udW1iZXI+fSBpbmRleCBUaGUgZW5jb2RpbmcgaW5kZXguXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2luZ2xlQnl0ZUVuY29kZXIoaW5kZXgsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gc2luZ2xlLWJ5dGUuXG4gICAgICB2YXIgcG9pbnRlciA9IGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleCk7XG5cbiAgICAgIC8vIDQuIElmIHBvaW50ZXIgaXMgbnVsbCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChwb2ludGVyID09PSBudWxsKVxuICAgICAgICBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDUuIFJldHVybiBhIGJ5dGUgd2hvc2UgdmFsdWUgaXMgcG9pbnRlciArIDB4ODAuXG4gICAgICByZXR1cm4gcG9pbnRlciArIDB4ODA7XG4gICAgfTtcbiAgfVxuXG4gIChmdW5jdGlvbigpIHtcbiAgICBpZiAoISgnZW5jb2RpbmctaW5kZXhlcycgaW4gZ2xvYmFsKSlcbiAgICAgIHJldHVybjtcbiAgICBlbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbihjYXRlZ29yeSkge1xuICAgICAgaWYgKGNhdGVnb3J5LmhlYWRpbmcgIT09ICdMZWdhY3kgc2luZ2xlLWJ5dGUgZW5jb2RpbmdzJylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2F0ZWdvcnkuZW5jb2RpbmdzLmZvckVhY2goZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBlbmNvZGluZy5uYW1lO1xuICAgICAgICB2YXIgaWR4ID0gaW5kZXgobmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICAgICAgICBkZWNvZGVyc1tuYW1lXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZUJ5dGVEZWNvZGVyKGlkeCwgb3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgICAgICAgZW5jb2RlcnNbbmFtZV0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVCeXRlRW5jb2RlcihpZHgsIG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0oKSk7XG5cbiAgLy9cbiAgLy8gMTEuIExlZ2FjeSBtdWx0aS1ieXRlIENoaW5lc2UgKHNpbXBsaWZpZWQpIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDExLjEgZ2JrXG5cbiAgLy8gMTEuMS4xIGdiayBkZWNvZGVyXG4gIC8vIGdiaydzIGRlY29kZXIgaXMgZ2IxODAzMCdzIGRlY29kZXIuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0dCSyddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR0IxODAzMERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cbiAgLy8gMTEuMS4yIGdiayBlbmNvZGVyXG4gIC8vIGdiaydzIGVuY29kZXIgaXMgZ2IxODAzMCdzIGVuY29kZXIgd2l0aCBpdHMgZ2JrIGZsYWcgc2V0LlxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydHQksnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdCMTgwMzBFbmNvZGVyKG9wdGlvbnMsIHRydWUpO1xuICB9O1xuXG4gIC8vIDExLjIgZ2IxODAzMFxuXG4gIC8vIDExLjIuMSBnYjE4MDMwIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBHQjE4MDMwRGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvLyBnYjE4MDMwJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBnYjE4MDMwIGZpcnN0LCBnYjE4MDMwXG4gICAgLy8gc2Vjb25kLCBhbmQgZ2IxODAzMCB0aGlyZCAoYWxsIGluaXRpYWxseSAweDAwKS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIGdiMTgwMzBfZmlyc3QgPSAweDAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gZ2IxODAzMF9zZWNvbmQgPSAweDAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gZ2IxODAzMF90aGlyZCA9IDB4MDA7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGdiMTgwMzAgZmlyc3QsIGdiMTgwMzBcbiAgICAgIC8vIHNlY29uZCwgYW5kIGdiMTgwMzAgdGhpcmQgYXJlIDB4MDAsIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGdiMTgwMzBfZmlyc3QgPT09IDB4MDAgJiZcbiAgICAgICAgICBnYjE4MDMwX3NlY29uZCA9PT0gMHgwMCAmJiBnYjE4MDMwX3RoaXJkID09PSAweDAwKSB7XG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgIH1cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSwgYW5kIGdiMTgwMzAgZmlyc3QsIGdiMTgwMzBcbiAgICAgIC8vIHNlY29uZCwgb3IgZ2IxODAzMCB0aGlyZCBpcyBub3QgMHgwMCwgc2V0IGdiMTgwMzAgZmlyc3QsXG4gICAgICAvLyBnYjE4MDMwIHNlY29uZCwgYW5kIGdiMTgwMzAgdGhpcmQgdG8gMHgwMCwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmXG4gICAgICAgICAgKGdiMTgwMzBfZmlyc3QgIT09IDB4MDAgfHwgZ2IxODAzMF9zZWNvbmQgIT09IDB4MDAgfHxcbiAgICAgICAgICAgZ2IxODAzMF90aGlyZCAhPT0gMHgwMCkpIHtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG4gICAgICAgIGdiMTgwMzBfc2Vjb25kID0gMHgwMDtcbiAgICAgICAgZ2IxODAzMF90aGlyZCA9IDB4MDA7XG4gICAgICAgIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG4gICAgICB2YXIgY29kZV9wb2ludDtcbiAgICAgIC8vIDMuIElmIGdiMTgwMzAgdGhpcmQgaXMgbm90IDB4MDAsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChnYjE4MDMwX3RoaXJkICE9PSAweDAwKSB7XG4gICAgICAgIC8vIDEuIExldCBjb2RlIHBvaW50IGJlIG51bGwuXG4gICAgICAgIGNvZGVfcG9pbnQgPSBudWxsO1xuICAgICAgICAvLyAyLiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweDMwIHRvIDB4MzksIGluY2x1c2l2ZSwgc2V0XG4gICAgICAgIC8vIGNvZGUgcG9pbnQgdG8gdGhlIGluZGV4IGdiMTgwMzAgcmFuZ2VzIGNvZGUgcG9pbnQgZm9yXG4gICAgICAgIC8vICgoKGdiMTgwMzAgZmlyc3Qg4oiSIDB4ODEpIMOXIDEwICsgZ2IxODAzMCBzZWNvbmQg4oiSIDB4MzApIMOXXG4gICAgICAgIC8vIDEyNiArIGdiMTgwMzAgdGhpcmQg4oiSIDB4ODEpIMOXIDEwICsgYnl0ZSDiiJIgMHgzMC5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgzMCwgMHgzOSkpIHtcbiAgICAgICAgICBjb2RlX3BvaW50ID0gaW5kZXhHQjE4MDMwUmFuZ2VzQ29kZVBvaW50Rm9yKFxuICAgICAgICAgICAgICAoKChnYjE4MDMwX2ZpcnN0IC0gMHg4MSkgKiAxMCArIGdiMTgwMzBfc2Vjb25kIC0gMHgzMCkgKiAxMjYgK1xuICAgICAgICAgICAgICAgZ2IxODAzMF90aGlyZCAtIDB4ODEpICogMTAgKyBiaXRlIC0gMHgzMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBMZXQgYnVmZmVyIGJlIGEgYnl0ZSBzZXF1ZW5jZSBjb25zaXN0aW5nIG9mIGdiMTgwMzBcbiAgICAgICAgLy8gc2Vjb25kLCBnYjE4MDMwIHRoaXJkLCBhbmQgYnl0ZSwgaW4gb3JkZXIuXG4gICAgICAgIHZhciBidWZmZXIgPSBbZ2IxODAzMF9zZWNvbmQsIGdiMTgwMzBfdGhpcmQsIGJpdGVdO1xuXG4gICAgICAgIC8vIDQuIFNldCBnYjE4MDMwIGZpcnN0LCBnYjE4MDMwIHNlY29uZCwgYW5kIGdiMTgwMzAgdGhpcmQgdG9cbiAgICAgICAgLy8gMHgwMC5cbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG4gICAgICAgIGdiMTgwMzBfc2Vjb25kID0gMHgwMDtcbiAgICAgICAgZ2IxODAzMF90aGlyZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gNS4gSWYgY29kZSBwb2ludCBpcyBudWxsLCBwcmVwZW5kIGJ1ZmZlciB0byBzdHJlYW0gYW5kXG4gICAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChidWZmZXIpO1xuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZ2IxODAzMCBzZWNvbmQgaXMgbm90IDB4MDAsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChnYjE4MDMwX3NlY29uZCAhPT0gMHgwMCkge1xuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCB0aGlyZCB0byBieXRlIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4ODEsIDB4RkUpKSB7XG4gICAgICAgICAgZ2IxODAzMF90aGlyZCA9IGJpdGU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBQcmVwZW5kIGdiMTgwMzAgc2Vjb25kIGZvbGxvd2VkIGJ5IGJ5dGUgdG8gc3RyZWFtLCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCBmaXJzdCBhbmQgZ2IxODAzMCBzZWNvbmQgdG8gMHgwMCwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgICAgc3RyZWFtLnByZXBlbmQoW2diMTgwMzBfc2Vjb25kLCBiaXRlXSk7XG4gICAgICAgIGdiMTgwMzBfZmlyc3QgPSAweDAwO1xuICAgICAgICBnYjE4MDMwX3NlY29uZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBJZiBnYjE4MDMwIGZpcnN0IGlzIG5vdCAweDAwLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICBpZiAoZ2IxODAzMF9maXJzdCAhPT0gMHgwMCkge1xuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4MzAgdG8gMHgzOSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCBzZWNvbmQgdG8gYnl0ZSBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDMwLCAweDM5KSkge1xuICAgICAgICAgIGdiMTgwMzBfc2Vjb25kID0gYml0ZTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIExldCBsZWFkIGJlIGdiMTgwMzAgZmlyc3QsIGxldCBwb2ludGVyIGJlIG51bGwsIGFuZCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCBmaXJzdCB0byAweDAwLlxuICAgICAgICB2YXIgbGVhZCA9IGdiMTgwMzBfZmlyc3Q7XG4gICAgICAgIHZhciBwb2ludGVyID0gbnVsbDtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMy4gTGV0IG9mZnNldCBiZSAweDQwIGlmIGJ5dGUgaXMgbGVzcyB0aGFuIDB4N0YgYW5kIDB4NDFcbiAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgb2Zmc2V0ID0gYml0ZSA8IDB4N0YgPyAweDQwIDogMHg0MTtcblxuICAgICAgICAvLyA0LiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweDQwIHRvIDB4N0UsIGluY2x1c2l2ZSwgb3IgMHg4MFxuICAgICAgICAvLyB0byAweEZFLCBpbmNsdXNpdmUsIHNldCBwb2ludGVyIHRvIChsZWFkIOKIkiAweDgxKSDDlyAxOTAgK1xuICAgICAgICAvLyAoYnl0ZSDiiJIgb2Zmc2V0KS5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg0MCwgMHg3RSkgfHwgaW5SYW5nZShiaXRlLCAweDgwLCAweEZFKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSAweDgxKSAqIDE5MCArIChiaXRlIC0gb2Zmc2V0KTtcblxuICAgICAgICAvLyA1LiBMZXQgY29kZSBwb2ludCBiZSBudWxsIGlmIHBvaW50ZXIgaXMgbnVsbCBhbmQgdGhlIGluZGV4XG4gICAgICAgIC8vIGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggZ2IxODAzMCBvdGhlcndpc2UuXG4gICAgICAgIGNvZGVfcG9pbnQgPSBwb2ludGVyID09PSBudWxsID8gbnVsbCA6XG4gICAgICAgICAgICBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnZ2IxODAzMCcpKTtcblxuICAgICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNy4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDguIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDcuIElmIGJ5dGUgaXMgMHg4MCwgcmV0dXJuIGNvZGUgcG9pbnQgVSsyMEFDLlxuICAgICAgaWYgKGJpdGUgPT09IDB4ODApXG4gICAgICAgIHJldHVybiAweDIwQUM7XG5cbiAgICAgIC8vIDguIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgIC8vIGdiMTgwMzAgZmlyc3QgdG8gYnl0ZSBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg4MSwgMHhGRSkpIHtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA5LiBSZXR1cm4gZXJyb3IuXG4gICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTEuMi4yIGdiMTgwMzAgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2JrX2ZsYWdcbiAgICovXG4gIGZ1bmN0aW9uIEdCMTgwMzBFbmNvZGVyKG9wdGlvbnMsIGdia19mbGFnKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvLyBnYjE4MDMwJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBnYmsgZmxhZyAoaW5pdGlhbGx5IHVuc2V0KS5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gSWYgY29kZSBwb2ludCBpcyBVK0U1RTUsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHhFNUU1KVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA0LiBJZiB0aGUgZ2JrIGZsYWcgaXMgc2V0IGFuZCBjb2RlIHBvaW50IGlzIFUrMjBBQywgcmV0dXJuXG4gICAgICAvLyBieXRlIDB4ODAuXG4gICAgICBpZiAoZ2JrX2ZsYWcgJiYgY29kZV9wb2ludCA9PT0gMHgyMEFDKVxuICAgICAgICByZXR1cm4gMHg4MDtcblxuICAgICAgLy8gNS4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXhcbiAgICAgIC8vIGdiMTgwMzAuXG4gICAgICB2YXIgcG9pbnRlciA9IGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleCgnZ2IxODAzMCcpKTtcblxuICAgICAgLy8gNi4gSWYgcG9pbnRlciBpcyBub3QgbnVsbCwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKHBvaW50ZXIgIT09IG51bGwpIHtcblxuICAgICAgICAvLyAxLiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gMTkwKSArIDB4ODEuXG4gICAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE5MCkgKyAweDgxO1xuXG4gICAgICAgIC8vIDIuIExldCB0cmFpbCBiZSBwb2ludGVyICUgMTkwLlxuICAgICAgICB2YXIgdHJhaWwgPSBwb2ludGVyICUgMTkwO1xuXG4gICAgICAgIC8vIDMuIExldCBvZmZzZXQgYmUgMHg0MCBpZiB0cmFpbCBpcyBsZXNzIHRoYW4gMHgzRiBhbmQgMHg0MSBvdGhlcndpc2UuXG4gICAgICAgIHZhciBvZmZzZXQgPSB0cmFpbCA8IDB4M0YgPyAweDQwIDogMHg0MTtcblxuICAgICAgICAvLyA0LiBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwgKyBvZmZzZXQuXG4gICAgICAgIHJldHVybiBbbGVhZCwgdHJhaWwgKyBvZmZzZXRdO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBJZiBnYmsgZmxhZyBpcyBzZXQsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoZ2JrX2ZsYWcpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDguIFNldCBwb2ludGVyIHRvIHRoZSBpbmRleCBnYjE4MDMwIHJhbmdlcyBwb2ludGVyIGZvciBjb2RlXG4gICAgICAvLyBwb2ludC5cbiAgICAgIHBvaW50ZXIgPSBpbmRleEdCMTgwMzBSYW5nZXNQb2ludGVyRm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA5LiBMZXQgYnl0ZTEgYmUgZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2IC8gMTApLlxuICAgICAgdmFyIGJ5dGUxID0gZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2IC8gMTApO1xuXG4gICAgICAvLyAxMC4gU2V0IHBvaW50ZXIgdG8gcG9pbnRlciDiiJIgYnl0ZTEgw5cgMTAgw5cgMTI2IMOXIDEwLlxuICAgICAgcG9pbnRlciA9IHBvaW50ZXIgLSBieXRlMSAqIDEwICogMTI2ICogMTA7XG5cbiAgICAgIC8vIDExLiBMZXQgYnl0ZTIgYmUgZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2KS5cbiAgICAgIHZhciBieXRlMiA9IGZsb29yKHBvaW50ZXIgLyAxMCAvIDEyNik7XG5cbiAgICAgIC8vIDEyLiBTZXQgcG9pbnRlciB0byBwb2ludGVyIOKIkiBieXRlMiDDlyAxMCDDlyAxMjYuXG4gICAgICBwb2ludGVyID0gcG9pbnRlciAtIGJ5dGUyICogMTAgKiAxMjY7XG5cbiAgICAgIC8vIDEzLiBMZXQgYnl0ZTMgYmUgZmxvb3IocG9pbnRlciAvIDEwKS5cbiAgICAgIHZhciBieXRlMyA9IGZsb29yKHBvaW50ZXIgLyAxMCk7XG5cbiAgICAgIC8vIDE0LiBMZXQgYnl0ZTQgYmUgcG9pbnRlciDiiJIgYnl0ZTMgw5cgMTAuXG4gICAgICB2YXIgYnl0ZTQgPSBwb2ludGVyIC0gYnl0ZTMgKiAxMDtcblxuICAgICAgLy8gMTUuIFJldHVybiBmb3VyIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgYnl0ZTEgKyAweDgxLCBieXRlMiArXG4gICAgICAvLyAweDMwLCBieXRlMyArIDB4ODEsIGJ5dGU0ICsgMHgzMC5cbiAgICAgIHJldHVybiBbYnl0ZTEgKyAweDgxLFxuICAgICAgICAgICAgICBieXRlMiArIDB4MzAsXG4gICAgICAgICAgICAgIGJ5dGUzICsgMHg4MSxcbiAgICAgICAgICAgICAgYnl0ZTQgKyAweDMwXTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snZ2IxODAzMCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR0IxODAzMEVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ2diMTgwMzAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdCMTgwMzBEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG5cbiAgLy9cbiAgLy8gMTIuIExlZ2FjeSBtdWx0aS1ieXRlIENoaW5lc2UgKHRyYWRpdGlvbmFsKSBlbmNvZGluZ3NcbiAgLy9cblxuICAvLyAxMi4xIEJpZzVcblxuICAvLyAxMi4xLjEgQmlnNSBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gQmlnNURlY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLy8gQmlnNSdzIGRlY29kZXIgaGFzIGFuIGFzc29jaWF0ZWQgQmlnNSBsZWFkIChpbml0aWFsbHkgMHgwMCkuXG4gICAgdmFyIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBCaWc1X2xlYWQgPSAweDAwO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIEJpZzUgbGVhZCBpcyBub3QgMHgwMCwgc2V0XG4gICAgICAvLyBCaWc1IGxlYWQgdG8gMHgwMCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgQmlnNV9sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIEJpZzVfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIEJpZzUgbGVhZCBpcyAweDAwLCByZXR1cm5cbiAgICAgIC8vIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgQmlnNV9sZWFkID09PSAweDAwKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDMuIElmIEJpZzUgbGVhZCBpcyBub3QgMHgwMCwgbGV0IGxlYWQgYmUgQmlnNSBsZWFkLCBsZXRcbiAgICAgIC8vIHBvaW50ZXIgYmUgbnVsbCwgc2V0IEJpZzUgbGVhZCB0byAweDAwLCBhbmQgdGhlbiBydW4gdGhlc2VcbiAgICAgIC8vIHN1YnN0ZXBzOlxuICAgICAgaWYgKEJpZzVfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICB2YXIgbGVhZCA9IEJpZzVfbGVhZDtcbiAgICAgICAgdmFyIHBvaW50ZXIgPSBudWxsO1xuICAgICAgICBCaWc1X2xlYWQgPSAweDAwO1xuXG4gICAgICAgIC8vIDEuIExldCBvZmZzZXQgYmUgMHg0MCBpZiBieXRlIGlzIGxlc3MgdGhhbiAweDdGIGFuZCAweDYyXG4gICAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIG9mZnNldCA9IGJpdGUgPCAweDdGID8gMHg0MCA6IDB4NjI7XG5cbiAgICAgICAgLy8gMi4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg0MCB0byAweDdFLCBpbmNsdXNpdmUsIG9yIDB4QTFcbiAgICAgICAgLy8gdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXQgcG9pbnRlciB0byAobGVhZCDiiJIgMHg4MSkgw5cgMTU3ICtcbiAgICAgICAgLy8gKGJ5dGUg4oiSIG9mZnNldCkuXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4NDAsIDB4N0UpIHx8IGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhGRSkpXG4gICAgICAgICAgcG9pbnRlciA9IChsZWFkIC0gMHg4MSkgKiAxNTcgKyAoYml0ZSAtIG9mZnNldCk7XG5cbiAgICAgICAgLy8gMy4gSWYgdGhlcmUgaXMgYSByb3cgaW4gdGhlIHRhYmxlIGJlbG93IHdob3NlIGZpcnN0IGNvbHVtblxuICAgICAgICAvLyBpcyBwb2ludGVyLCByZXR1cm4gdGhlIHR3byBjb2RlIHBvaW50cyBsaXN0ZWQgaW4gaXRzIHNlY29uZFxuICAgICAgICAvLyBjb2x1bW5cbiAgICAgICAgLy8gUG9pbnRlciB8IENvZGUgcG9pbnRzXG4gICAgICAgIC8vIC0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIDExMzMgICAgfCBVKzAwQ0EgVSswMzA0XG4gICAgICAgIC8vIDExMzUgICAgfCBVKzAwQ0EgVSswMzBDXG4gICAgICAgIC8vIDExNjQgICAgfCBVKzAwRUEgVSswMzA0XG4gICAgICAgIC8vIDExNjYgICAgfCBVKzAwRUEgVSswMzBDXG4gICAgICAgIHN3aXRjaCAocG9pbnRlcikge1xuICAgICAgICAgIGNhc2UgMTEzMzogcmV0dXJuIFsweDAwQ0EsIDB4MDMwNF07XG4gICAgICAgICAgY2FzZSAxMTM1OiByZXR1cm4gWzB4MDBDQSwgMHgwMzBDXTtcbiAgICAgICAgICBjYXNlIDExNjQ6IHJldHVybiBbMHgwMEVBLCAweDAzMDRdO1xuICAgICAgICAgIGNhc2UgMTE2NjogcmV0dXJuIFsweDAwRUEsIDB4MDMwQ107XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiBMZXQgY29kZSBwb2ludCBiZSBudWxsIGlmIHBvaW50ZXIgaXMgbnVsbCBhbmQgdGhlIGluZGV4XG4gICAgICAgIC8vIGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggQmlnNSBvdGhlcndpc2UuXG4gICAgICAgIHZhciBjb2RlX3BvaW50ID0gKHBvaW50ZXIgPT09IG51bGwpID8gbnVsbCA6XG4gICAgICAgICAgICBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnYmlnNScpKTtcblxuICAgICAgICAvLyA1LiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNi4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDcuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDUuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXQgQmlnNVxuICAgICAgLy8gbGVhZCB0byBieXRlIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDgxLCAweEZFKSkge1xuICAgICAgICBCaWc1X2xlYWQgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gUmV0dXJuIGVycm9yLlxuICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDEyLjEuMiBCaWc1IGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBCaWc1RW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IEJpZzUgcG9pbnRlciBmb3IgY29kZSBwb2ludC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhCaWc1UG9pbnRlckZvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gNC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDUuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyAxNTcpICsgMHg4MS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE1NykgKyAweDgxO1xuXG4gICAgICAvLyA2LiBJZiBsZWFkIGlzIGxlc3MgdGhhbiAweEExLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKGxlYWQgPCAweEExKVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA3LiBMZXQgdHJhaWwgYmUgcG9pbnRlciAlIDE1Ny5cbiAgICAgIHZhciB0cmFpbCA9IHBvaW50ZXIgJSAxNTc7XG5cbiAgICAgIC8vIDguIExldCBvZmZzZXQgYmUgMHg0MCBpZiB0cmFpbCBpcyBsZXNzIHRoYW4gMHgzRiBhbmQgMHg2MlxuICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgdmFyIG9mZnNldCA9IHRyYWlsIDwgMHgzRiA/IDB4NDAgOiAweDYyO1xuXG4gICAgICAvLyBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwgKyBvZmZzZXQuXG4gICAgICByZXR1cm4gW2xlYWQsIHRyYWlsICsgb2Zmc2V0XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snQmlnNSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgQmlnNUVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0JpZzUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEJpZzVEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG5cbiAgLy9cbiAgLy8gMTMuIExlZ2FjeSBtdWx0aS1ieXRlIEphcGFuZXNlIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDEzLjEgZXVjLWpwXG5cbiAgLy8gMTMuMS4xIGV1Yy1qcCBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gRVVDSlBEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuXG4gICAgLy8gZXVjLWpwJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBldWMtanAgamlzMDIxMiBmbGFnXG4gICAgLy8gKGluaXRpYWxseSB1bnNldCkgYW5kIGV1Yy1qcCBsZWFkIChpbml0aWFsbHkgMHgwMCkuXG4gICAgdmFyIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8gZXVjanBfamlzMDIxMl9mbGFnID0gZmFsc2UsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBldWNqcF9sZWFkID0gMHgwMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBldWMtanAgbGVhZCBpcyBub3QgMHgwMCwgc2V0XG4gICAgICAvLyBldWMtanAgbGVhZCB0byAweDAwLCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgZXVjanBfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICBldWNqcF9sZWFkID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZXVjLWpwIGxlYWQgaXMgMHgwMCwgcmV0dXJuXG4gICAgICAvLyBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGV1Y2pwX2xlYWQgPT09IDB4MDApXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMy4gSWYgZXVjLWpwIGxlYWQgaXMgMHg4RSBhbmQgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHhBMSB0b1xuICAgICAgLy8gMHhERiwgaW5jbHVzaXZlLCBzZXQgZXVjLWpwIGxlYWQgdG8gMHgwMCBhbmQgcmV0dXJuIGEgY29kZVxuICAgICAgLy8gcG9pbnQgd2hvc2UgdmFsdWUgaXMgMHhGRjYxIOKIkiAweEExICsgYnl0ZS5cbiAgICAgIGlmIChldWNqcF9sZWFkID09PSAweDhFICYmIGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhERikpIHtcbiAgICAgICAgZXVjanBfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiAweEZGNjEgLSAweEExICsgYml0ZTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZXVjLWpwIGxlYWQgaXMgMHg4RiBhbmQgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHhBMSB0b1xuICAgICAgLy8gMHhGRSwgaW5jbHVzaXZlLCBzZXQgdGhlIGV1Yy1qcCBqaXMwMjEyIGZsYWcsIHNldCBldWMtanAgbGVhZFxuICAgICAgLy8gdG8gYnl0ZSwgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChldWNqcF9sZWFkID09PSAweDhGICYmIGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhGRSkpIHtcbiAgICAgICAgZXVjanBfamlzMDIxMl9mbGFnID0gdHJ1ZTtcbiAgICAgICAgZXVjanBfbGVhZCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBJZiBldWMtanAgbGVhZCBpcyBub3QgMHgwMCwgbGV0IGxlYWQgYmUgZXVjLWpwIGxlYWQsIHNldFxuICAgICAgLy8gZXVjLWpwIGxlYWQgdG8gMHgwMCwgYW5kIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChldWNqcF9sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIHZhciBsZWFkID0gZXVjanBfbGVhZDtcbiAgICAgICAgZXVjanBfbGVhZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMS4gTGV0IGNvZGUgcG9pbnQgYmUgbnVsbC5cbiAgICAgICAgdmFyIGNvZGVfcG9pbnQgPSBudWxsO1xuXG4gICAgICAgIC8vIDIuIElmIGxlYWQgYW5kIGJ5dGUgYXJlIGJvdGggaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhGRSxcbiAgICAgICAgLy8gaW5jbHVzaXZlLCBzZXQgY29kZSBwb2ludCB0byB0aGUgaW5kZXggY29kZSBwb2ludCBmb3IgKGxlYWRcbiAgICAgICAgLy8g4oiSIDB4QTEpIMOXIDk0ICsgYnl0ZSDiiJIgMHhBMSBpbiBpbmRleCBqaXMwMjA4IGlmIHRoZSBldWMtanBcbiAgICAgICAgLy8gamlzMDIxMiBmbGFnIGlzIHVuc2V0IGFuZCBpbiBpbmRleCBqaXMwMjEyIG90aGVyd2lzZS5cbiAgICAgICAgaWYgKGluUmFuZ2UobGVhZCwgMHhBMSwgMHhGRSkgJiYgaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSkge1xuICAgICAgICAgIGNvZGVfcG9pbnQgPSBpbmRleENvZGVQb2ludEZvcihcbiAgICAgICAgICAgIChsZWFkIC0gMHhBMSkgKiA5NCArIChiaXRlIC0gMHhBMSksXG4gICAgICAgICAgICBpbmRleCghZXVjanBfamlzMDIxMl9mbGFnID8gJ2ppczAyMDgnIDogJ2ppczAyMTInKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBVbnNldCB0aGUgZXVjLWpwIGppczAyMTIgZmxhZy5cbiAgICAgICAgZXVjanBfamlzMDIxMl9mbGFnID0gZmFsc2U7XG5cbiAgICAgICAgLy8gNC4gSWYgYnl0ZSBpcyBub3QgaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhGRSwgaW5jbHVzaXZlLFxuICAgICAgICAvLyBwcmVwZW5kIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBpZiAoIWluUmFuZ2UoYml0ZSwgMHhBMSwgMHhGRSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNS4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDYuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDcuIElmIGJ5dGUgaXMgMHg4RSwgMHg4Riwgb3IgaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhGRSxcbiAgICAgIC8vIGluY2x1c2l2ZSwgc2V0IGV1Yy1qcCBsZWFkIHRvIGJ5dGUgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChiaXRlID09PSAweDhFIHx8IGJpdGUgPT09IDB4OEYgfHwgaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSkge1xuICAgICAgICBldWNqcF9sZWFkID0gYml0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIDguIFJldHVybiBlcnJvci5cbiAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgIH07XG4gIH1cblxuICAvLyAxMy4xLjIgZXVjLWpwIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBFVUNKUEVuY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBJbnB1dCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge1xuICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIHJldHVybiBhIGJ5dGUgd2hvc2VcbiAgICAgIC8vIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgVSswMEE1LCByZXR1cm4gYnl0ZSAweDVDLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MDBBNSlcbiAgICAgICAgcmV0dXJuIDB4NUM7XG5cbiAgICAgIC8vIDQuIElmIGNvZGUgcG9pbnQgaXMgVSsyMDNFLCByZXR1cm4gYnl0ZSAweDdFLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjAzRSlcbiAgICAgICAgcmV0dXJuIDB4N0U7XG5cbiAgICAgIC8vIDUuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrRkY2MSB0byBVK0ZGOUYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSAweDhFIGFuZCBjb2RlIHBvaW50IOKIklxuICAgICAgLy8gMHhGRjYxICsgMHhBMS5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4RkY2MSwgMHhGRjlGKSlcbiAgICAgICAgcmV0dXJuIFsweDhFLCBjb2RlX3BvaW50IC0gMHhGRjYxICsgMHhBMV07XG5cbiAgICAgIC8vIDYuIElmIGNvZGUgcG9pbnQgaXMgVSsyMjEyLCBzZXQgaXQgdG8gVStGRjBELlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjIxMilcbiAgICAgICAgY29kZV9wb2ludCA9IDB4RkYwRDtcblxuICAgICAgLy8gNy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXhcbiAgICAgIC8vIGppczAyMDguXG4gICAgICB2YXIgcG9pbnRlciA9IGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleCgnamlzMDIwOCcpKTtcblxuICAgICAgLy8gOC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDkuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyA5NCkgKyAweEExLlxuICAgICAgdmFyIGxlYWQgPSBmbG9vcihwb2ludGVyIC8gOTQpICsgMHhBMTtcblxuICAgICAgLy8gMTAuIExldCB0cmFpbCBiZSBwb2ludGVyICUgOTQgKyAweEExLlxuICAgICAgdmFyIHRyYWlsID0gcG9pbnRlciAlIDk0ICsgMHhBMTtcblxuICAgICAgLy8gMTEuIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkIGFuZCB0cmFpbC5cbiAgICAgIHJldHVybiBbbGVhZCwgdHJhaWxdO1xuICAgIH07XG4gIH1cblxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydFVUMtSlAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEVVQ0pQRW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snRVVDLUpQJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBFVUNKUERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cbiAgLy8gMTMuMiBpc28tMjAyMi1qcFxuXG4gIC8vIDEzLjIuMSBpc28tMjAyMi1qcCBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gSVNPMjAyMkpQRGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKiogQGVudW0gKi9cbiAgICB2YXIgc3RhdGVzID0ge1xuICAgICAgQVNDSUk6IDAsXG4gICAgICBSb21hbjogMSxcbiAgICAgIEthdGFrYW5hOiAyLFxuICAgICAgTGVhZEJ5dGU6IDMsXG4gICAgICBUcmFpbEJ5dGU6IDQsXG4gICAgICBFc2NhcGVTdGFydDogNSxcbiAgICAgIEVzY2FwZTogNlxuICAgIH07XG4gICAgLy8gaXNvLTIwMjItanAncyBkZWNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGlzby0yMDIyLWpwIGRlY29kZXJcbiAgICAvLyBzdGF0ZSAoaW5pdGlhbGx5IEFTQ0lJKSwgaXNvLTIwMjItanAgZGVjb2RlciBvdXRwdXQgc3RhdGVcbiAgICAvLyAoaW5pdGlhbGx5IEFTQ0lJKSwgaXNvLTIwMjItanAgbGVhZCAoaW5pdGlhbGx5IDB4MDApLCBhbmRcbiAgICAvLyBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyAoaW5pdGlhbGx5IHVuc2V0KS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkFTQ0lJLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX2RlY29kZXJfb3V0cHV0X3N0YXRlID0gc3RhdGVzLkFTQ0lJLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX2xlYWQgPSAweDAwLFxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gc3dpdGNoaW5nIG9uIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGU6XG4gICAgICBzd2l0Y2ggKGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlKSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSBzdGF0ZXMuQVNDSUk6XG4gICAgICAgIC8vIEFTQ0lJXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDAwIHRvIDB4N0YsIGV4Y2x1ZGluZyAweDBFLCAweDBGLCBhbmQgMHgxQlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDAwLCAweDdGKSAmJiBiaXRlICE9PSAweDBFXG4gICAgICAgICAgICAmJiBiaXRlICE9PSAweDBGICYmIGJpdGUgIT09IDB4MUIpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBiaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuUm9tYW46XG4gICAgICAgIC8vIFJvbWFuXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDVDXG4gICAgICAgIGlmIChiaXRlID09PSAweDVDKSB7XG4gICAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gY29kZSBwb2ludFxuICAgICAgICAgIC8vIFUrMDBBNS5cbiAgICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gMHgwMEE1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMHg3RVxuICAgICAgICBpZiAoYml0ZSA9PT0gMHg3RSkge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyBVKzIwM0UuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIDB4MjAzRTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MDAgdG8gMHg3RiwgZXhjbHVkaW5nIDB4MEUsIDB4MEYsIDB4MUIsIDB4NUMsIGFuZCAweDdFXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4MDAsIDB4N0YpICYmIGJpdGUgIT09IDB4MEUgJiYgYml0ZSAhPT0gMHgwRlxuICAgICAgICAgICAgJiYgYml0ZSAhPT0gMHgxQiAmJiBiaXRlICE9PSAweDVDICYmIGJpdGUgIT09IDB4N0UpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBiaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuS2F0YWthbmE6XG4gICAgICAgIC8vIEthdGFrYW5hXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDIxIHRvIDB4NUZcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgyMSwgMHg1RikpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyB3aG9zZSB2YWx1ZSBpcyAweEZGNjEg4oiSIDB4MjEgKyBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiAweEZGNjEgLSAweDIxICsgYml0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZC1vZi1zdHJlYW1cbiAgICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0pIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZmluaXNoZWQuXG4gICAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlXG4gICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgIGNhc2Ugc3RhdGVzLkxlYWRCeXRlOlxuICAgICAgICAvLyBMZWFkIGJ5dGVcbiAgICAgICAgLy8gQmFzZWQgb24gYnl0ZTpcblxuICAgICAgICAvLyAweDFCXG4gICAgICAgIGlmIChiaXRlID09PSAweDFCKSB7XG4gICAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gZXNjYXBlIHN0YXJ0IGFuZCByZXR1cm5cbiAgICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGVTdGFydDtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MjEgdG8gMHg3RVxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDIxLCAweDdFKSkge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZywgc2V0IGlzby0yMDIyLWpwIGxlYWRcbiAgICAgICAgICAvLyB0byBieXRlLCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIHRyYWlsIGJ5dGUsIGFuZFxuICAgICAgICAgIC8vIHJldHVybiBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICBpc28yMDIyanBfbGVhZCA9IGJpdGU7XG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuVHJhaWxCeXRlO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuVHJhaWxCeXRlOlxuICAgICAgICAvLyBUcmFpbCBieXRlXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDIxIHRvIDB4N0VcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgyMSwgMHg3RSkpIHtcbiAgICAgICAgICAvLyAxLiBTZXQgdGhlIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gbGVhZCBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkxlYWRCeXRlO1xuXG4gICAgICAgICAgLy8gMi4gTGV0IHBvaW50ZXIgYmUgKGlzby0yMDIyLWpwIGxlYWQg4oiSIDB4MjEpIMOXIDk0ICsgYnl0ZSDiiJIgMHgyMS5cbiAgICAgICAgICB2YXIgcG9pbnRlciA9IChpc28yMDIyanBfbGVhZCAtIDB4MjEpICogOTQgKyBiaXRlIC0gMHgyMTtcblxuICAgICAgICAgIC8vIDMuIExldCBjb2RlIHBvaW50IGJlIHRoZSBpbmRleCBjb2RlIHBvaW50IGZvciBwb2ludGVyIGluXG4gICAgICAgICAgLy8gaW5kZXggamlzMDIwOC5cbiAgICAgICAgICB2YXIgY29kZV9wb2ludCA9IGluZGV4Q29kZVBvaW50Rm9yKHBvaW50ZXIsIGluZGV4KCdqaXMwMjA4JykpO1xuXG4gICAgICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgICAgIC8vIDUuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZC1vZi1zdHJlYW1cbiAgICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0pIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gbGVhZCBieXRlLCBwcmVwZW5kXG4gICAgICAgICAgLy8gYnl0ZSB0byBzdHJlYW0sIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuTGVhZEJ5dGU7XG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gbGVhZCBieXRlIGFuZCByZXR1cm5cbiAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkxlYWRCeXRlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuRXNjYXBlU3RhcnQ6XG4gICAgICAgIC8vIEVzY2FwZSBzdGFydFxuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZWl0aGVyIDB4MjQgb3IgMHgyOCwgc2V0IGlzby0yMDIyLWpwIGxlYWQgdG9cbiAgICAgICAgLy8gYnl0ZSwgaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZSB0byBlc2NhcGUsIGFuZCByZXR1cm5cbiAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgIGlmIChiaXRlID09PSAweDI0IHx8IGJpdGUgPT09IDB4MjgpIHtcbiAgICAgICAgICBpc28yMDIyanBfbGVhZCA9IGJpdGU7XG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gUHJlcGVuZCBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gMy4gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnLCBzZXQgaXNvLTIwMjItanBcbiAgICAgICAgLy8gZGVjb2RlciBzdGF0ZSB0byBpc28tMjAyMi1qcCBkZWNvZGVyIG91dHB1dCBzdGF0ZSwgYW5kXG4gICAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gaXNvMjAyMmpwX2RlY29kZXJfb3V0cHV0X3N0YXRlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuRXNjYXBlOlxuICAgICAgICAvLyBFc2NhcGVcblxuICAgICAgICAvLyAxLiBMZXQgbGVhZCBiZSBpc28tMjAyMi1qcCBsZWFkIGFuZCBzZXQgaXNvLTIwMjItanAgbGVhZCB0b1xuICAgICAgICAvLyAweDAwLlxuICAgICAgICB2YXIgbGVhZCA9IGlzbzIwMjJqcF9sZWFkO1xuICAgICAgICBpc28yMDIyanBfbGVhZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMi4gTGV0IHN0YXRlIGJlIG51bGwuXG4gICAgICAgIHZhciBzdGF0ZSA9IG51bGw7XG5cbiAgICAgICAgLy8gMy4gSWYgbGVhZCBpcyAweDI4IGFuZCBieXRlIGlzIDB4NDIsIHNldCBzdGF0ZSB0byBBU0NJSS5cbiAgICAgICAgaWYgKGxlYWQgPT09IDB4MjggJiYgYml0ZSA9PT0gMHg0MilcbiAgICAgICAgICBzdGF0ZSA9IHN0YXRlcy5BU0NJSTtcblxuICAgICAgICAvLyA0LiBJZiBsZWFkIGlzIDB4MjggYW5kIGJ5dGUgaXMgMHg0QSwgc2V0IHN0YXRlIHRvIFJvbWFuLlxuICAgICAgICBpZiAobGVhZCA9PT0gMHgyOCAmJiBiaXRlID09PSAweDRBKVxuICAgICAgICAgIHN0YXRlID0gc3RhdGVzLlJvbWFuO1xuXG4gICAgICAgIC8vIDUuIElmIGxlYWQgaXMgMHgyOCBhbmQgYnl0ZSBpcyAweDQ5LCBzZXQgc3RhdGUgdG8gS2F0YWthbmEuXG4gICAgICAgIGlmIChsZWFkID09PSAweDI4ICYmIGJpdGUgPT09IDB4NDkpXG4gICAgICAgICAgc3RhdGUgPSBzdGF0ZXMuS2F0YWthbmE7XG5cbiAgICAgICAgLy8gNi4gSWYgbGVhZCBpcyAweDI0IGFuZCBieXRlIGlzIGVpdGhlciAweDQwIG9yIDB4NDIsIHNldFxuICAgICAgICAvLyBzdGF0ZSB0byBsZWFkIGJ5dGUuXG4gICAgICAgIGlmIChsZWFkID09PSAweDI0ICYmIChiaXRlID09PSAweDQwIHx8IGJpdGUgPT09IDB4NDIpKVxuICAgICAgICAgIHN0YXRlID0gc3RhdGVzLkxlYWRCeXRlO1xuXG4gICAgICAgIC8vIDcuIElmIHN0YXRlIGlzIG5vbi1udWxsLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIDEuIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIGFuZCBpc28tMjAyMi1qcCBkZWNvZGVyXG4gICAgICAgICAgLy8gb3V0cHV0IHN0YXRlIHRvIHN0YXRlcy5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgICAvLyAyLiBMZXQgb3V0cHV0IGZsYWcgYmUgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnLlxuICAgICAgICAgIHZhciBvdXRwdXRfZmxhZyA9IGlzbzIwMjJqcF9vdXRwdXRfZmxhZztcblxuICAgICAgICAgIC8vIDMuIFNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIDQuIFJldHVybiBjb250aW51ZSwgaWYgb3V0cHV0IGZsYWcgaXMgdW5zZXQsIGFuZCBlcnJvclxuICAgICAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgICAgICByZXR1cm4gIW91dHB1dF9mbGFnID8gbnVsbCA6IGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA4LiBQcmVwZW5kIGxlYWQgYW5kIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBzdHJlYW0ucHJlcGVuZChbbGVhZCwgYml0ZV0pO1xuXG4gICAgICAgIC8vIDkuIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZywgc2V0IGlzby0yMDIyLWpwXG4gICAgICAgIC8vIGRlY29kZXIgc3RhdGUgdG8gaXNvLTIwMjItanAgZGVjb2RlciBvdXRwdXQgc3RhdGUgYW5kXG4gICAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gaXNvMjAyMmpwX2RlY29kZXJfb3V0cHV0X3N0YXRlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gMTMuMi4yIGlzby0yMDIyLWpwIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBJU08yMDIySlBFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8vIGlzby0yMDIyLWpwJ3MgZW5jb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBpc28tMjAyMi1qcCBlbmNvZGVyXG4gICAgLy8gc3RhdGUgd2hpY2ggaXMgb25lIG9mIEFTQ0lJLCBSb21hbiwgYW5kIGppczAyMDggKGluaXRpYWxseVxuICAgIC8vIEFTQ0lJKS5cbiAgICAvKiogQGVudW0gKi9cbiAgICB2YXIgc3RhdGVzID0ge1xuICAgICAgQVNDSUk6IDAsXG4gICAgICBSb21hbjogMSxcbiAgICAgIGppczAyMDg6IDJcbiAgICB9O1xuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLkFTQ0lJO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSBhbmQgaXNvLTIwMjItanAgZW5jb2RlclxuICAgICAgLy8gc3RhdGUgaXMgbm90IEFTQ0lJLCBwcmVwZW5kIGNvZGUgcG9pbnQgdG8gc3RyZWFtLCBzZXRcbiAgICAgIC8vIGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgdG8gQVNDSUksIGFuZCByZXR1cm4gdGhyZWUgYnl0ZXNcbiAgICAgIC8vIDB4MUIgMHgyOCAweDQyLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0gJiZcbiAgICAgICAgICBpc28yMDIyanBfc3RhdGUgIT09IHN0YXRlcy5BU0NJSSkge1xuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb2RlX3BvaW50KTtcbiAgICAgICAgaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLkFTQ0lJO1xuICAgICAgICByZXR1cm4gWzB4MUIsIDB4MjgsIDB4NDJdO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0gYW5kIGlzby0yMDIyLWpwIGVuY29kZXJcbiAgICAgIC8vIHN0YXRlIGlzIEFTQ0lJLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSAmJiBpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5BU0NJSSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAzLiBJZiBJU08tMjAyMi1KUCBlbmNvZGVyIHN0YXRlIGlzIEFTQ0lJIG9yIFJvbWFuLCBhbmQgY29kZVxuICAgICAgLy8gcG9pbnQgaXMgVSswMDBFLCBVKzAwMEYsIG9yIFUrMDAxQiwgcmV0dXJuIGVycm9yIHdpdGggVStGRkZELlxuICAgICAgaWYgKChpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5BU0NJSSB8fFxuICAgICAgICAgICBpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5Sb21hbikgJiZcbiAgICAgICAgICAoY29kZV9wb2ludCA9PT0gMHgwMDBFIHx8IGNvZGVfcG9pbnQgPT09IDB4MDAwRiB8fFxuICAgICAgICAgICBjb2RlX3BvaW50ID09PSAweDAwMUIpKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoMHhGRkZEKTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSBpcyBBU0NJSSBhbmQgY29kZSBwb2ludCBpcyBhblxuICAgICAgLy8gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzbzIwMjJqcF9zdGF0ZSA9PT0gc3RhdGVzLkFTQ0lJICYmXG4gICAgICAgICAgaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDUuIElmIGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgaXMgUm9tYW4gYW5kIGNvZGUgcG9pbnQgaXMgYW5cbiAgICAgIC8vIEFTQ0lJIGNvZGUgcG9pbnQsIGV4Y2x1ZGluZyBVKzAwNUMgYW5kIFUrMDA3RSwgb3IgaXMgVSswMEE1XG4gICAgICAvLyBvciBVKzIwM0UsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5Sb21hbiAmJlxuICAgICAgICAgICgoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSAmJlxuICAgICAgICAgICBjb2RlX3BvaW50ICE9PSAweDAwNUMgJiYgY29kZV9wb2ludCAhPT0gMHgwMDdFKSB8fFxuICAgICAgICAgIChjb2RlX3BvaW50ID09IDB4MDBBNSB8fCBjb2RlX3BvaW50ID09IDB4MjAzRSkpKSB7XG5cbiAgICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlXG4gICAgICAgIC8vIHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgVSswMEE1LCByZXR1cm4gYnl0ZSAweDVDLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgwMEE1KVxuICAgICAgICAgIHJldHVybiAweDVDO1xuXG4gICAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgVSsyMDNFLCByZXR1cm4gYnl0ZSAweDdFLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMDNFKVxuICAgICAgICAgIHJldHVybiAweDdFO1xuICAgICAgfVxuXG4gICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIGFuZCBpc28tMjAyMi1qcFxuICAgICAgLy8gZW5jb2RlciBzdGF0ZSBpcyBub3QgQVNDSUksIHByZXBlbmQgY29kZSBwb2ludCB0byBzdHJlYW0sIHNldFxuICAgICAgLy8gaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSB0byBBU0NJSSwgYW5kIHJldHVybiB0aHJlZSBieXRlc1xuICAgICAgLy8gMHgxQiAweDI4IDB4NDIuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSAmJlxuICAgICAgICAgIGlzbzIwMjJqcF9zdGF0ZSAhPT0gc3RhdGVzLkFTQ0lJKSB7XG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGNvZGVfcG9pbnQpO1xuICAgICAgICBpc28yMDIyanBfc3RhdGUgPSBzdGF0ZXMuQVNDSUk7XG4gICAgICAgIHJldHVybiBbMHgxQiwgMHgyOCwgMHg0Ml07XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIElmIGNvZGUgcG9pbnQgaXMgZWl0aGVyIFUrMDBBNSBvciBVKzIwM0UsIGFuZCBpc28tMjAyMi1qcFxuICAgICAgLy8gZW5jb2RlciBzdGF0ZSBpcyBub3QgUm9tYW4sIHByZXBlbmQgY29kZSBwb2ludCB0byBzdHJlYW0sIHNldFxuICAgICAgLy8gaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSB0byBSb21hbiwgYW5kIHJldHVybiB0aHJlZSBieXRlc1xuICAgICAgLy8gMHgxQiAweDI4IDB4NEEuXG4gICAgICBpZiAoKGNvZGVfcG9pbnQgPT09IDB4MDBBNSB8fCBjb2RlX3BvaW50ID09PSAweDIwM0UpICYmXG4gICAgICAgICAgaXNvMjAyMmpwX3N0YXRlICE9PSBzdGF0ZXMuUm9tYW4pIHtcbiAgICAgICAgc3RyZWFtLnByZXBlbmQoY29kZV9wb2ludCk7XG4gICAgICAgIGlzbzIwMjJqcF9zdGF0ZSA9IHN0YXRlcy5Sb21hbjtcbiAgICAgICAgcmV0dXJuIFsweDFCLCAweDI4LCAweDRBXTtcbiAgICAgIH1cblxuICAgICAgLy8gOC4gSWYgY29kZSBwb2ludCBpcyBVKzIyMTIsIHNldCBpdCB0byBVK0ZGMEQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMjEyKVxuICAgICAgICBjb2RlX3BvaW50ID0gMHhGRjBEO1xuXG4gICAgICAvLyA5LiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gamlzMDIwOC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KCdqaXMwMjA4JykpO1xuXG4gICAgICAvLyAxMC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDExLiBJZiBpc28tMjAyMi1qcCBlbmNvZGVyIHN0YXRlIGlzIG5vdCBqaXMwMjA4LCBwcmVwZW5kIGNvZGVcbiAgICAgIC8vIHBvaW50IHRvIHN0cmVhbSwgc2V0IGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgdG8gamlzMDIwOCxcbiAgICAgIC8vIGFuZCByZXR1cm4gdGhyZWUgYnl0ZXMgMHgxQiAweDI0IDB4NDIuXG4gICAgICBpZiAoaXNvMjAyMmpwX3N0YXRlICE9PSBzdGF0ZXMuamlzMDIwOCkge1xuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb2RlX3BvaW50KTtcbiAgICAgICAgaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLmppczAyMDg7XG4gICAgICAgIHJldHVybiBbMHgxQiwgMHgyNCwgMHg0Ml07XG4gICAgICB9XG5cbiAgICAgIC8vIDEyLiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gOTQpICsgMHgyMS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDk0KSArIDB4MjE7XG5cbiAgICAgIC8vIDEzLiBMZXQgdHJhaWwgYmUgcG9pbnRlciAlIDk0ICsgMHgyMS5cbiAgICAgIHZhciB0cmFpbCA9IHBvaW50ZXIgJSA5NCArIDB4MjE7XG5cbiAgICAgIC8vIDE0LiBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwuXG4gICAgICByZXR1cm4gW2xlYWQsIHRyYWlsXTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snSVNPLTIwMjItSlAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IElTTzIwMjJKUEVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0lTTy0yMDIyLUpQJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBJU08yMDIySlBEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIDEzLjMgU2hpZnRfSklTXG5cbiAgLy8gMTMuMy4xIFNoaWZ0X0pJUyBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2hpZnRKSVNEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8vIFNoaWZ0X0pJUydzIGRlY29kZXIgaGFzIGFuIGFzc29jaWF0ZWQgU2hpZnRfSklTIGxlYWQgKGluaXRpYWxseVxuICAgIC8vIDB4MDApLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gU2hpZnRfSklTX2xlYWQgPSAweDAwO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBTaGlmdF9KSVMgbGVhZCBpcyBub3QgMHgwMCxcbiAgICAgIC8vIHNldCBTaGlmdF9KSVMgbGVhZCB0byAweDAwIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBTaGlmdF9KSVNfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICBTaGlmdF9KSVNfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIFNoaWZ0X0pJUyBsZWFkIGlzIDB4MDAsXG4gICAgICAvLyByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBTaGlmdF9KSVNfbGVhZCA9PT0gMHgwMClcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAzLiBJZiBTaGlmdF9KSVMgbGVhZCBpcyBub3QgMHgwMCwgbGV0IGxlYWQgYmUgU2hpZnRfSklTIGxlYWQsXG4gICAgICAvLyBsZXQgcG9pbnRlciBiZSBudWxsLCBzZXQgU2hpZnRfSklTIGxlYWQgdG8gMHgwMCwgYW5kIHRoZW4gcnVuXG4gICAgICAvLyB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChTaGlmdF9KSVNfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICB2YXIgbGVhZCA9IFNoaWZ0X0pJU19sZWFkO1xuICAgICAgICB2YXIgcG9pbnRlciA9IG51bGw7XG4gICAgICAgIFNoaWZ0X0pJU19sZWFkID0gMHgwMDtcblxuICAgICAgICAvLyAxLiBMZXQgb2Zmc2V0IGJlIDB4NDAsIGlmIGJ5dGUgaXMgbGVzcyB0aGFuIDB4N0YsIGFuZCAweDQxXG4gICAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIG9mZnNldCA9IChiaXRlIDwgMHg3RikgPyAweDQwIDogMHg0MTtcblxuICAgICAgICAvLyAyLiBMZXQgbGVhZCBvZmZzZXQgYmUgMHg4MSwgaWYgbGVhZCBpcyBsZXNzIHRoYW4gMHhBMCwgYW5kXG4gICAgICAgIC8vIDB4QzEgb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgbGVhZF9vZmZzZXQgPSAobGVhZCA8IDB4QTApID8gMHg4MSA6IDB4QzE7XG5cbiAgICAgICAgLy8gMy4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg0MCB0byAweDdFLCBpbmNsdXNpdmUsIG9yIDB4ODBcbiAgICAgICAgLy8gdG8gMHhGQywgaW5jbHVzaXZlLCBzZXQgcG9pbnRlciB0byAobGVhZCDiiJIgbGVhZCBvZmZzZXQpIMOXXG4gICAgICAgIC8vIDE4OCArIGJ5dGUg4oiSIG9mZnNldC5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg0MCwgMHg3RSkgfHwgaW5SYW5nZShiaXRlLCAweDgwLCAweEZDKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSBsZWFkX29mZnNldCkgKiAxODggKyBiaXRlIC0gb2Zmc2V0O1xuXG4gICAgICAgIC8vIDQuIElmIHBvaW50ZXIgaXMgaW4gdGhlIHJhbmdlIDg4MzYgdG8gMTA3MTUsIGluY2x1c2l2ZSxcbiAgICAgICAgLy8gcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyAweEUwMDAg4oiSIDg4MzYgKyBwb2ludGVyLlxuICAgICAgICBpZiAoaW5SYW5nZShwb2ludGVyLCA4ODM2LCAxMDcxNSkpXG4gICAgICAgICAgcmV0dXJuIDB4RTAwMCAtIDg4MzYgKyBwb2ludGVyO1xuXG4gICAgICAgIC8vIDUuIExldCBjb2RlIHBvaW50IGJlIG51bGwsIGlmIHBvaW50ZXIgaXMgbnVsbCwgYW5kIHRoZVxuICAgICAgICAvLyBpbmRleCBjb2RlIHBvaW50IGZvciBwb2ludGVyIGluIGluZGV4IGppczAyMDggb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgY29kZV9wb2ludCA9IChwb2ludGVyID09PSBudWxsKSA/IG51bGwgOlxuICAgICAgICAgICAgICBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnamlzMDIwOCcpKTtcblxuICAgICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNy4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDguIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSBvciAweDgwLCByZXR1cm4gYSBjb2RlIHBvaW50XG4gICAgICAvLyB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgaWYgKGlzQVNDSUlCeXRlKGJpdGUpIHx8IGJpdGUgPT09IDB4ODApXG4gICAgICAgIHJldHVybiBiaXRlO1xuXG4gICAgICAvLyA1LiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweEExIHRvIDB4REYsIGluY2x1c2l2ZSwgcmV0dXJuIGFcbiAgICAgIC8vIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgMHhGRjYxIOKIkiAweEExICsgYnl0ZS5cbiAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4QTEsIDB4REYpKVxuICAgICAgICByZXR1cm4gMHhGRjYxIC0gMHhBMSArIGJpdGU7XG5cbiAgICAgIC8vIDYuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHg5RiwgaW5jbHVzaXZlLCBvciAweEUwXG4gICAgICAvLyB0byAweEZDLCBpbmNsdXNpdmUsIHNldCBTaGlmdF9KSVMgbGVhZCB0byBieXRlIGFuZCByZXR1cm5cbiAgICAgIC8vIGNvbnRpbnVlLlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg4MSwgMHg5RikgfHwgaW5SYW5nZShiaXRlLCAweEUwLCAweEZDKSkge1xuICAgICAgICBTaGlmdF9KSVNfbGVhZCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBSZXR1cm4gZXJyb3IuXG4gICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTMuMy4yIFNoaWZ0X0pJUyBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2hpZnRKSVNFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50IG9yIFUrMDA4MCwgcmV0dXJuIGFcbiAgICAgIC8vIGJ5dGUgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpIHx8IGNvZGVfcG9pbnQgPT09IDB4MDA4MClcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgVSswMEE1LCByZXR1cm4gYnl0ZSAweDVDLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MDBBNSlcbiAgICAgICAgcmV0dXJuIDB4NUM7XG5cbiAgICAgIC8vIDQuIElmIGNvZGUgcG9pbnQgaXMgVSsyMDNFLCByZXR1cm4gYnl0ZSAweDdFLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjAzRSlcbiAgICAgICAgcmV0dXJuIDB4N0U7XG5cbiAgICAgIC8vIDUuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrRkY2MSB0byBVK0ZGOUYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiBhIGJ5dGUgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludCDiiJIgMHhGRjYxICsgMHhBMS5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4RkY2MSwgMHhGRjlGKSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQgLSAweEZGNjEgKyAweEExO1xuXG4gICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIFUrMjIxMiwgc2V0IGl0IHRvIFUrRkYwRC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSAweDIyMTIpXG4gICAgICAgIGNvZGVfcG9pbnQgPSAweEZGMEQ7XG5cbiAgICAgIC8vIDcuIExldCBwb2ludGVyIGJlIHRoZSBpbmRleCBTaGlmdF9KSVMgcG9pbnRlciBmb3IgY29kZSBwb2ludC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhTaGlmdEpJU1BvaW50ZXJGb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDguIElmIHBvaW50ZXIgaXMgbnVsbCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChwb2ludGVyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA5LiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gMTg4KS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE4OCk7XG5cbiAgICAgIC8vIDEwLiBMZXQgbGVhZCBvZmZzZXQgYmUgMHg4MSwgaWYgbGVhZCBpcyBsZXNzIHRoYW4gMHgxRiwgYW5kXG4gICAgICAvLyAweEMxIG90aGVyd2lzZS5cbiAgICAgIHZhciBsZWFkX29mZnNldCA9IChsZWFkIDwgMHgxRikgPyAweDgxIDogMHhDMTtcblxuICAgICAgLy8gMTEuIExldCB0cmFpbCBiZSBwb2ludGVyICUgMTg4LlxuICAgICAgdmFyIHRyYWlsID0gcG9pbnRlciAlIDE4ODtcblxuICAgICAgLy8gMTIuIExldCBvZmZzZXQgYmUgMHg0MCwgaWYgdHJhaWwgaXMgbGVzcyB0aGFuIDB4M0YsIGFuZCAweDQxXG4gICAgICAvLyBvdGhlcndpc2UuXG4gICAgICB2YXIgb2Zmc2V0ID0gKHRyYWlsIDwgMHgzRikgPyAweDQwIDogMHg0MTtcblxuICAgICAgLy8gMTMuIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkICsgbGVhZCBvZmZzZXQgYW5kXG4gICAgICAvLyB0cmFpbCArIG9mZnNldC5cbiAgICAgIHJldHVybiBbbGVhZCArIGxlYWRfb2Zmc2V0LCB0cmFpbCArIG9mZnNldF07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ1NoaWZ0X0pJUyddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgU2hpZnRKSVNFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydTaGlmdF9KSVMnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFNoaWZ0SklTRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuICAvL1xuICAvLyAxNC4gTGVnYWN5IG11bHRpLWJ5dGUgS29yZWFuIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDE0LjEgZXVjLWtyXG5cbiAgLy8gMTQuMS4xIGV1Yy1rciBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gRVVDS1JEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuXG4gICAgLy8gZXVjLWtyJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBldWMta3IgbGVhZCAoaW5pdGlhbGx5IDB4MDApLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gZXVja3JfbGVhZCA9IDB4MDA7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGV1Yy1rciBsZWFkIGlzIG5vdCAweDAwLCBzZXRcbiAgICAgIC8vIGV1Yy1rciBsZWFkIHRvIDB4MDAgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGV1Y2tyX2xlYWQgIT09IDApIHtcbiAgICAgICAgZXVja3JfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGV1Yy1rciBsZWFkIGlzIDB4MDAsIHJldHVyblxuICAgICAgLy8gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBldWNrcl9sZWFkID09PSAwKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDMuIElmIGV1Yy1rciBsZWFkIGlzIG5vdCAweDAwLCBsZXQgbGVhZCBiZSBldWMta3IgbGVhZCwgbGV0XG4gICAgICAvLyBwb2ludGVyIGJlIG51bGwsIHNldCBldWMta3IgbGVhZCB0byAweDAwLCBhbmQgdGhlbiBydW4gdGhlc2VcbiAgICAgIC8vIHN1YnN0ZXBzOlxuICAgICAgaWYgKGV1Y2tyX2xlYWQgIT09IDB4MDApIHtcbiAgICAgICAgdmFyIGxlYWQgPSBldWNrcl9sZWFkO1xuICAgICAgICB2YXIgcG9pbnRlciA9IG51bGw7XG4gICAgICAgIGV1Y2tyX2xlYWQgPSAweDAwO1xuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4NDEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gcG9pbnRlciB0byAobGVhZCDiiJIgMHg4MSkgw5cgMTkwICsgKGJ5dGUg4oiSIDB4NDEpLlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDQxLCAweEZFKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSAweDgxKSAqIDE5MCArIChiaXRlIC0gMHg0MSk7XG5cbiAgICAgICAgLy8gMi4gTGV0IGNvZGUgcG9pbnQgYmUgbnVsbCwgaWYgcG9pbnRlciBpcyBudWxsLCBhbmQgdGhlXG4gICAgICAgIC8vIGluZGV4IGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggZXVjLWtyIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIGNvZGVfcG9pbnQgPSAocG9pbnRlciA9PT0gbnVsbClcbiAgICAgICAgICAgICAgPyBudWxsIDogaW5kZXhDb2RlUG9pbnRGb3IocG9pbnRlciwgaW5kZXgoJ2V1Yy1rcicpKTtcblxuICAgICAgICAvLyAzLiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDUuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDUuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgIC8vIGV1Yy1rciBsZWFkIHRvIGJ5dGUgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4ODEsIDB4RkUpKSB7XG4gICAgICAgIGV1Y2tyX2xlYWQgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gUmV0dXJuIGVycm9yLlxuICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE0LjEuMiBldWMta3IgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIEVVQ0tSRW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXhcbiAgICAgIC8vIGV1Yy1rci5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KCdldWMta3InKSk7XG5cbiAgICAgIC8vIDQuIElmIHBvaW50ZXIgaXMgbnVsbCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChwb2ludGVyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA1LiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gMTkwKSArIDB4ODEuXG4gICAgICB2YXIgbGVhZCA9IGZsb29yKHBvaW50ZXIgLyAxOTApICsgMHg4MTtcblxuICAgICAgLy8gNi4gTGV0IHRyYWlsIGJlIHBvaW50ZXIgJSAxOTAgKyAweDQxLlxuICAgICAgdmFyIHRyYWlsID0gKHBvaW50ZXIgJSAxOTApICsgMHg0MTtcblxuICAgICAgLy8gNy4gUmV0dXJuIHR3byBieXRlcyB3aG9zZSB2YWx1ZXMgYXJlIGxlYWQgYW5kIHRyYWlsLlxuICAgICAgcmV0dXJuIFtsZWFkLCB0cmFpbF07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ0VVQy1LUiddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRVVDS1JFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydFVUMtS1InXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEVVQ0tSRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuXG4gIC8vXG4gIC8vIDE1LiBMZWdhY3kgbWlzY2VsbGFuZW91cyBlbmNvZGluZ3NcbiAgLy9cblxuICAvLyAxNS4xIHJlcGxhY2VtZW50XG5cbiAgLy8gTm90IG5lZWRlZCAtIEFQSSB0aHJvd3MgUmFuZ2VFcnJvclxuXG4gIC8vIDE1LjIgQ29tbW9uIGluZnJhc3RydWN0dXJlIGZvciB1dGYtMTZiZSBhbmQgdXRmLTE2bGVcblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfdW5pdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHV0ZjE2YmVcbiAgICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fSBieXRlc1xuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydENvZGVVbml0VG9CeXRlcyhjb2RlX3VuaXQsIHV0ZjE2YmUpIHtcbiAgICAvLyAxLiBMZXQgYnl0ZTEgYmUgY29kZSB1bml0ID4+IDguXG4gICAgdmFyIGJ5dGUxID0gY29kZV91bml0ID4+IDg7XG5cbiAgICAvLyAyLiBMZXQgYnl0ZTIgYmUgY29kZSB1bml0ICYgMHgwMEZGLlxuICAgIHZhciBieXRlMiA9IGNvZGVfdW5pdCAmIDB4MDBGRjtcblxuICAgIC8vIDMuIFRoZW4gcmV0dXJuIHRoZSBieXRlcyBpbiBvcmRlcjpcbiAgICAgICAgLy8gdXRmLTE2YmUgZmxhZyBpcyBzZXQ6IGJ5dGUxLCB0aGVuIGJ5dGUyLlxuICAgIGlmICh1dGYxNmJlKVxuICAgICAgcmV0dXJuIFtieXRlMSwgYnl0ZTJdO1xuICAgIC8vIHV0Zi0xNmJlIGZsYWcgaXMgdW5zZXQ6IGJ5dGUyLCB0aGVuIGJ5dGUxLlxuICAgIHJldHVybiBbYnl0ZTIsIGJ5dGUxXTtcbiAgfVxuXG4gIC8vIDE1LjIuMSBzaGFyZWQgdXRmLTE2IGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHtib29sZWFufSB1dGYxNl9iZSBUcnVlIGlmIGJpZy1lbmRpYW4sIGZhbHNlIGlmIGxpdHRsZS1lbmRpYW4uXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVVRGMTZEZWNvZGVyKHV0ZjE2X2JlLCBvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICB2YXIgLyoqIEB0eXBlIHs/bnVtYmVyfSAqLyB1dGYxNl9sZWFkX2J5dGUgPSBudWxsLFxuICAgICAgICAvKiogQHR5cGUgez9udW1iZXJ9ICovIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIFRoZSBzdHJlYW0gb2YgYnl0ZXMgYmVpbmcgZGVjb2RlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0ZSBUaGUgbmV4dCBieXRlIHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4gez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9IFRoZSBuZXh0IGNvZGUgcG9pbnQocylcbiAgICAgKiAgICAgZGVjb2RlZCwgb3IgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEgZXhpc3RzIGluIHRoZSBpbnB1dFxuICAgICAqICAgICBzdHJlYW0gdG8gZGVjb2RlIGEgY29tcGxldGUgY29kZSBwb2ludC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGJpdGUpIHtcbiAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZWl0aGVyIHV0Zi0xNiBsZWFkIGJ5dGUgb3JcbiAgICAgIC8vIHV0Zi0xNiBsZWFkIHN1cnJvZ2F0ZSBpcyBub3QgbnVsbCwgc2V0IHV0Zi0xNiBsZWFkIGJ5dGUgYW5kXG4gICAgICAvLyB1dGYtMTYgbGVhZCBzdXJyb2dhdGUgdG8gbnVsbCwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmICh1dGYxNl9sZWFkX2J5dGUgIT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmMTZfbGVhZF9zdXJyb2dhdGUgIT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIHV0Zi0xNiBsZWFkIGJ5dGUgYW5kIHV0Zi0xNlxuICAgICAgLy8gbGVhZCBzdXJyb2dhdGUgYXJlIG51bGwsIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIHV0ZjE2X2xlYWRfYnl0ZSA9PT0gbnVsbCAmJlxuICAgICAgICAgIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdXRmLTE2IGxlYWQgYnl0ZSBpcyBudWxsLCBzZXQgdXRmLTE2IGxlYWQgYnl0ZSB0byBieXRlXG4gICAgICAvLyBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKHV0ZjE2X2xlYWRfYnl0ZSA9PT0gbnVsbCkge1xuICAgICAgICB1dGYxNl9sZWFkX2J5dGUgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gTGV0IGNvZGUgdW5pdCBiZSB0aGUgcmVzdWx0IG9mOlxuICAgICAgdmFyIGNvZGVfdW5pdDtcbiAgICAgIGlmICh1dGYxNl9iZSkge1xuICAgICAgICAvLyB1dGYtMTZiZSBkZWNvZGVyIGZsYWcgaXMgc2V0XG4gICAgICAgIC8vICAgKHV0Zi0xNiBsZWFkIGJ5dGUgPDwgOCkgKyBieXRlLlxuICAgICAgICBjb2RlX3VuaXQgPSAodXRmMTZfbGVhZF9ieXRlIDw8IDgpICsgYml0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHV0Zi0xNmJlIGRlY29kZXIgZmxhZyBpcyB1bnNldFxuICAgICAgICAvLyAgIChieXRlIDw8IDgpICsgdXRmLTE2IGxlYWQgYnl0ZS5cbiAgICAgICAgY29kZV91bml0ID0gKGJpdGUgPDwgOCkgKyB1dGYxNl9sZWFkX2J5dGU7XG4gICAgICB9XG4gICAgICAvLyBUaGVuIHNldCB1dGYtMTYgbGVhZCBieXRlIHRvIG51bGwuXG4gICAgICB1dGYxNl9sZWFkX2J5dGUgPSBudWxsO1xuXG4gICAgICAvLyA1LiBJZiB1dGYtMTYgbGVhZCBzdXJyb2dhdGUgaXMgbm90IG51bGwsIGxldCBsZWFkIHN1cnJvZ2F0ZVxuICAgICAgLy8gYmUgdXRmLTE2IGxlYWQgc3Vycm9nYXRlLCBzZXQgdXRmLTE2IGxlYWQgc3Vycm9nYXRlIHRvIG51bGwsXG4gICAgICAvLyBhbmQgdGhlbiBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICBpZiAodXRmMTZfbGVhZF9zdXJyb2dhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxlYWRfc3Vycm9nYXRlID0gdXRmMTZfbGVhZF9zdXJyb2dhdGU7XG4gICAgICAgIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID0gbnVsbDtcblxuICAgICAgICAvLyAxLiBJZiBjb2RlIHVuaXQgaXMgaW4gdGhlIHJhbmdlIFUrREMwMCB0byBVK0RGRkYsXG4gICAgICAgIC8vIGluY2x1c2l2ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyAweDEwMDAwICtcbiAgICAgICAgLy8gKChsZWFkIHN1cnJvZ2F0ZSDiiJIgMHhEODAwKSA8PCAxMCkgKyAoY29kZSB1bml0IOKIkiAweERDMDApLlxuICAgICAgICBpZiAoaW5SYW5nZShjb2RlX3VuaXQsIDB4REMwMCwgMHhERkZGKSkge1xuICAgICAgICAgIHJldHVybiAweDEwMDAwICsgKGxlYWRfc3Vycm9nYXRlIC0gMHhEODAwKSAqIDB4NDAwICtcbiAgICAgICAgICAgICAgKGNvZGVfdW5pdCAtIDB4REMwMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBQcmVwZW5kIHRoZSBzZXF1ZW5jZSByZXN1bHRpbmcgb2YgY29udmVydGluZyBjb2RlIHVuaXRcbiAgICAgICAgLy8gdG8gYnl0ZXMgdXNpbmcgdXRmLTE2YmUgZGVjb2RlciBmbGFnIHRvIHN0cmVhbSBhbmQgcmV0dXJuXG4gICAgICAgIC8vIGVycm9yLlxuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb252ZXJ0Q29kZVVuaXRUb0J5dGVzKGNvZGVfdW5pdCwgdXRmMTZfYmUpKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGNvZGUgdW5pdCBpcyBpbiB0aGUgcmFuZ2UgVStEODAwIHRvIFUrREJGRiwgaW5jbHVzaXZlLFxuICAgICAgLy8gc2V0IHV0Zi0xNiBsZWFkIHN1cnJvZ2F0ZSB0byBjb2RlIHVuaXQgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfdW5pdCwgMHhEODAwLCAweERCRkYpKSB7XG4gICAgICAgIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID0gY29kZV91bml0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNy4gSWYgY29kZSB1bml0IGlzIGluIHRoZSByYW5nZSBVK0RDMDAgdG8gVStERkZGLCBpbmNsdXNpdmUsXG4gICAgICAvLyByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoaW5SYW5nZShjb2RlX3VuaXQsIDB4REMwMCwgMHhERkZGKSlcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgIC8vIDguIFJldHVybiBjb2RlIHBvaW50IGNvZGUgdW5pdC5cbiAgICAgIHJldHVybiBjb2RlX3VuaXQ7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE1LjIuMiBzaGFyZWQgdXRmLTE2IGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHtib29sZWFufSB1dGYxNl9iZSBUcnVlIGlmIGJpZy1lbmRpYW4sIGZhbHNlIGlmIGxpdHRsZS1lbmRpYW4uXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVVRGMTZFbmNvZGVyKHV0ZjE2X2JlLCBvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDAwMCB0byBVK0ZGRkYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiB0aGUgc2VxdWVuY2UgcmVzdWx0aW5nIG9mIGNvbnZlcnRpbmcgY29kZSBwb2ludCB0b1xuICAgICAgLy8gYnl0ZXMgdXNpbmcgdXRmLTE2YmUgZW5jb2RlciBmbGFnLlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHgwMDAwLCAweEZGRkYpKVxuICAgICAgICByZXR1cm4gY29udmVydENvZGVVbml0VG9CeXRlcyhjb2RlX3BvaW50LCB1dGYxNl9iZSk7XG5cbiAgICAgIC8vIDMuIExldCBsZWFkIGJlICgoY29kZSBwb2ludCDiiJIgMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICAgLy8gY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHV0Zi0xNmJlIGVuY29kZXIgZmxhZy5cbiAgICAgIHZhciBsZWFkID0gY29udmVydENvZGVVbml0VG9CeXRlcyhcbiAgICAgICAgKChjb2RlX3BvaW50IC0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCB1dGYxNl9iZSk7XG5cbiAgICAgIC8vIDQuIExldCB0cmFpbCBiZSAoKGNvZGUgcG9pbnQg4oiSIDB4MTAwMDApICYgMHgzRkYpICsgMHhEQzAwLFxuICAgICAgLy8gY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHV0Zi0xNmJlIGVuY29kZXIgZmxhZy5cbiAgICAgIHZhciB0cmFpbCA9IGNvbnZlcnRDb2RlVW5pdFRvQnl0ZXMoXG4gICAgICAgICgoY29kZV9wb2ludCAtIDB4MTAwMDApICYgMHgzRkYpICsgMHhEQzAwLCB1dGYxNl9iZSk7XG5cbiAgICAgIC8vIDUuIFJldHVybiBhIGJ5dGUgc2VxdWVuY2Ugb2YgbGVhZCBmb2xsb3dlZCBieSB0cmFpbC5cbiAgICAgIHJldHVybiBsZWFkLmNvbmNhdCh0cmFpbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE1LjMgdXRmLTE2YmVcbiAgLy8gMTUuMy4xIHV0Zi0xNmJlIGRlY29kZXJcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snVVRGLTE2QkUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjE2RW5jb2Rlcih0cnVlLCBvcHRpb25zKTtcbiAgfTtcbiAgLy8gMTUuMy4yIHV0Zi0xNmJlIGVuY29kZXJcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snVVRGLTE2QkUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjE2RGVjb2Rlcih0cnVlLCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyAxNS40IHV0Zi0xNmxlXG4gIC8vIDE1LjQuMSB1dGYtMTZsZSBkZWNvZGVyXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ1VURi0xNkxFJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBVVEYxNkVuY29kZXIoZmFsc2UsIG9wdGlvbnMpO1xuICB9O1xuICAvLyAxNS40LjIgdXRmLTE2bGUgZW5jb2RlclxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydVVEYtMTZMRSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVVRGMTZEZWNvZGVyKGZhbHNlLCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyAxNS41IHgtdXNlci1kZWZpbmVkXG5cbiAgLy8gMTUuNS4xIHgtdXNlci1kZWZpbmVkIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBYVXNlckRlZmluZWREZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGFuIEFTQ0lJIGJ5dGUsIHJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWVcbiAgICAgIC8vIGlzIGJ5dGUuXG4gICAgICBpZiAoaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgIHJldHVybiBiaXRlO1xuXG4gICAgICAvLyAzLiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIDB4Rjc4MCArIGJ5dGUg4oiSIDB4ODAuXG4gICAgICByZXR1cm4gMHhGNzgwICsgYml0ZSAtIDB4ODA7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE1LjUuMiB4LXVzZXItZGVmaW5lZCBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gWFVzZXJEZWZpbmVkRW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLklmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBJZiBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVK0Y3ODAgdG8gVStGN0ZGLCBpbmNsdXNpdmUsXG4gICAgICAvLyByZXR1cm4gYSBieXRlIHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQg4oiSIDB4Rjc4MCArIDB4ODAuXG4gICAgICBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweEY3ODAsIDB4RjdGRikpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50IC0gMHhGNzgwICsgMHg4MDtcblxuICAgICAgLy8gNC4gUmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ3gtdXNlci1kZWZpbmVkJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBYVXNlckRlZmluZWRFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWyd4LXVzZXItZGVmaW5lZCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWFVzZXJEZWZpbmVkRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFsnVGV4dEVuY29kZXInXSlcbiAgICBnbG9iYWxbJ1RleHRFbmNvZGVyJ10gPSBUZXh0RW5jb2RlcjtcbiAgaWYgKCFnbG9iYWxbJ1RleHREZWNvZGVyJ10pXG4gICAgZ2xvYmFsWydUZXh0RGVjb2RlciddID0gVGV4dERlY29kZXI7XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgIFRleHRFbmNvZGVyOiBnbG9iYWxbJ1RleHRFbmNvZGVyJ10sXG4gICAgICBUZXh0RGVjb2RlcjogZ2xvYmFsWydUZXh0RGVjb2RlciddLFxuICAgICAgRW5jb2RpbmdJbmRleGVzOiBnbG9iYWxbXCJlbmNvZGluZy1pbmRleGVzXCJdXG4gICAgfTtcbiAgfVxuXG4vLyBGb3Igc3RyaWN0IGVudmlyb25tZW50cyB3aGVyZSBgdGhpc2AgaW5zaWRlIHRoZSBnbG9iYWwgc2NvcGVcbi8vIGlzIGB1bmRlZmluZWRgLCB0YWtlIGEgcHVyZSBvYmplY3QgaW5zdGVhZFxufSh0aGlzIHx8IHt9KSk7IiwiLyohXG5cbiBkaWZmIHY0LjAuMVxuXG5Tb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpXG5cbkNvcHlyaWdodCAoYykgMjAwOS0yMDE1LCBLZXZpbiBEZWNrZXIgPGtwZGVja2VyQGdtYWlsLmNvbT5cblxuQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmVcbiAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuICBmb2xsb3dpbmcgZGlzY2xhaW1lci5cblxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGVcbiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyXG4gIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiogTmVpdGhlciB0aGUgbmFtZSBvZiBLZXZpbiBEZWNrZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yXG4gIHdyaXR0ZW4gcGVybWlzc2lvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SXG5JTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkRcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SXG5DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG5EQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG5EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUlxuSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVFxuT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuQGxpY2Vuc2VcbiovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuRGlmZiA9IHt9KSk7XG59KHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBEaWZmKCkge31cbiAgRGlmZi5wcm90b3R5cGUgPSB7XG4gICAgZGlmZjogZnVuY3Rpb24gZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZykge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuXG5cbiAgICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgICBuZXdTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChuZXdTdHJpbmcpO1xuICAgICAgb2xkU3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG9sZFN0cmluZykpO1xuICAgICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuICAgICAgdmFyIG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICAgIHZhciBlZGl0TGVuZ3RoID0gMTtcbiAgICAgIHZhciBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgICAgdmFyIGJlc3RQYXRoID0gW3tcbiAgICAgICAgbmV3UG9zOiAtMSxcbiAgICAgICAgY29tcG9uZW50czogW11cbiAgICAgIH1dOyAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuXG4gICAgICB2YXIgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cbiAgICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcbiAgICAgICAgcmV0dXJuIGRvbmUoW3tcbiAgICAgICAgICB2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksXG4gICAgICAgICAgY291bnQ6IG5ld1N0cmluZy5sZW5ndGhcbiAgICAgICAgfV0pO1xuICAgICAgfSAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG5cblxuICAgICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICAgIGZvciAodmFyIGRpYWdvbmFsUGF0aCA9IC0xICogZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoIDw9IGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCArPSAyKSB7XG4gICAgICAgICAgdmFyIGJhc2VQYXRoID0gdm9pZCAwO1xuXG4gICAgICAgICAgdmFyIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSxcbiAgICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgICBfb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuXG4gICAgICAgICAgaWYgKGFkZFBhdGgpIHtcbiAgICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBfb2xkUG9zICYmIF9vbGRQb3MgPCBvbGRMZW47XG5cbiAgICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG4gICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAgIC8vIHBhdGggd2hvc2UgcG9zaXRpb24gaW4gdGhlIG5ldyBzdHJpbmcgaXMgdGhlIGZhcnRoZXN0IGZyb20gdGhlIG9yaWdpblxuICAgICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcblxuXG4gICAgICAgICAgaWYgKCFjYW5BZGQgfHwgY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpIHtcbiAgICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcblxuICAgICAgICAgICAgYmFzZVBhdGgubmV3UG9zKys7XG4gICAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfb2xkUG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTsgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcblxuICAgICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBfb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgdHJhY2sgdGhpcyBwYXRoIGFzIGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBhbmQgY29udGludWUuXG4gICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWRpdExlbmd0aCsrO1xuICAgICAgfSAvLyBQZXJmb3JtcyB0aGUgbGVuZ3RoIG9mIGVkaXQgaXRlcmF0aW9uLiBJcyBhIGJpdCBmdWdseSBhcyB0aGlzIGhhcyB0byBzdXBwb3J0IHRoZVxuICAgICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgICAgLy8gaXMgcHJvZHVjZWQuXG5cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gYmUgc2FmZS5cblxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcblxuICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBwdXNoQ29tcG9uZW50OiBmdW5jdGlvbiBwdXNoQ29tcG9uZW50KGNvbXBvbmVudHMsIGFkZGVkLCByZW1vdmVkKSB7XG4gICAgICB2YXIgbGFzdCA9IGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKGxhc3QgJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdID0ge1xuICAgICAgICAgIGNvdW50OiBsYXN0LmNvdW50ICsgMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHtcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBhZGRlZDogYWRkZWQsXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhY3RDb21tb246IGZ1bmN0aW9uIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgbmV3UG9zID0gYmFzZVBhdGgubmV3UG9zLFxuICAgICAgICAgIG9sZFBvcyA9IG5ld1BvcyAtIGRpYWdvbmFsUGF0aCxcbiAgICAgICAgICBjb21tb25Db3VudCA9IDA7XG5cbiAgICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICAgIG5ld1BvcysrO1xuICAgICAgICBvbGRQb3MrKztcbiAgICAgICAgY29tbW9uQ291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICAgIGJhc2VQYXRoLmNvbXBvbmVudHMucHVzaCh7XG4gICAgICAgICAgY291bnQ6IGNvbW1vbkNvdW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG4gICAgICByZXR1cm4gb2xkUG9zO1xuICAgIH0sXG4gICAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8IHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlICYmIGxlZnQudG9Mb3dlckNhc2UoKSA9PT0gcmlnaHQudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZUVtcHR5OiBmdW5jdGlvbiByZW1vdmVFbXB0eShhcnJheSkge1xuICAgICAgdmFyIHJldCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJheVtpXSkge1xuICAgICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG4gICAgY2FzdElucHV0OiBmdW5jdGlvbiBjYXN0SW5wdXQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHRva2VuaXplOiBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oY2hhcnMpIHtcbiAgICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICAgIHZhciBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgICAgbmV3UG9zID0gMCxcbiAgICAgICAgb2xkUG9zID0gMDtcblxuICAgIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICAgIGlmICghY29tcG9uZW50LmFkZGVkICYmIHVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4odmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIENvbW1vbiBjYXNlXG5cbiAgICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4ob2xkU3RyaW5nLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAgIC8vIHJvdXRlIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgd2l0aCBtaW5pbWFsIG92ZXJoZWFkLlxuXG4gICAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICAgIHZhciB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0gPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAgIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAgIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuXG5cbiAgICB2YXIgbGFzdENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cbiAgICBpZiAoY29tcG9uZW50TGVuID4gMSAmJiB0eXBlb2YgbGFzdENvbXBvbmVudC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKSAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMl0udmFsdWUgKz0gbGFzdENvbXBvbmVudC52YWx1ZTtcbiAgICAgIGNvbXBvbmVudHMucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXdQb3M6IHBhdGgubmV3UG9zLFxuICAgICAgY29tcG9uZW50czogcGF0aC5jb21wb25lbnRzLnNsaWNlKDApXG4gICAgfTtcbiAgfVxuXG4gIHZhciBjaGFyYWN0ZXJEaWZmID0gbmV3IERpZmYoKTtcbiAgZnVuY3Rpb24gZGlmZkNoYXJzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZU9wdGlvbnMob3B0aW9ucywgZGVmYXVsdHMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIGRlZmF1bHRzW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIC8vXG4gIC8vIFJhbmdlcyBhbmQgZXhjZXB0aW9uczpcbiAgLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuICAvLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cbiAgLy8gIC0gVSswMEY3ICDDtyBEaXZpc2lvbiBzaWduXG4gIC8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG4gIC8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG4gIC8vIElQQSBFeHRlbnNpb25zLCAwMjUw4oCTMDJBRlxuICAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG4gIC8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuICAvLyAgLSBVKzAyRDggIMuYICYjNzI4OyAgQnJldmVcbiAgLy8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuICAvLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuICAvLyAgLSBVKzAyREIgIMubICYjNzMxOyAgT2dvbmVrXG4gIC8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuICAvLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuICAvLyBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsLCAxRTAw4oCTMUVGRlxuXG4gIHZhciBleHRlbmRlZFdvcmRDaGFycyA9IC9eW0EtWmEtelxceEMwLVxcdTAyQzZcXHUwMkM4LVxcdTAyRDdcXHUwMkRFLVxcdTAyRkZcXHUxRTAwLVxcdTFFRkZdKyQvO1xuICB2YXIgcmVXaGl0ZXNwYWNlID0gL1xcUy87XG4gIHZhciB3b3JkRGlmZiA9IG5ldyBEaWZmKCk7XG5cbiAgd29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG4gICAgICBsZWZ0ID0gbGVmdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCB0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QobGVmdCkgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KHJpZ2h0KTtcbiAgfTtcblxuICB3b3JkRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciB0b2tlbnMgPSB2YWx1ZS5zcGxpdCgvKFxccyt8WygpW1xcXXt9J1wiXXxcXGIpLyk7IC8vIEpvaW4gdGhlIGJvdW5kYXJ5IHNwbGl0cyB0aGF0IHdlIGRvIG5vdCBjb25zaWRlciB0byBiZSBib3VuZGFyaWVzLiBUaGlzIGlzIHByaW1hcmlseSB0aGUgZXh0ZW5kZWQgTGF0aW4gY2hhcmFjdGVyIHNldC5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIG5leHQgZmllbGQgYW5kIHdlIGhhdmUgb25seSB3b3JkIGNoYXJzIGJlZm9yZSBhbmQgYWZ0ZXIsIG1lcmdlXG4gICAgICBpZiAoIXRva2Vuc1tpICsgMV0gJiYgdG9rZW5zW2kgKyAyXSAmJiBleHRlbmRlZFdvcmRDaGFycy50ZXN0KHRva2Vuc1tpXSkgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuICAgICAgICB0b2tlbnNbaV0gKz0gdG9rZW5zW2kgKyAyXTtcbiAgICAgICAgdG9rZW5zLnNwbGljZShpICsgMSwgMik7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMob3B0aW9ucywge1xuICAgICAgaWdub3JlV2hpdGVzcGFjZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgfVxuICBmdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG4gIH1cblxuICB2YXIgbGluZURpZmYgPSBuZXcgRGlmZigpO1xuXG4gIGxpbmVEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIHJldExpbmVzID0gW10sXG4gICAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7IC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuXG4gICAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMucG9wKCk7XG4gICAgfSAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzQW5kTmV3bGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgICAgcmV0TGluZXNbcmV0TGluZXMubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldExpbmVzO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuICB9XG4gIGZ1bmN0aW9uIGRpZmZUcmltbWVkTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtcbiAgICAgIGlnbm9yZVdoaXRlc3BhY2U6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG4gIH1cblxuICB2YXIgc2VudGVuY2VEaWZmID0gbmV3IERpZmYoKTtcblxuICBzZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gc2VudGVuY2VEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHZhciBjc3NEaWZmID0gbmV3IERpZmYoKTtcblxuICBjc3NEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KC8oW3t9OjssXXxcXHMrKS8pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGRpZmZDc3Mob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGNzc0RpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfdHlwZW9mKG9iaik7XG4gIH1cblxuICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICAgICAgcmV0dXJuIGFycjI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gICAgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gIH1cblxuICB2YXIgb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIganNvbkRpZmYgPSBuZXcgRGlmZigpOyAvLyBEaXNjcmltaW5hdGUgYmV0d2VlbiB0d28gbGluZXMgb2YgcHJldHR5LXByaW50ZWQsIHNlcmlhbGl6ZWQgSlNPTiB3aGVyZSBvbmUgb2YgdGhlbSBoYXMgYVxuICAvLyBkYW5nbGluZyBjb21tYSBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuIFR1cm5zIG91dCBpbmNsdWRpbmcgdGhlIGRhbmdsaW5nIGNvbW1hIHlpZWxkcyB0aGUgbmljZXN0IG91dHB1dDpcblxuICBqc29uRGlmZi51c2VMb25nZXN0VG9rZW4gPSB0cnVlO1xuICBqc29uRGlmZi50b2tlbml6ZSA9IGxpbmVEaWZmLnRva2VuaXplO1xuXG4gIGpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBfdGhpcyRvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICB1bmRlZmluZWRSZXBsYWNlbWVudCA9IF90aGlzJG9wdGlvbnMudW5kZWZpbmVkUmVwbGFjZW1lbnQsXG4gICAgICAgIF90aGlzJG9wdGlvbnMkc3RyaW5naSA9IF90aGlzJG9wdGlvbnMuc3RyaW5naWZ5UmVwbGFjZXIsXG4gICAgICAgIHN0cmluZ2lmeVJlcGxhY2VyID0gX3RoaXMkb3B0aW9ucyRzdHJpbmdpID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoaywgdikge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZFJlcGxhY2VtZW50IDogdjtcbiAgICB9IDogX3RoaXMkb3B0aW9ucyRzdHJpbmdpO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeShjYW5vbmljYWxpemUodmFsdWUsIG51bGwsIG51bGwsIHN0cmluZ2lmeVJlcGxhY2VyKSwgc3RyaW5naWZ5UmVwbGFjZXIsICcgICcpO1xuICB9O1xuXG4gIGpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBEaWZmLnByb3RvdHlwZS5lcXVhbHMuY2FsbChqc29uRGlmZiwgbGVmdC5yZXBsYWNlKC8sKFtcXHJcXG5dKS9nLCAnJDEnKSwgcmlnaHQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJykpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGRpZmZKc29uKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25EaWZmLmRpZmYob2xkT2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICB9IC8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJlc2VuY2Ugb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSBiYWlsaW5nIG91dCB3aGVuIGVuY291bnRlcmluZyBhblxuICAvLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5cbiAgZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpIHtcbiAgICBzdGFjayA9IHN0YWNrIHx8IFtdO1xuICAgIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG4gICAgaWYgKHJlcGxhY2VyKSB7XG4gICAgICBvYmogPSByZXBsYWNlcihrZXksIG9iaik7XG4gICAgfVxuXG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjYW5vbmljYWxpemVkT2JqO1xuXG4gICAgaWYgKCdbb2JqZWN0IEFycmF5XScgPT09IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nLmNhbGwob2JqKSkge1xuICAgICAgc3RhY2sucHVzaChvYmopO1xuICAgICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjYW5vbmljYWxpemVkT2JqW2ldID0gY2Fub25pY2FsaXplKG9ialtpXSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICBzdGFjay5wb3AoKTtcbiAgICAgIHJlcGxhY2VtZW50U3RhY2sucG9wKCk7XG4gICAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgICB9XG5cbiAgICBpZiAob2JqICYmIG9iai50b0pTT04pIHtcbiAgICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgICB9XG5cbiAgICBpZiAoX3R5cGVvZihvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIHN0YWNrLnB1c2gob2JqKTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcbiAgICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcblxuICAgICAgdmFyIHNvcnRlZEtleXMgPSBbXSxcbiAgICAgICAgICBfa2V5O1xuXG4gICAgICBmb3IgKF9rZXkgaW4gb2JqKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgICAgICBzb3J0ZWRLZXlzLnB1c2goX2tleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc29ydGVkS2V5cy5zb3J0KCk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzb3J0ZWRLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIF9rZXkgPSBzb3J0ZWRLZXlzW2ldO1xuICAgICAgICBjYW5vbmljYWxpemVkT2JqW19rZXldID0gY2Fub25pY2FsaXplKG9ialtfa2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBfa2V5KTtcbiAgICAgIH1cblxuICAgICAgc3RhY2sucG9wKCk7XG4gICAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgdmFyIGFycmF5RGlmZiA9IG5ldyBEaWZmKCk7XG5cbiAgYXJyYXlEaWZmLnRva2VuaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG4gIH07XG5cbiAgYXJyYXlEaWZmLmpvaW4gPSBhcnJheURpZmYucmVtb3ZlRW1wdHkgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlmZkFycmF5cyhvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlUGF0Y2godW5pRGlmZikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgZGlmZnN0ciA9IHVuaURpZmYuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICAgIGRlbGltaXRlcnMgPSB1bmlEaWZmLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgICAgbGlzdCA9IFtdLFxuICAgICAgICBpID0gMDtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSW5kZXgoKSB7XG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGxpc3QucHVzaChpbmRleCk7IC8vIFBhcnNlIGRpZmYgbWV0YWRhdGFcblxuICAgICAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgICAgICB2YXIgbGluZSA9IGRpZmZzdHJbaV07IC8vIEZpbGUgaGVhZGVyIGZvdW5kLCBlbmQgcGFyc2luZyBkaWZmIG1ldGFkYXRhXG5cbiAgICAgICAgaWYgKC9eKFxcLVxcLVxcLXxcXCtcXCtcXCt8QEApXFxzLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gRGlmZiBpbmRleFxuXG5cbiAgICAgICAgdmFyIGhlYWRlciA9IC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLy5leGVjKGxpbmUpO1xuXG4gICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICBpbmRleC5pbmRleCA9IGhlYWRlclsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH0gLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuXG5cbiAgICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpOyAvLyBQYXJzZSBodW5rc1xuXG4gICAgICBpbmRleC5odW5rcyA9IFtdO1xuXG4gICAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICAgIHZhciBfbGluZSA9IGRpZmZzdHJbaV07XG5cbiAgICAgICAgaWYgKC9eKEluZGV4OnxkaWZmfFxcLVxcLVxcLXxcXCtcXCtcXCspXFxzLy50ZXN0KF9saW5lKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKC9eQEAvLnRlc3QoX2xpbmUpKSB7XG4gICAgICAgICAgaW5kZXguaHVua3MucHVzaChwYXJzZUh1bmsoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoX2xpbmUgJiYgb3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBsaW5lICcgKyAoaSArIDEpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkoX2xpbmUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFBhcnNlcyB0aGUgLS0tIGFuZCArKysgaGVhZGVycywgaWYgbm9uZSBhcmUgZm91bmQsIG5vIGxpbmVzXG4gICAgLy8gYXJlIGNvbnN1bWVkLlxuXG5cbiAgICBmdW5jdGlvbiBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpIHtcbiAgICAgIHZhciBmaWxlSGVhZGVyID0gL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvLmV4ZWMoZGlmZnN0cltpXSk7XG5cbiAgICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICAgIHZhciBrZXlQcmVmaXggPSBmaWxlSGVhZGVyWzFdID09PSAnLS0tJyA/ICdvbGQnIDogJ25ldyc7XG4gICAgICAgIHZhciBkYXRhID0gZmlsZUhlYWRlclsyXS5zcGxpdCgnXFx0JywgMik7XG4gICAgICAgIHZhciBmaWxlTmFtZSA9IGRhdGFbMF0ucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcblxuICAgICAgICBpZiAoL15cIi4qXCIkLy50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyKDEsIGZpbGVOYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0ZpbGVOYW1lJ10gPSBmaWxlTmFtZTtcbiAgICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0gLy8gUGFyc2VzIGEgaHVua1xuICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSBodW5rLlxuXG5cbiAgICBmdW5jdGlvbiBwYXJzZUh1bmsoKSB7XG4gICAgICB2YXIgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICAgIGNodW5rSGVhZGVyID0gY2h1bmtIZWFkZXJMaW5lLnNwbGl0KC9AQCAtKFxcZCspKD86LChcXGQrKSk/IFxcKyhcXGQrKSg/OiwoXFxkKykpPyBAQC8pO1xuICAgICAgdmFyIGh1bmsgPSB7XG4gICAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICAgIG9sZExpbmVzOiArY2h1bmtIZWFkZXJbMl0gfHwgMSxcbiAgICAgICAgbmV3U3RhcnQ6ICtjaHVua0hlYWRlclszXSxcbiAgICAgICAgbmV3TGluZXM6ICtjaHVua0hlYWRlcls0XSB8fCAxLFxuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGxpbmVkZWxpbWl0ZXJzOiBbXVxuICAgICAgfTtcbiAgICAgIHZhciBhZGRDb3VudCA9IDAsXG4gICAgICAgICAgcmVtb3ZlQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKDsgaSA8IGRpZmZzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCAnLS0tJyBjb3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlIFwicmVtb3ZlIGxpbmVcIiBvcGVyYXRpb25cbiAgICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgICBpZiAoZGlmZnN0cltpXS5pbmRleE9mKCctLS0gJykgPT09IDAgJiYgaSArIDIgPCBkaWZmc3RyLmxlbmd0aCAmJiBkaWZmc3RyW2kgKyAxXS5pbmRleE9mKCcrKysgJykgPT09IDAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9wZXJhdGlvbiA9IGRpZmZzdHJbaV0ubGVuZ3RoID09IDAgJiYgaSAhPSBkaWZmc3RyLmxlbmd0aCAtIDEgPyAnICcgOiBkaWZmc3RyW2ldWzBdO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJyB8fCBvcGVyYXRpb24gPT09ICctJyB8fCBvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgICBodW5rLmxpbmVkZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyc1tpXSB8fCAnXFxuJyk7XG5cbiAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSGFuZGxlIHRoZSBlbXB0eSBibG9jayBjb3VudCBjYXNlXG5cblxuICAgICAgaWYgKCFhZGRDb3VudCAmJiBodW5rLm5ld0xpbmVzID09PSAxKSB7XG4gICAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG4gICAgICB9IC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG5cblxuICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWRkZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbW92ZUNvdW50ICE9PSBodW5rLm9sZExpbmVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaHVuaztcbiAgICB9XG5cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICBwYXJzZUluZGV4KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbiAgLy8gYnkgZGlzdGFuY2UgZnJvbSBhIGdpdmVuIHN0YXJ0IHBvc2l0aW9uLiBJLmUuIGZvciBbMCwgNF0sIHdpdGhcbiAgLy8gc3RhcnQgb2YgMiwgdGhpcyB3aWxsIGl0ZXJhdGUgMiwgMywgMSwgNCwgMC5cbiAgZnVuY3Rpb24gZGlzdGFuY2VJdGVyYXRvciAoc3RhcnQsIG1pbkxpbmUsIG1heExpbmUpIHtcbiAgICB2YXIgd2FudEZvcndhcmQgPSB0cnVlLFxuICAgICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgICBmb3J3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXRlcmF0b3IoKSB7XG4gICAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgaWYgKGJhY2t3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgICAgbG9jYWxPZmZzZXQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YW50Rm9yd2FyZCA9IGZhbHNlO1xuICAgICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmV5b25kIHRleHQgbGVuZ3RoLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG5cblxuICAgICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG4gICAgICAgICAgcmV0dXJuIGxvY2FsT2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgICAgaWYgKCFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgICAgd2FudEZvcndhcmQgPSB0cnVlO1xuICAgICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmVmb3JlIHRleHQgYmVnaW5uaW5nLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAgIC8vIGJlZm9yZSBvZmZzZXQgbG9jYXRpb25cblxuXG4gICAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgICByZXR1cm4gLWxvY2FsT2Zmc2V0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBpdGVyYXRvcigpO1xuICAgICAgfSAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuICAgICAgLy8gaHVuayBjYW4ndCBmaXQgb24gdGhlIHRleHQuIFJldHVybiB1bmRlZmluZWRcblxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaURpZmYpKSB7XG4gICAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgICB9XG5cbiAgICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICAgIH0gLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cblxuICAgIHZhciBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgICAgZGVsaW1pdGVycyA9IHNvdXJjZS5tYXRjaCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vZykgfHwgW10sXG4gICAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcbiAgICAgICAgY29tcGFyZUxpbmUgPSBvcHRpb25zLmNvbXBhcmVMaW5lIHx8IGZ1bmN0aW9uIChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkge1xuICAgICAgcmV0dXJuIGxpbmUgPT09IHBhdGNoQ29udGVudDtcbiAgICB9LFxuICAgICAgICBlcnJvckNvdW50ID0gMCxcbiAgICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgICBtaW5MaW5lID0gMCxcbiAgICAgICAgb2Zmc2V0ID0gMCxcbiAgICAgICAgcmVtb3ZlRU9GTkwsXG4gICAgICAgIGFkZEVPRk5MO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgaHVuayBleGFjdGx5IGZpdHMgb24gdGhlIHByb3ZpZGVkIGxvY2F0aW9uXG4gICAgICovXG5cblxuICAgIGZ1bmN0aW9uIGh1bmtGaXRzKGh1bmssIHRvUG9zKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgICAgb3BlcmF0aW9uID0gbGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyxcbiAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmU7XG5cbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgICBpZiAoIWNvbXBhcmVMaW5lKHRvUG9zICsgMSwgbGluZXNbdG9Qb3NdLCBvcGVyYXRpb24sIGNvbnRlbnQpKSB7XG4gICAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9Qb3MrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgICBtYXhMaW5lID0gbGluZXMubGVuZ3RoIC0gaHVuay5vbGRMaW5lcyxcbiAgICAgICAgICBsb2NhbE9mZnNldCA9IDAsXG4gICAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcbiAgICAgIHZhciBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgICBmb3IgKDsgbG9jYWxPZmZzZXQgIT09IHVuZGVmaW5lZDsgbG9jYWxPZmZzZXQgPSBpdGVyYXRvcigpKSB7XG4gICAgICAgIGlmIChodW5rRml0cyhodW5rLCB0b1BvcyArIGxvY2FsT2Zmc2V0KSkge1xuICAgICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2NhbE9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gU2V0IGxvd2VyIHRleHQgbGltaXQgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGh1bmssIHNvIG5leHQgb25lcyBkb24ndCB0cnlcbiAgICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG5cblxuICAgICAgbWluTGluZSA9IGh1bmsub2Zmc2V0ICsgaHVuay5vbGRTdGFydCArIGh1bmsub2xkTGluZXM7XG4gICAgfSAvLyBBcHBseSBwYXRjaCBodW5rc1xuXG5cbiAgICB2YXIgZGlmZk9mZnNldCA9IDA7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaHVua3MubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2h1bmsgPSBodW5rc1tfaV0sXG4gICAgICAgICAgX3RvUG9zID0gX2h1bmsub2xkU3RhcnQgKyBfaHVuay5vZmZzZXQgKyBkaWZmT2Zmc2V0IC0gMTtcblxuICAgICAgZGlmZk9mZnNldCArPSBfaHVuay5uZXdMaW5lcyAtIF9odW5rLm9sZExpbmVzO1xuXG4gICAgICBpZiAoX3RvUG9zIDwgMCkge1xuICAgICAgICAvLyBDcmVhdGluZyBhIG5ldyBmaWxlXG4gICAgICAgIF90b1BvcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2h1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBfaHVuay5saW5lc1tqXSxcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgICBjb250ZW50ID0gbGluZS5sZW5ndGggPiAwID8gbGluZS5zdWJzdHIoMSkgOiBsaW5lLFxuICAgICAgICAgICAgZGVsaW1pdGVyID0gX2h1bmsubGluZWRlbGltaXRlcnNbal07XG5cbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgX3RvUG9zKys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgICBkZWxpbWl0ZXJzLnNwbGljZShfdG9Qb3MsIDEpO1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAwLCBjb250ZW50KTtcbiAgICAgICAgICBkZWxpbWl0ZXJzLnNwbGljZShfdG9Qb3MsIDAsIGRlbGltaXRlcik7XG4gICAgICAgICAgX3RvUG9zKys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgICB2YXIgcHJldmlvdXNPcGVyYXRpb24gPSBfaHVuay5saW5lc1tqIC0gMV0gPyBfaHVuay5saW5lc1tqIC0gMV1bMF0gOiBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICAgIHJlbW92ZUVPRk5MID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuXG5cbiAgICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICAgIHdoaWxlICghbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgbGluZXMucG9wKCk7XG4gICAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhZGRFT0ZOTCkge1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBkZWxpbWl0ZXJzLnB1c2goJ1xcbicpO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBsaW5lcy5sZW5ndGggLSAxOyBfaysrKSB7XG4gICAgICBsaW5lc1tfa10gPSBsaW5lc1tfa10gKyBkZWxpbWl0ZXJzW19rXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignJyk7XG4gIH0gLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuXG4gIGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IDA7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgICB2YXIgaW5kZXggPSB1bmlEaWZmW2N1cnJlbnRJbmRleCsrXTtcblxuICAgICAgaWYgKCFpbmRleCkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMucGF0Y2hlZChpbmRleCwgdXBkYXRlZENvbnRlbnQsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHByb2Nlc3NJbmRleCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb2Nlc3NJbmRleCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmNvbnRleHQgPSA0O1xuICAgIH1cblxuICAgIHZhciBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgICBkaWZmLnB1c2goe1xuICAgICAgdmFsdWU6ICcnLFxuICAgICAgbGluZXM6IFtdXG4gICAgfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgICBmdW5jdGlvbiBjb250ZXh0TGluZXMobGluZXMpIHtcbiAgICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAnICcgKyBlbnRyeTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBodW5rcyA9IFtdO1xuICAgIHZhciBvbGRSYW5nZVN0YXJ0ID0gMCxcbiAgICAgICAgbmV3UmFuZ2VTdGFydCA9IDAsXG4gICAgICAgIGN1clJhbmdlID0gW10sXG4gICAgICAgIG9sZExpbmUgPSAxLFxuICAgICAgICBuZXdMaW5lID0gMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZGlmZltpXSxcbiAgICAgICAgICBsaW5lcyA9IGN1cnJlbnQubGluZXMgfHwgY3VycmVudC52YWx1ZS5yZXBsYWNlKC9cXG4kLywgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQgfHwgY3VycmVudC5yZW1vdmVkKSB7XG4gICAgICAgIHZhciBfY3VyUmFuZ2U7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgICAgaWYgKCFvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgdmFyIHByZXYgPSBkaWZmW2kgLSAxXTtcbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gb2xkTGluZTtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBjdXJSYW5nZSA9IG9wdGlvbnMuY29udGV4dCA+IDAgPyBjb250ZXh0TGluZXMocHJldi5saW5lcy5zbGljZSgtb3B0aW9ucy5jb250ZXh0KSkgOiBbXTtcbiAgICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgICAgbmV3UmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuXG5cbiAgICAgICAgKF9jdXJSYW5nZSA9IGN1clJhbmdlKS5wdXNoLmFwcGx5KF9jdXJSYW5nZSwgX3RvQ29uc3VtYWJsZUFycmF5KGxpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICByZXR1cm4gKGN1cnJlbnQuYWRkZWQgPyAnKycgOiAnLScpICsgZW50cnk7XG4gICAgICAgIH0pKSk7IC8vIFRyYWNrIHRoZSB1cGRhdGVkIGZpbGUgcG9zaXRpb25cblxuXG4gICAgICAgIGlmIChjdXJyZW50LmFkZGVkKSB7XG4gICAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElkZW50aWNhbCBjb250ZXh0IGxpbmVzLiBUcmFjayBsaW5lIGNoYW5nZXNcbiAgICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAvLyBDbG9zZSBvdXQgYW55IGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0IChvciBqb2luIG92ZXJsYXBwaW5nKVxuICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0ICogMiAmJiBpIDwgZGlmZi5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICB2YXIgX2N1clJhbmdlMjtcblxuICAgICAgICAgICAgLy8gT3ZlcmxhcHBpbmdcbiAgICAgICAgICAgIChfY3VyUmFuZ2UyID0gY3VyUmFuZ2UpLnB1c2guYXBwbHkoX2N1clJhbmdlMiwgX3RvQ29uc3VtYWJsZUFycmF5KGNvbnRleHRMaW5lcyhsaW5lcykpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIF9jdXJSYW5nZTM7XG5cbiAgICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgICAgdmFyIGNvbnRleHRTaXplID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBvcHRpb25zLmNvbnRleHQpO1xuXG4gICAgICAgICAgICAoX2N1clJhbmdlMyA9IGN1clJhbmdlKS5wdXNoLmFwcGx5KF9jdXJSYW5nZTMsIF90b0NvbnN1bWFibGVBcnJheShjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSkpO1xuXG4gICAgICAgICAgICB2YXIgaHVuayA9IHtcbiAgICAgICAgICAgICAgb2xkU3RhcnQ6IG9sZFJhbmdlU3RhcnQsXG4gICAgICAgICAgICAgIG9sZExpbmVzOiBvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplLFxuICAgICAgICAgICAgICBuZXdTdGFydDogbmV3UmFuZ2VTdGFydCxcbiAgICAgICAgICAgICAgbmV3TGluZXM6IG5ld0xpbmUgLSBuZXdSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgLy8gRU9GIGlzIGluc2lkZSB0aGlzIGh1bmtcbiAgICAgICAgICAgICAgdmFyIG9sZEVPRk5ld2xpbmUgPSAvXFxuJC8udGVzdChvbGRTdHIpO1xuICAgICAgICAgICAgICB2YXIgbmV3RU9GTmV3bGluZSA9IC9cXG4kLy50ZXN0KG5ld1N0cik7XG4gICAgICAgICAgICAgIHZhciBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG5cbiAgICAgICAgICAgICAgaWYgKCFvbGRFT0ZOZXdsaW5lICYmIG5vTmxCZWZvcmVBZGRzKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAgIGN1clJhbmdlLnNwbGljZShodW5rLm9sZExpbmVzLCAwLCAnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzIHx8ICFuZXdFT0ZOZXdsaW5lKSB7XG4gICAgICAgICAgICAgICAgY3VyUmFuZ2UucHVzaCgnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHVua3MucHVzaChodW5rKTtcbiAgICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgICAgbmV3UmFuZ2VTdGFydCA9IDA7XG4gICAgICAgICAgICBjdXJSYW5nZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICBuZXdMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfbG9vcChpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2xkRmlsZU5hbWU6IG9sZEZpbGVOYW1lLFxuICAgICAgbmV3RmlsZU5hbWU6IG5ld0ZpbGVOYW1lLFxuICAgICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsXG4gICAgICBuZXdIZWFkZXI6IG5ld0hlYWRlcixcbiAgICAgIGh1bmtzOiBodW5rc1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICAgIHZhciBkaWZmID0gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbiAgICB2YXIgcmV0ID0gW107XG5cbiAgICBpZiAob2xkRmlsZU5hbWUgPT0gbmV3RmlsZU5hbWUpIHtcbiAgICAgIHJldC5wdXNoKCdJbmRleDogJyArIG9sZEZpbGVOYW1lKTtcbiAgICB9XG5cbiAgICByZXQucHVzaCgnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgIHJldC5wdXNoKCctLS0gJyArIGRpZmYub2xkRmlsZU5hbWUgKyAodHlwZW9mIGRpZmYub2xkSGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm9sZEhlYWRlcikpO1xuICAgIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaHVuayA9IGRpZmYuaHVua3NbaV07XG4gICAgICByZXQucHVzaCgnQEAgLScgKyBodW5rLm9sZFN0YXJ0ICsgJywnICsgaHVuay5vbGRMaW5lcyArICcgKycgKyBodW5rLm5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lcyArICcgQEAnKTtcbiAgICAgIHJldC5wdXNoLmFwcGx5KHJldCwgaHVuay5saW5lcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZVBhdGNoKGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY3JlYXRlVHdvRmlsZXNQYXRjaChmaWxlTmFtZSwgZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUVxdWFsKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBhcnJheVN0YXJ0c1dpdGgoYXJyYXksIHN0YXJ0KSB7XG4gICAgaWYgKHN0YXJ0Lmxlbmd0aCA+IGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdGFydFtpXSAhPT0gYXJyYXlbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY0xpbmVDb3VudChodW5rKSB7XG4gICAgdmFyIF9jYWxjT2xkTmV3TGluZUNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChodW5rLmxpbmVzKSxcbiAgICAgICAgb2xkTGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5vbGRMaW5lcyxcbiAgICAgICAgbmV3TGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5uZXdMaW5lcztcblxuICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBodW5rLm9sZExpbmVzID0gb2xkTGluZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBodW5rLm9sZExpbmVzO1xuICAgIH1cblxuICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBodW5rLm5ld0xpbmVzID0gbmV3TGluZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtZXJnZShtaW5lLCB0aGVpcnMsIGJhc2UpIHtcbiAgICBtaW5lID0gbG9hZFBhdGNoKG1pbmUsIGJhc2UpO1xuICAgIHRoZWlycyA9IGxvYWRQYXRjaCh0aGVpcnMsIGJhc2UpO1xuICAgIHZhciByZXQgPSB7fTsgLy8gRm9yIGluZGV4IHdlIGp1c3QgbGV0IGl0IHBhc3MgdGhyb3VnaCBhcyBpdCBkb2Vzbid0IGhhdmUgYW55IG5lY2Vzc2FyeSBtZWFuaW5nLlxuICAgIC8vIExlYXZpbmcgc2FuaXR5IGNoZWNrcyBvbiB0aGlzIHRvIHRoZSBBUEkgY29uc3VtZXIgdGhhdCBtYXkga25vdyBtb3JlIGFib3V0IHRoZVxuICAgIC8vIG1lYW5pbmcgaW4gdGhlaXIgb3duIGNvbnRleHQuXG5cbiAgICBpZiAobWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXgpIHtcbiAgICAgIHJldC5pbmRleCA9IG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4O1xuICAgIH1cblxuICAgIGlmIChtaW5lLm5ld0ZpbGVOYW1lIHx8IHRoZWlycy5uZXdGaWxlTmFtZSkge1xuICAgICAgaWYgKCFmaWxlTmFtZUNoYW5nZWQobWluZSkpIHtcbiAgICAgICAgLy8gTm8gaGVhZGVyIG9yIG5vIGNoYW5nZSBpbiBvdXJzLCB1c2UgdGhlaXJzIChhbmQgb3VycyBpZiB0aGVpcnMgZG9lcyBub3QgZXhpc3QpXG4gICAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHRoZWlycy5vbGRGaWxlTmFtZSB8fCBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgICByZXQubmV3RmlsZU5hbWUgPSB0aGVpcnMubmV3RmlsZU5hbWUgfHwgbWluZS5uZXdGaWxlTmFtZTtcbiAgICAgICAgcmV0Lm9sZEhlYWRlciA9IHRoZWlycy5vbGRIZWFkZXIgfHwgbWluZS5vbGRIZWFkZXI7XG4gICAgICAgIHJldC5uZXdIZWFkZXIgPSB0aGVpcnMubmV3SGVhZGVyIHx8IG1pbmUubmV3SGVhZGVyO1xuICAgICAgfSBlbHNlIGlmICghZmlsZU5hbWVDaGFuZ2VkKHRoZWlycykpIHtcbiAgICAgICAgLy8gTm8gaGVhZGVyIG9yIG5vIGNoYW5nZSBpbiB0aGVpcnMsIHVzZSBvdXJzXG4gICAgICAgIHJldC5vbGRGaWxlTmFtZSA9IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICAgIHJldC5uZXdGaWxlTmFtZSA9IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICAgIHJldC5vbGRIZWFkZXIgPSBtaW5lLm9sZEhlYWRlcjtcbiAgICAgICAgcmV0Lm5ld0hlYWRlciA9IG1pbmUubmV3SGVhZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQm90aCBjaGFuZ2VkLi4uIGZpZ3VyZSBpdCBvdXRcbiAgICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEZpbGVOYW1lLCB0aGVpcnMub2xkRmlsZU5hbWUpO1xuICAgICAgICByZXQubmV3RmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3RmlsZU5hbWUsIHRoZWlycy5uZXdGaWxlTmFtZSk7XG4gICAgICAgIHJldC5vbGRIZWFkZXIgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkSGVhZGVyLCB0aGVpcnMub2xkSGVhZGVyKTtcbiAgICAgICAgcmV0Lm5ld0hlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdIZWFkZXIsIHRoZWlycy5uZXdIZWFkZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldC5odW5rcyA9IFtdO1xuICAgIHZhciBtaW5lSW5kZXggPSAwLFxuICAgICAgICB0aGVpcnNJbmRleCA9IDAsXG4gICAgICAgIG1pbmVPZmZzZXQgPSAwLFxuICAgICAgICB0aGVpcnNPZmZzZXQgPSAwO1xuXG4gICAgd2hpbGUgKG1pbmVJbmRleCA8IG1pbmUuaHVua3MubGVuZ3RoIHx8IHRoZWlyc0luZGV4IDwgdGhlaXJzLmh1bmtzLmxlbmd0aCkge1xuICAgICAgdmFyIG1pbmVDdXJyZW50ID0gbWluZS5odW5rc1ttaW5lSW5kZXhdIHx8IHtcbiAgICAgICAgb2xkU3RhcnQ6IEluZmluaXR5XG4gICAgICB9LFxuICAgICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHtcbiAgICAgICAgb2xkU3RhcnQ6IEluZmluaXR5XG4gICAgICB9O1xuXG4gICAgICBpZiAoaHVua0JlZm9yZShtaW5lQ3VycmVudCwgdGhlaXJzQ3VycmVudCkpIHtcbiAgICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKG1pbmVDdXJyZW50LCBtaW5lT2Zmc2V0KSk7XG4gICAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgICB0aGVpcnNPZmZzZXQgKz0gbWluZUN1cnJlbnQubmV3TGluZXMgLSBtaW5lQ3VycmVudC5vbGRMaW5lcztcbiAgICAgIH0gZWxzZSBpZiAoaHVua0JlZm9yZSh0aGVpcnNDdXJyZW50LCBtaW5lQ3VycmVudCkpIHtcbiAgICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKHRoZWlyc0N1cnJlbnQsIHRoZWlyc09mZnNldCkpO1xuICAgICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgICBtaW5lT2Zmc2V0ICs9IHRoZWlyc0N1cnJlbnQubmV3TGluZXMgLSB0aGVpcnNDdXJyZW50Lm9sZExpbmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3ZlcmxhcCwgbWVyZ2UgYXMgYmVzdCB3ZSBjYW5cbiAgICAgICAgdmFyIG1lcmdlZEh1bmsgPSB7XG4gICAgICAgICAgb2xkU3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0KSxcbiAgICAgICAgICBvbGRMaW5lczogMCxcbiAgICAgICAgICBuZXdTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQubmV3U3RhcnQgKyBtaW5lT2Zmc2V0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0ICsgdGhlaXJzT2Zmc2V0KSxcbiAgICAgICAgICBuZXdMaW5lczogMCxcbiAgICAgICAgICBsaW5lczogW11cbiAgICAgICAgfTtcbiAgICAgICAgbWVyZ2VMaW5lcyhtZXJnZWRIdW5rLCBtaW5lQ3VycmVudC5vbGRTdGFydCwgbWluZUN1cnJlbnQubGluZXMsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQubGluZXMpO1xuICAgICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgICBtaW5lSW5kZXgrKztcbiAgICAgICAgcmV0Lmh1bmtzLnB1c2gobWVyZ2VkSHVuayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRQYXRjaChwYXJhbSwgYmFzZSkge1xuICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoL15AQC9tLnRlc3QocGFyYW0pIHx8IC9eSW5kZXg6L20udGVzdChwYXJhbSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlUGF0Y2gocGFyYW0pWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWJhc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cnVjdHVyZWRQYXRjaCh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbGVOYW1lQ2hhbmdlZChwYXRjaCkge1xuICAgIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RGaWVsZChpbmRleCwgbWluZSwgdGhlaXJzKSB7XG4gICAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuICAgICAgcmV0dXJuIG1pbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1pbmU6IG1pbmUsXG4gICAgICAgIHRoZWlyczogdGhlaXJzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGh1bmtCZWZvcmUodGVzdCwgY2hlY2spIHtcbiAgICByZXR1cm4gdGVzdC5vbGRTdGFydCA8IGNoZWNrLm9sZFN0YXJ0ICYmIHRlc3Qub2xkU3RhcnQgKyB0ZXN0Lm9sZExpbmVzIDwgY2hlY2sub2xkU3RhcnQ7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZUh1bmsoaHVuaywgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9sZFN0YXJ0OiBodW5rLm9sZFN0YXJ0LFxuICAgICAgb2xkTGluZXM6IGh1bmsub2xkTGluZXMsXG4gICAgICBuZXdTdGFydDogaHVuay5uZXdTdGFydCArIG9mZnNldCxcbiAgICAgIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuICAgICAgbGluZXM6IGh1bmsubGluZXNcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VMaW5lcyhodW5rLCBtaW5lT2Zmc2V0LCBtaW5lTGluZXMsIHRoZWlyT2Zmc2V0LCB0aGVpckxpbmVzKSB7XG4gICAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcbiAgICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cbiAgICB2YXIgbWluZSA9IHtcbiAgICAgIG9mZnNldDogbWluZU9mZnNldCxcbiAgICAgIGxpbmVzOiBtaW5lTGluZXMsXG4gICAgICBpbmRleDogMFxuICAgIH0sXG4gICAgICAgIHRoZWlyID0ge1xuICAgICAgb2Zmc2V0OiB0aGVpck9mZnNldCxcbiAgICAgIGxpbmVzOiB0aGVpckxpbmVzLFxuICAgICAgaW5kZXg6IDBcbiAgICB9OyAvLyBIYW5kbGUgYW55IGxlYWRpbmcgY29udGVudFxuXG4gICAgaW5zZXJ0TGVhZGluZyhodW5rLCBtaW5lLCB0aGVpcik7XG4gICAgaW5zZXJ0TGVhZGluZyhodW5rLCB0aGVpciwgbWluZSk7IC8vIE5vdyBpbiB0aGUgb3ZlcmxhcCBjb250ZW50LiBTY2FuIHRocm91Z2ggYW5kIHNlbGVjdCB0aGUgYmVzdCBjaGFuZ2VzIGZyb20gZWFjaC5cblxuICAgIHdoaWxlIChtaW5lLmluZGV4IDwgbWluZS5saW5lcy5sZW5ndGggJiYgdGhlaXIuaW5kZXggPCB0aGVpci5saW5lcy5sZW5ndGgpIHtcbiAgICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUubGluZXNbbWluZS5pbmRleF0sXG4gICAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG4gICAgICBpZiAoKG1pbmVDdXJyZW50WzBdID09PSAnLScgfHwgbWluZUN1cnJlbnRbMF0gPT09ICcrJykgJiYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nIHx8IHRoZWlyQ3VycmVudFswXSA9PT0gJysnKSkge1xuICAgICAgICAvLyBCb3RoIG1vZGlmaWVkIC4uLlxuICAgICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJysnICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAgIHZhciBfaHVuayRsaW5lcztcblxuICAgICAgICAvLyBNaW5lIGluc2VydGVkXG4gICAgICAgIChfaHVuayRsaW5lcyA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMsIF90b0NvbnN1bWFibGVBcnJheShjb2xsZWN0Q2hhbmdlKG1pbmUpKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgICAgdmFyIF9odW5rJGxpbmVzMjtcblxuICAgICAgICAvLyBUaGVpcnMgaW5zZXJ0ZWRcbiAgICAgICAgKF9odW5rJGxpbmVzMiA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMyLCBfdG9Db25zdW1hYmxlQXJyYXkoY29sbGVjdENoYW5nZSh0aGVpcikpKTtcbiAgICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICctJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgICAgfSBlbHNlIGlmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyAmJiBtaW5lQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudCA9PT0gdGhlaXJDdXJyZW50KSB7XG4gICAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcbiAgICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcbiAgICAgICAgbWluZS5pbmRleCsrO1xuICAgICAgICB0aGVpci5pbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ29udGV4dCBtaXNtYXRjaFxuICAgICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgICB9XG4gICAgfSAvLyBOb3cgcHVzaCBhbnl0aGluZyB0aGF0IG1heSBiZSByZW1haW5pbmdcblxuXG4gICAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG4gICAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgdGhlaXIpO1xuICAgIGNhbGNMaW5lQ291bnQoaHVuayk7XG4gIH1cblxuICBmdW5jdGlvbiBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgICB2YXIgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cbiAgICBpZiAoYWxsUmVtb3ZlcyhteUNoYW5nZXMpICYmIGFsbFJlbW92ZXModGhlaXJDaGFuZ2VzKSkge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciByZW1vdmUgY2hhbmdlcyB0aGF0IGFyZSBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXJcbiAgICAgIGlmIChhcnJheVN0YXJ0c1dpdGgobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldCh0aGVpciwgbXlDaGFuZ2VzLCBteUNoYW5nZXMubGVuZ3RoIC0gdGhlaXJDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIF9odW5rJGxpbmVzMztcblxuICAgICAgICAoX2h1bmskbGluZXMzID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczMsIF90b0NvbnN1bWFibGVBcnJheShteUNoYW5nZXMpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGFycmF5U3RhcnRzV2l0aCh0aGVpckNoYW5nZXMsIG15Q2hhbmdlcykgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KG1pbmUsIHRoZWlyQ2hhbmdlcywgdGhlaXJDaGFuZ2VzLmxlbmd0aCAtIG15Q2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBfaHVuayRsaW5lczQ7XG5cbiAgICAgICAgKF9odW5rJGxpbmVzNCA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXM0LCBfdG9Db25zdW1hYmxlQXJyYXkodGhlaXJDaGFuZ2VzKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJyYXlFcXVhbChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lczU7XG5cbiAgICAgIChfaHVuayRsaW5lczUgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzNSwgX3RvQ29uc3VtYWJsZUFycmF5KG15Q2hhbmdlcykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uZmxpY3QoaHVuaywgbXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICAgIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q29udGV4dCh0aGVpciwgbXlDaGFuZ2VzKTtcblxuICAgIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgICB2YXIgX2h1bmskbGluZXM2O1xuXG4gICAgICAoX2h1bmskbGluZXM2ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczYsIF90b0NvbnN1bWFibGVBcnJheSh0aGVpckNoYW5nZXMubWVyZ2VkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZsaWN0KGh1bmssIHN3YXAgPyB0aGVpckNoYW5nZXMgOiBteUNoYW5nZXMsIHN3YXAgPyBteUNoYW5nZXMgOiB0aGVpckNoYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbmZsaWN0KGh1bmssIG1pbmUsIHRoZWlyKSB7XG4gICAgaHVuay5jb25mbGljdCA9IHRydWU7XG4gICAgaHVuay5saW5lcy5wdXNoKHtcbiAgICAgIGNvbmZsaWN0OiB0cnVlLFxuICAgICAgbWluZTogbWluZSxcbiAgICAgIHRoZWlyczogdGhlaXJcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuICAgIHdoaWxlIChpbnNlcnQub2Zmc2V0IDwgdGhlaXIub2Zmc2V0ICYmIGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcbiAgICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgICAgIGluc2VydC5vZmZzZXQrKztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRUcmFpbGluZyhodW5rLCBpbnNlcnQpIHtcbiAgICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgICAgdmFyIGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgICAgaHVuay5saW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbGxlY3RDaGFuZ2Uoc3RhdGUpIHtcbiAgICB2YXIgcmV0ID0gW10sXG4gICAgICAgIG9wZXJhdGlvbiA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XVswXTtcblxuICAgIHdoaWxlIChzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgICAgdmFyIGxpbmUgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF07IC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJy0nICYmIGxpbmVbMF0gPT09ICcrJykge1xuICAgICAgICBvcGVyYXRpb24gPSAnKyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09IGxpbmVbMF0pIHtcbiAgICAgICAgcmV0LnB1c2gobGluZSk7XG4gICAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdENvbnRleHQoc3RhdGUsIG1hdGNoQ2hhbmdlcykge1xuICAgIHZhciBjaGFuZ2VzID0gW10sXG4gICAgICAgIG1lcmdlZCA9IFtdLFxuICAgICAgICBtYXRjaEluZGV4ID0gMCxcbiAgICAgICAgY29udGV4dENoYW5nZXMgPSBmYWxzZSxcbiAgICAgICAgY29uZmxpY3RlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoICYmIHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hhbmdlID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdLFxuICAgICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdOyAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG5cbiAgICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuICAgICAgbWVyZ2VkLnB1c2gobWF0Y2gpO1xuICAgICAgbWF0Y2hJbmRleCsrOyAvLyBDb25zdW1lIGFueSBhZGRpdGlvbnMgaW4gdGhlIG90aGVyIGJsb2NrIGFzIGEgY29uZmxpY3QgdG8gYXR0ZW1wdFxuICAgICAgLy8gdG8gcHVsbCBpbiB0aGUgcmVtYWluaW5nIGNvbnRleHQgYWZ0ZXIgdGhpc1xuXG4gICAgICBpZiAoY2hhbmdlWzBdID09PSAnKycpIHtcbiAgICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cbiAgICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgc3RhdGUuaW5kZXgrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnICYmIGNvbnRleHRDaGFuZ2VzKSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmxpY3RlZCkge1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfVxuXG4gICAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoKSB7XG4gICAgICBtZXJnZWQucHVzaChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleCsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lcmdlZDogbWVyZ2VkLFxuICAgICAgY2hhbmdlczogY2hhbmdlc1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhbGxSZW1vdmVzKGNoYW5nZXMpIHtcbiAgICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGNoYW5nZSkge1xuICAgICAgcmV0dXJuIHByZXYgJiYgY2hhbmdlWzBdID09PSAnLSc7XG4gICAgfSwgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBza2lwUmVtb3ZlU3VwZXJzZXQoc3RhdGUsIHJlbW92ZUNoYW5nZXMsIGRlbHRhKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7XG4gICAgICB2YXIgY2hhbmdlQ29udGVudCA9IHJlbW92ZUNoYW5nZXNbcmVtb3ZlQ2hhbmdlcy5sZW5ndGggLSBkZWx0YSArIGldLnN1YnN0cigxKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4ICsgaV0gIT09ICcgJyArIGNoYW5nZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuICAgIHZhciBvbGRMaW5lcyA9IDA7XG4gICAgdmFyIG5ld0xpbmVzID0gMDtcbiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBpZiAodHlwZW9mIGxpbmUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBteUNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLm1pbmUpO1xuICAgICAgICB2YXIgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG4gICAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKG15Q291bnQub2xkTGluZXMgPT09IHRoZWlyQ291bnQub2xkTGluZXMpIHtcbiAgICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9sZExpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcbiAgICAgICAgICAgIG5ld0xpbmVzICs9IG15Q291bnQubmV3TGluZXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICcrJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG4gICAgICAgICAgbmV3TGluZXMrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnLScgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICAgIG9sZExpbmVzKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgb2xkTGluZXM6IG9sZExpbmVzLFxuICAgICAgbmV3TGluZXM6IG5ld0xpbmVzXG4gICAgfTtcbiAgfVxuXG4gIC8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG4gIGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9ETVAoY2hhbmdlcykge1xuICAgIHZhciByZXQgPSBbXSxcbiAgICAgICAgY2hhbmdlLFxuICAgICAgICBvcGVyYXRpb247XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG5cbiAgICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgICAgb3BlcmF0aW9uID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgICAgb3BlcmF0aW9uID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcGVyYXRpb24gPSAwO1xuICAgICAgfVxuXG4gICAgICByZXQucHVzaChbb3BlcmF0aW9uLCBjaGFuZ2UudmFsdWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydENoYW5nZXNUb1hNTChjaGFuZ2VzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTtcblxuICAgICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgICByZXQucHVzaCgnPGlucz4nKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgICAgcmV0LnB1c2goJzxkZWw+Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldC5wdXNoKGVzY2FwZUhUTUwoY2hhbmdlLnZhbHVlKSk7XG5cbiAgICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgICAgcmV0LnB1c2goJzwvaW5zPicpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgICByZXQucHVzaCgnPC9kZWw+Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldC5qb2luKCcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVzY2FwZUhUTUwocykge1xuICAgIHZhciBuID0gcztcbiAgICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICAgIG4gPSBuLnJlcGxhY2UoLzwvZywgJyZsdDsnKTtcbiAgICBuID0gbi5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gICAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICAgIHJldHVybiBuO1xuICB9XG5cbiAgLyogU2VlIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMgb2YgdXNlICovXG5cbiAgZXhwb3J0cy5EaWZmID0gRGlmZjtcbiAgZXhwb3J0cy5kaWZmQ2hhcnMgPSBkaWZmQ2hhcnM7XG4gIGV4cG9ydHMuZGlmZldvcmRzID0gZGlmZldvcmRzO1xuICBleHBvcnRzLmRpZmZXb3Jkc1dpdGhTcGFjZSA9IGRpZmZXb3Jkc1dpdGhTcGFjZTtcbiAgZXhwb3J0cy5kaWZmTGluZXMgPSBkaWZmTGluZXM7XG4gIGV4cG9ydHMuZGlmZlRyaW1tZWRMaW5lcyA9IGRpZmZUcmltbWVkTGluZXM7XG4gIGV4cG9ydHMuZGlmZlNlbnRlbmNlcyA9IGRpZmZTZW50ZW5jZXM7XG4gIGV4cG9ydHMuZGlmZkNzcyA9IGRpZmZDc3M7XG4gIGV4cG9ydHMuZGlmZkpzb24gPSBkaWZmSnNvbjtcbiAgZXhwb3J0cy5kaWZmQXJyYXlzID0gZGlmZkFycmF5cztcbiAgZXhwb3J0cy5zdHJ1Y3R1cmVkUGF0Y2ggPSBzdHJ1Y3R1cmVkUGF0Y2g7XG4gIGV4cG9ydHMuY3JlYXRlVHdvRmlsZXNQYXRjaCA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2g7XG4gIGV4cG9ydHMuY3JlYXRlUGF0Y2ggPSBjcmVhdGVQYXRjaDtcbiAgZXhwb3J0cy5hcHBseVBhdGNoID0gYXBwbHlQYXRjaDtcbiAgZXhwb3J0cy5hcHBseVBhdGNoZXMgPSBhcHBseVBhdGNoZXM7XG4gIGV4cG9ydHMucGFyc2VQYXRjaCA9IHBhcnNlUGF0Y2g7XG4gIGV4cG9ydHMubWVyZ2UgPSBtZXJnZTtcbiAgZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvRE1QID0gY29udmVydENoYW5nZXNUb0RNUDtcbiAgZXhwb3J0cy5jb252ZXJ0Q2hhbmdlc1RvWE1MID0gY29udmVydENoYW5nZXNUb1hNTDtcbiAgZXhwb3J0cy5jYW5vbmljYWxpemUgPSBjYW5vbmljYWxpemU7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmQ7XG5cbi8qXG4gIHZhciBvYmogPSB7YTogMywgYjogNX07XG4gIGV4dGVuZChvYmosIHthOiA0LCBjOiA4fSk7IC8vIHthOiA0LCBiOiA1LCBjOiA4fVxuICBvYmo7IC8vIHthOiA0LCBiOiA1LCBjOiA4fVxuXG4gIHZhciBvYmogPSB7YTogMywgYjogNX07XG4gIGV4dGVuZCh7fSwgb2JqLCB7YTogNCwgYzogOH0pOyAvLyB7YTogNCwgYjogNSwgYzogOH1cbiAgb2JqOyAvLyB7YTogMywgYjogNX1cblxuICB2YXIgYXJyID0gWzEsIDIsIDNdO1xuICB2YXIgb2JqID0ge2E6IDMsIGI6IDV9O1xuICBleHRlbmQob2JqLCB7YzogYXJyfSk7IC8vIHthOiAzLCBiOiA1LCBjOiBbMSwgMiwgM119XG4gIGFyci5wdXNoKDQpO1xuICBvYmo7IC8vIHthOiAzLCBiOiA1LCBjOiBbMSwgMiwgMywgNF19XG5cbiAgdmFyIGFyciA9IFsxLCAyLCAzXTtcbiAgdmFyIG9iaiA9IHthOiAzLCBiOiA1fTtcbiAgZXh0ZW5kKHRydWUsIG9iaiwge2M6IGFycn0pOyAvLyB7YTogMywgYjogNSwgYzogWzEsIDIsIDNdfVxuICBhcnIucHVzaCg0KTtcbiAgb2JqOyAvLyB7YTogMywgYjogNSwgYzogWzEsIDIsIDNdfVxuXG4gIGV4dGVuZCh7YTogNCwgYjogNX0pOyAvLyB7YTogNCwgYjogNX1cbiAgZXh0ZW5kKHthOiA0LCBiOiA1fSwgMyk7IHthOiA0LCBiOiA1fVxuICBleHRlbmQoe2E6IDQsIGI6IDV9LCB0cnVlKTsge2E6IDQsIGI6IDV9XG4gIGV4dGVuZCgnaGVsbG8nLCB7YTogNCwgYjogNX0pOyAvLyB0aHJvd3NcbiAgZXh0ZW5kKDMsIHthOiA0LCBiOiA1fSk7IC8vIHRocm93c1xuKi9cblxuZnVuY3Rpb24gZXh0ZW5kKC8qIFtkZWVwXSwgb2JqMSwgb2JqMiwgW29iam5dICovKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICB2YXIgZGVlcCA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGFyZ3NbMF0gPT0gJ2Jvb2xlYW4nKSB7XG4gICAgZGVlcCA9IGFyZ3Muc2hpZnQoKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gYXJnc1swXTtcbiAgaWYgKGlzVW5leHRlbmRhYmxlKHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4dGVuZGVlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cbiAgdmFyIGV4dGVuZGVycyA9IGFyZ3Muc2xpY2UoMSk7XG4gIHZhciBsZW4gPSBleHRlbmRlcnMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGV4dGVuZGVyID0gZXh0ZW5kZXJzW2ldO1xuICAgIGZvciAodmFyIGtleSBpbiBleHRlbmRlcikge1xuICAgICAgaWYgKGV4dGVuZGVyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZXh0ZW5kZXJba2V5XTtcbiAgICAgICAgaWYgKGRlZXAgJiYgaXNDbG9uZWFibGUodmFsdWUpKSB7XG4gICAgICAgICAgdmFyIGJhc2UgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFtdIDoge307XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBleHRlbmQoXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0Lmhhc093blByb3BlcnR5KGtleSkgJiYgIWlzVW5leHRlbmRhYmxlKHJlc3VsdFtrZXldKVxuICAgICAgICAgICAgICA/IHJlc3VsdFtrZXldXG4gICAgICAgICAgICAgIDogYmFzZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2xvbmVhYmxlKG9iaikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8IHt9LnRvU3RyaW5nLmNhbGwob2JqKSA9PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gaXNVbmV4dGVuZGFibGUodmFsKSB7XG4gIHJldHVybiAhdmFsIHx8ICh0eXBlb2YgdmFsICE9ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT0gJ2Z1bmN0aW9uJyk7XG59XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLyxcbiAgICByZUxlYWRpbmdEb3QgPSAvXlxcLi8sXG4gICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QgaW4gSUUgPCA5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNIb3N0T2JqZWN0KHZhbHVlKSB7XG4gIC8vIE1hbnkgaG9zdCBvYmplY3RzIGFyZSBgT2JqZWN0YCBvYmplY3RzIHRoYXQgY2FuIGNvZXJjZSB0byBzdHJpbmdzXG4gIC8vIGRlc3BpdGUgaGF2aW5nIGltcHJvcGVybHkgZGVmaW5lZCBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gISEodmFsdWUgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbCxcbiAgICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyksXG4gICAgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHJldHVybiB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gZGF0YVtrZXldICE9PSB1bmRlZmluZWQgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gW107XG59XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICBnZXRNYXBEYXRhKHRoaXMsIGtleSkuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gaXNLZXkocGF0aCwgb2JqZWN0KSA/IFtwYXRoXSA6IGNhc3RQYXRoKHBhdGgpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvU3RyaW5nYCB3aGljaCBkb2Vzbid0IGNvbnZlcnQgbnVsbGlzaFxuICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBzdHJpbmdUb1BhdGgodmFsdWUpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemUoZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAocmVMZWFkaW5nRG90LnRlc3Qoc3RyaW5nKSkge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEFzc2lnbiBjYWNoZSB0byBgXy5tZW1vaXplYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICogLy8gPT4gJ2RlZmF1bHQnXG4gKi9cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gY2FjaGUgYSByZWZlcmVuY2UgdG8gc2V0VGltZW91dCwgc28gdGhhdCBvdXIgcmVmZXJlbmNlIHdvbid0IGJlIHN0dWJiZWQgb3V0XG4vLyB3aGVuIHVzaW5nIGZha2UgdGltZXJzIGFuZCBlcnJvcnMgd2lsbCBzdGlsbCBnZXQgbG9nZ2VkXG4vLyBodHRwczovL2dpdGh1Yi5jb20vY2pvaGFuc2VuL1Npbm9uLkpTL2lzc3Vlcy8zODFcbnZhciByZWFsU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUxvZ2dlcihjb25maWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgLy8gRnVuY3Rpb24gd2hpY2ggcHJpbnRzIGVycm9ycy5cbiAgICBpZiAoIWNvbmZpZy5oYXNPd25Qcm9wZXJ0eShcImxvZ2dlclwiKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgY29uZmlnLmxvZ2dlciA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICAgIC8vIFdoZW4gc2V0IHRvIHRydWUsIGFueSBlcnJvcnMgbG9nZ2VkIHdpbGwgYmUgdGhyb3duIGltbWVkaWF0ZWx5O1xuICAgIC8vIElmIHNldCB0byBmYWxzZSwgdGhlIGVycm9ycyB3aWxsIGJlIHRocm93biBpbiBzZXBhcmF0ZSBleGVjdXRpb24gZnJhbWUuXG4gICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoXCJ1c2VJbW1lZGlhdGVFeGNlcHRpb25zXCIpKSB7XG4gICAgICAgIGNvbmZpZy51c2VJbW1lZGlhdGVFeGNlcHRpb25zID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gd3JhcCByZWFsU2V0VGltZW91dCB3aXRoIHNvbWV0aGluZyB3ZSBjYW4gc3R1YiBpbiB0ZXN0c1xuICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KFwic2V0VGltZW91dFwiKSkge1xuICAgICAgICBjb25maWcuc2V0VGltZW91dCA9IHJlYWxTZXRUaW1lb3V0O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBsb2dFcnJvcihsYWJlbCwgZSkge1xuICAgICAgICB2YXIgbXNnID0gbGFiZWwgKyBcIiB0aHJldyBleGNlcHRpb246IFwiO1xuICAgICAgICB2YXIgZXJyID0ge1xuICAgICAgICAgICAgbmFtZTogZS5uYW1lIHx8IGxhYmVsLFxuICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlIHx8IGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YWNrOiBlLnN0YWNrXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gdGhyb3dMb2dnZWRFcnJvcigpIHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlID0gbXNnICsgZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcubG9nZ2VyKG1zZyArIFwiW1wiICsgZXJyLm5hbWUgKyBcIl0gXCIgKyBlcnIubWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlcihlcnIuc3RhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy51c2VJbW1lZGlhdGVFeGNlcHRpb25zKSB7XG4gICAgICAgICAgICB0aHJvd0xvZ2dlZEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuc2V0VGltZW91dCh0aHJvd0xvZ2dlZEVycm9yLCAwKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uZmlndXJlTG9nZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBFdmVudCA9IHJlcXVpcmUoXCIuL2V2ZW50XCIpO1xuXG5mdW5jdGlvbiBDdXN0b21FdmVudCh0eXBlLCBjdXN0b21EYXRhLCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHRhcmdldCk7XG4gICAgdGhpcy5kZXRhaWwgPSBjdXN0b21EYXRhLmRldGFpbCB8fCBudWxsO1xufVxuXG5DdXN0b21FdmVudC5wcm90b3R5cGUgPSBuZXcgRXZlbnQoKTtcblxuQ3VzdG9tRXZlbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3VzdG9tRXZlbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gQ3VzdG9tRXZlbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICE9PSBPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhcHR1cmU6IEJvb2xlYW4ob3B0aW9ucyksXG4gICAgICAgICAgICBvbmNlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNhcHR1cmU6IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKSxcbiAgICAgICAgb25jZTogQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICBwYXNzaXZlOiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSlcbiAgICB9O1xufVxuZnVuY3Rpb24gbm90KGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gIWZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhc0xpc3RlbmVyRmlsdGVyKGxpc3RlbmVyLCBjYXB0dXJlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGxpc3RlbmVyU3BlYykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbGlzdGVuZXJTcGVjLmNhcHR1cmUgPT09IGNhcHR1cmUgJiZcbiAgICAgICAgICAgIGxpc3RlbmVyU3BlYy5saXN0ZW5lciA9PT0gbGlzdGVuZXJcbiAgICAgICAgKTtcbiAgICB9O1xufVxuXG52YXIgRXZlbnRUYXJnZXQgPSB7XG4gICAgLy8gaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnR0YXJnZXQtYWRkZXZlbnRsaXN0ZW5lclxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgcHJvdmlkZWRPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIC8vIDMuIExldCBjYXB0dXJlLCBwYXNzaXZlLCBhbmQgb25jZSBiZSB0aGUgcmVzdWx0IG9mIGZsYXR0ZW5pbmcgbW9yZSBvcHRpb25zLlxuICAgICAgICAvLyBGbGF0dGVuIHByb3BlcnR5IGJlZm9yZSBleGVjdXRpbmcgc3RlcCAyLFxuICAgICAgICAvLyBmZXR1cmUgZGV0ZWN0aW9uIGlzIHVzdWFsbHkgYmFzZWQgb24gcmVnaXN0ZXJpbmcgaGFuZGxlciB3aXRoIG9wdGlvbnMgb2JqZWN0LFxuICAgICAgICAvLyB0aGF0IGhhcyBnZXR0ZXIgZGVmaW5lZFxuICAgICAgICAvLyBhZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7fSwge1xuICAgICAgICAvLyAgICBnZXQgb25jZSgpIHsgc3VwcG9ydHNPbmNlID0gdHJ1ZTsgfVxuICAgICAgICAvLyB9KTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBmbGF0dGVuT3B0aW9ucyhwcm92aWRlZE9wdGlvbnMpO1xuXG4gICAgICAgIC8vIDIuIElmIGNhbGxiYWNrIGlzIG51bGwsIHRoZW4gcmV0dXJuLlxuICAgICAgICBpZiAobGlzdGVuZXIgPT09IG51bGwgfHwgbGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMgfHwge307XG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID0gdGhpcy5ldmVudExpc3RlbmVyc1tldmVudF0gfHwgW107XG5cbiAgICAgICAgLy8gNC4gSWYgY29udGV4dCBvYmplY3TigJlzIGFzc29jaWF0ZWQgbGlzdCBvZiBldmVudCBsaXN0ZW5lclxuICAgICAgICAvLyAgICBkb2VzIG5vdCBjb250YWluIGFuIGV2ZW50IGxpc3RlbmVyIHdob3NlIHR5cGUgaXMgdHlwZSxcbiAgICAgICAgLy8gICAgY2FsbGJhY2sgaXMgY2FsbGJhY2ssIGFuZCBjYXB0dXJlIGlzIGNhcHR1cmUsIHRoZW4gYXBwZW5kXG4gICAgICAgIC8vICAgIGEgbmV3IGV2ZW50IGxpc3RlbmVyIHRvIGl0LCB3aG9zZSB0eXBlIGlzIHR5cGUsIGNhbGxiYWNrIGlzXG4gICAgICAgIC8vICAgIGNhbGxiYWNrLCBjYXB0dXJlIGlzIGNhcHR1cmUsIHBhc3NpdmUgaXMgcGFzc2l2ZSwgYW5kIG9uY2UgaXMgb25jZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdLnNvbWUoXG4gICAgICAgICAgICAgICAgaGFzTGlzdGVuZXJGaWx0ZXIobGlzdGVuZXIsIG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgY2FwdHVyZTogb3B0aW9ucy5jYXB0dXJlLFxuICAgICAgICAgICAgICAgIG9uY2U6IG9wdGlvbnMub25jZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnR0YXJnZXQtcmVtb3ZlZXZlbnRsaXN0ZW5lclxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgcHJvdmlkZWRPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVycyB8fCAhdGhpcy5ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIExldCBjYXB0dXJlIGJlIHRoZSByZXN1bHQgb2YgZmxhdHRlbmluZyBvcHRpb25zLlxuICAgICAgICB2YXIgb3B0aW9ucyA9IGZsYXR0ZW5PcHRpb25zKHByb3ZpZGVkT3B0aW9ucyk7XG5cbiAgICAgICAgLy8gMy4gSWYgdGhlcmUgaXMgYW4gZXZlbnQgbGlzdGVuZXIgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZlxuICAgICAgICAvLyAgICBldmVudCBsaXN0ZW5lcnMgd2hvc2UgdHlwZSBpcyB0eXBlLCBjYWxsYmFjayBpcyBjYWxsYmFjayxcbiAgICAgICAgLy8gICAgYW5kIGNhcHR1cmUgaXMgY2FwdHVyZSwgdGhlbiBzZXQgdGhhdCBldmVudCBsaXN0ZW5lcuKAmXNcbiAgICAgICAgLy8gICAgcmVtb3ZlZCB0byB0cnVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYXNzb2NpYXRlZCBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1tldmVudF0gPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XS5maWx0ZXIoXG4gICAgICAgICAgICBub3QoaGFzTGlzdGVuZXJGaWx0ZXIobGlzdGVuZXIsIG9wdGlvbnMuY2FwdHVyZSkpXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50TGlzdGVuZXJzIHx8ICF0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbihldmVudC5kZWZhdWx0UHJldmVudGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHR5cGUgPSBldmVudC50eXBlO1xuICAgICAgICB2YXIgbGlzdGVuZXJzID0gc2VsZi5ldmVudExpc3RlbmVyc1t0eXBlXTtcblxuICAgICAgICAvLyBSZW1vdmUgbGlzdGVuZXJzLCB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIG9uY2VcbiAgICAgICAgLy8gYmVmb3JlIHJ1bm5pbmcgZGlzcGF0Y2ggbG9vcCB0byBhdm9pZCBuZXN0ZWQgZGlzcGF0Y2ggaXNzdWVzXG4gICAgICAgIHNlbGYuZXZlbnRMaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uKGxpc3RlbmVyU3BlYykge1xuICAgICAgICAgICAgcmV0dXJuICFsaXN0ZW5lclNwZWMub25jZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyU3BlYykge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJTcGVjLmxpc3RlbmVyO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbChzZWxmLCBldmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZXZlbnQuZGVmYXVsdFByZXZlbnRlZCk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFRhcmdldDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBFdmVudCh0eXBlLCBidWJibGVzLCBjYW5jZWxhYmxlLCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBidWJibGVzLCBjYW5jZWxhYmxlLCB0YXJnZXQpO1xufVxuXG5FdmVudC5wcm90b3R5cGUgPSB7XG4gICAgaW5pdEV2ZW50OiBmdW5jdGlvbih0eXBlLCBidWJibGVzLCBjYW5jZWxhYmxlLCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5idWJibGVzID0gYnViYmxlcztcbiAgICAgICAgdGhpcy5jYW5jZWxhYmxlID0gY2FuY2VsYWJsZTtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuY3VycmVudFRhcmdldCA9IHRhcmdldDtcbiAgICB9LFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHt9LFxuXG4gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgRXZlbnQ6IHJlcXVpcmUoXCIuL2V2ZW50XCIpLFxuICAgIFByb2dyZXNzRXZlbnQ6IHJlcXVpcmUoXCIuL3Byb2dyZXNzLWV2ZW50XCIpLFxuICAgIEN1c3RvbUV2ZW50OiByZXF1aXJlKFwiLi9jdXN0b20tZXZlbnRcIiksXG4gICAgRXZlbnRUYXJnZXQ6IHJlcXVpcmUoXCIuL2V2ZW50LXRhcmdldFwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgRXZlbnQgPSByZXF1aXJlKFwiLi9ldmVudFwiKTtcblxuZnVuY3Rpb24gUHJvZ3Jlc3NFdmVudCh0eXBlLCBwcm9ncmVzc0V2ZW50UmF3LCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHRhcmdldCk7XG4gICAgdGhpcy5sb2FkZWQgPVxuICAgICAgICB0eXBlb2YgcHJvZ3Jlc3NFdmVudFJhdy5sb2FkZWQgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgID8gcHJvZ3Jlc3NFdmVudFJhdy5sb2FkZWRcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB0aGlzLnRvdGFsID1cbiAgICAgICAgdHlwZW9mIHByb2dyZXNzRXZlbnRSYXcudG90YWwgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgID8gcHJvZ3Jlc3NFdmVudFJhdy50b3RhbFxuICAgICAgICAgICAgOiBudWxsO1xuICAgIHRoaXMubGVuZ3RoQ29tcHV0YWJsZSA9IEJvb2xlYW4ocHJvZ3Jlc3NFdmVudFJhdy50b3RhbCk7XG59XG5cblByb2dyZXNzRXZlbnQucHJvdG90eXBlID0gbmV3IEV2ZW50KCk7XG5cblByb2dyZXNzRXZlbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHJvZ3Jlc3NFdmVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9ncmVzc0V2ZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBGYWtlVGltZXJzID0gcmVxdWlyZShcIkBzaW5vbmpzL2Zha2UtdGltZXJzXCIpO1xudmFyIGZha2VTZXJ2ZXIgPSByZXF1aXJlKFwiLi9pbmRleFwiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG5mdW5jdGlvbiBTZXJ2ZXIoKSB7fVxuU2VydmVyLnByb3RvdHlwZSA9IGZha2VTZXJ2ZXI7XG5cbnZhciBmYWtlU2VydmVyV2l0aENsb2NrID0gbmV3IFNlcnZlcigpO1xuXG5mYWtlU2VydmVyV2l0aENsb2NrLmFkZFJlcXVlc3QgPSBmdW5jdGlvbiBhZGRSZXF1ZXN0KHhocikge1xuICAgIGlmICh4aHIuYXN5bmMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0LmNsb2NrID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNsb2NrID0gc2V0VGltZW91dC5jbG9jaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvY2sgPSBGYWtlVGltZXJzLmluc3RhbGwoKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDbG9jayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubG9uZ2VzdFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHZhciBjbG9ja1NldFRpbWVvdXQgPSB0aGlzLmNsb2NrLnNldFRpbWVvdXQ7XG4gICAgICAgICAgICB2YXIgY2xvY2tTZXRJbnRlcnZhbCA9IHRoaXMuY2xvY2suc2V0SW50ZXJ2YWw7XG4gICAgICAgICAgICB2YXIgc2VydmVyID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5jbG9jay5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oZm4sIHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIubG9uZ2VzdFRpbWVvdXQgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyLmxvbmdlc3RUaW1lb3V0IHx8IDBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrU2V0VGltZW91dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5jbG9jay5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKGZuLCB0aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgc2VydmVyLmxvbmdlc3RUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlci5sb25nZXN0VGltZW91dCB8fCAwXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjbG9ja1NldEludGVydmFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZha2VTZXJ2ZXIuYWRkUmVxdWVzdC5jYWxsKHRoaXMsIHhocik7XG59O1xuXG5mYWtlU2VydmVyV2l0aENsb2NrLnJlc3BvbmQgPSBmdW5jdGlvbiByZXNwb25kKCkge1xuICAgIHZhciByZXR1cm5WYWwgPSBmYWtlU2VydmVyLnJlc3BvbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGlmICh0aGlzLmNsb2NrKSB7XG4gICAgICAgIHRoaXMuY2xvY2sudGljayh0aGlzLmxvbmdlc3RUaW1lb3V0IHx8IDApO1xuICAgICAgICB0aGlzLmxvbmdlc3RUaW1lb3V0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5yZXNldENsb2NrKSB7XG4gICAgICAgICAgICB0aGlzLmNsb2NrLnVuaW5zdGFsbCgpO1xuICAgICAgICAgICAgdGhpcy5yZXNldENsb2NrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsO1xufTtcblxuZmFrZVNlcnZlcldpdGhDbG9jay5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZSgpIHtcbiAgICBpZiAodGhpcy5jbG9jaykge1xuICAgICAgICB0aGlzLmNsb2NrLnVuaW5zdGFsbCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWtlU2VydmVyLnJlc3RvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmFrZVNlcnZlcldpdGhDbG9jaztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZmFrZVhociA9IHJlcXVpcmUoXCIuLi9mYWtlLXhoclwiKTtcbnZhciBwdXNoID0gW10ucHVzaDtcbnZhciBsb2cgPSByZXF1aXJlKFwiLi9sb2dcIik7XG52YXIgY29uZmlndXJlTG9nRXJyb3IgPSByZXF1aXJlKFwiLi4vY29uZmlndXJlLWxvZ2dlclwiKTtcbnZhciBwYXRoVG9SZWdleHAgPSByZXF1aXJlKFwicGF0aC10by1yZWdleHBcIik7XG5cbnZhciBzdXBwb3J0c0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiO1xuXG5mdW5jdGlvbiByZXNwb25zZUFycmF5KGhhbmRsZXIpIHtcbiAgICB2YXIgcmVzcG9uc2UgPSBoYW5kbGVyO1xuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChoYW5kbGVyKSAhPT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICAgIHJlc3BvbnNlID0gWzIwMCwge30sIGhhbmRsZXJdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzcG9uc2VbMl0gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0c0FycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiRmFrZSBzZXJ2ZXIgcmVzcG9uc2UgYm9keSBzaG91bGQgYmUgYSBzdHJpbmcsIGJ1dCB3YXMgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzcG9uc2VbMl1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIShyZXNwb25zZVsyXSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIkZha2Ugc2VydmVyIHJlc3BvbnNlIGJvZHkgc2hvdWxkIGJlIGEgc3RyaW5nIG9yIEFycmF5QnVmZmVyLCBidXQgd2FzIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3BvbnNlWzJdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0V2luZG93TG9jYXRpb24oKSB7XG4gICAgdmFyIHdpbmxvYyA9IHtcbiAgICAgICAgaG9zdG5hbWU6IFwibG9jYWxob3N0XCIsXG4gICAgICAgIHBvcnQ6IHByb2Nlc3MuZW52LlBPUlQgfHwgODAsXG4gICAgICAgIHByb3RvY29sOiBcImh0dHA6XCJcbiAgICB9O1xuICAgIHdpbmxvYy5ob3N0ID1cbiAgICAgICAgd2lubG9jLmhvc3RuYW1lICtcbiAgICAgICAgKFN0cmluZyh3aW5sb2MucG9ydCkgPT09IFwiODBcIiA/IFwiXCIgOiBcIjpcIiArIHdpbmxvYy5wb3J0KTtcbiAgICByZXR1cm4gd2lubG9jO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dMb2NhdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFdpbmRvd0xvY2F0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gQnJvd3NlcnMgcGxhY2UgbG9jYXRpb24gb24gd2luZG93XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb247XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICB0eXBlb2Ygd2luZG93LndpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2Ygd2luZG93LndpbmRvdy5sb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgb24gQW5kcm9pZCBwbGFjZXMgbG9jYXRpb24gb24gd2luZG93LndpbmRvd1xuICAgICAgICByZXR1cm4gd2luZG93LndpbmRvdy5sb2NhdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RGVmYXVsdFdpbmRvd0xvY2F0aW9uKCk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoT25lKHJlc3BvbnNlLCByZXFNZXRob2QsIHJlcVVybCkge1xuICAgIHZhciBybWV0aCA9IHJlc3BvbnNlLm1ldGhvZDtcbiAgICB2YXIgbWF0Y2hNZXRob2QgPSAhcm1ldGggfHwgcm1ldGgudG9Mb3dlckNhc2UoKSA9PT0gcmVxTWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHVybCA9IHJlc3BvbnNlLnVybDtcbiAgICB2YXIgbWF0Y2hVcmwgPVxuICAgICAgICAhdXJsIHx8XG4gICAgICAgIHVybCA9PT0gcmVxVXJsIHx8XG4gICAgICAgICh0eXBlb2YgdXJsLnRlc3QgPT09IFwiZnVuY3Rpb25cIiAmJiB1cmwudGVzdChyZXFVcmwpKTtcblxuICAgIHJldHVybiBtYXRjaE1ldGhvZCAmJiBtYXRjaFVybDtcbn1cblxuZnVuY3Rpb24gbWF0Y2gocmVzcG9uc2UsIHJlcXVlc3QpIHtcbiAgICB2YXIgd2xvYyA9IGdldFdpbmRvd0xvY2F0aW9uKCk7XG5cbiAgICB2YXIgckN1cnJMb2MgPSBuZXcgUmVnRXhwKFwiXlwiICsgd2xvYy5wcm90b2NvbCArIFwiLy9cIiArIHdsb2MuaG9zdCArIFwiL1wiKTtcblxuICAgIHZhciByZXF1ZXN0VXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICBpZiAoIS9eaHR0cHM/OlxcL1xcLy8udGVzdChyZXF1ZXN0VXJsKSB8fCByQ3VyckxvYy50ZXN0KHJlcXVlc3RVcmwpKSB7XG4gICAgICAgIHJlcXVlc3RVcmwgPSByZXF1ZXN0VXJsLnJlcGxhY2UockN1cnJMb2MsIFwiL1wiKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hPbmUocmVzcG9uc2UsIHRoaXMuZ2V0SFRUUE1ldGhvZChyZXF1ZXN0KSwgcmVxdWVzdFVybCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5yZXNwb25zZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB2YXIgcnUgPSByZXNwb25zZS51cmw7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtyZXF1ZXN0XS5jb25jYXQoXG4gICAgICAgICAgICAgICAgcnUgJiYgdHlwZW9mIHJ1LmV4ZWMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHJ1LmV4ZWMocmVxdWVzdFVybCkuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5yZXNwb25zZS5hcHBseShyZXNwb25zZSwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGluY3JlbWVudFJlcXVlc3RDb3VudCgpIHtcbiAgICB2YXIgY291bnQgPSArK3RoaXMucmVxdWVzdENvdW50O1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWRPbmNlID0gY291bnQgPT09IDE7XG4gICAgdGhpcy5yZXF1ZXN0ZWRUd2ljZSA9IGNvdW50ID09PSAyO1xuICAgIHRoaXMucmVxdWVzdGVkVGhyaWNlID0gY291bnQgPT09IDM7XG5cbiAgICB0aGlzLmZpcnN0UmVxdWVzdCA9IHRoaXMuZ2V0UmVxdWVzdCgwKTtcbiAgICB0aGlzLnNlY29uZFJlcXVlc3QgPSB0aGlzLmdldFJlcXVlc3QoMSk7XG4gICAgdGhpcy50aGlyZFJlcXVlc3QgPSB0aGlzLmdldFJlcXVlc3QoMik7XG5cbiAgICB0aGlzLmxhc3RSZXF1ZXN0ID0gdGhpcy5nZXRSZXF1ZXN0KGNvdW50IC0gMSk7XG59XG5cbnZhciBmYWtlU2VydmVyID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIHZhciBzZXJ2ZXIgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgICAgICBzZXJ2ZXIuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgICAgIHRoaXMueGhyID0gZmFrZVhoci51c2VGYWtlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgc2VydmVyLnJlcXVlc3RzID0gW107XG4gICAgICAgIHNlcnZlci5yZXF1ZXN0Q291bnQgPSAwO1xuICAgICAgICBzZXJ2ZXIucXVldWUgPSBbXTtcbiAgICAgICAgc2VydmVyLnJlc3BvbnNlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMueGhyLm9uQ3JlYXRlID0gZnVuY3Rpb24oeGhyT2JqKSB7XG4gICAgICAgICAgICB4aHJPYmoudW5zYWZlSGVhZGVyc0VuYWJsZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIShzZXJ2ZXIudW5zYWZlSGVhZGVyc0VuYWJsZWQgPT09IGZhbHNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXJ2ZXIuYWRkUmVxdWVzdCh4aHJPYmopO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzZXJ2ZXI7XG4gICAgfSxcblxuICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHdoaXRlbGlzdCA9IHtcbiAgICAgICAgICAgIGF1dG9SZXNwb25kOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1Jlc3BvbmRBZnRlcjogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3BvbmRJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICAgICAgICAgIGZha2VIVFRQTWV0aG9kczogdHJ1ZSxcbiAgICAgICAgICAgIGxvZ2dlcjogdHJ1ZSxcbiAgICAgICAgICAgIHVuc2FmZUhlYWRlcnNFbmFibGVkOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24oc2V0dGluZykge1xuICAgICAgICAgICAgaWYgKHNldHRpbmcgaW4gd2hpdGVsaXN0KSB7XG4gICAgICAgICAgICAgICAgc2VsZltzZXR0aW5nXSA9IGNvbmZpZ1tzZXR0aW5nXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VsZi5sb2dFcnJvciA9IGNvbmZpZ3VyZUxvZ0Vycm9yKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIGFkZFJlcXVlc3Q6IGZ1bmN0aW9uIGFkZFJlcXVlc3QoeGhyT2JqKSB7XG4gICAgICAgIHZhciBzZXJ2ZXIgPSB0aGlzO1xuICAgICAgICBwdXNoLmNhbGwodGhpcy5yZXF1ZXN0cywgeGhyT2JqKTtcblxuICAgICAgICBpbmNyZW1lbnRSZXF1ZXN0Q291bnQuY2FsbCh0aGlzKTtcblxuICAgICAgICB4aHJPYmoub25TZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuaGFuZGxlUmVxdWVzdCh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHNlcnZlci5yZXNwb25kSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIucmVzcG9uZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXIuYXV0b1Jlc3BvbmQgJiYgIXNlcnZlci5yZXNwb25kaW5nKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyLnJlc3BvbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyLnJlc3BvbmQoKTtcbiAgICAgICAgICAgICAgICB9LCBzZXJ2ZXIuYXV0b1Jlc3BvbmRBZnRlciB8fCAxMCk7XG5cbiAgICAgICAgICAgICAgICBzZXJ2ZXIucmVzcG9uZGluZyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIGdldEhUVFBNZXRob2Q6IGZ1bmN0aW9uIGdldEhUVFBNZXRob2QocmVxdWVzdCkge1xuICAgICAgICBpZiAodGhpcy5mYWtlSFRUUE1ldGhvZHMgJiYgL3Bvc3QvaS50ZXN0KHJlcXVlc3QubWV0aG9kKSkge1xuICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSAocmVxdWVzdC5yZXF1ZXN0Qm9keSB8fCBcIlwiKS5tYXRjaChcbiAgICAgICAgICAgICAgICAvX21ldGhvZD0oW15cXGI7XSspL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6IHJlcXVlc3QubWV0aG9kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QubWV0aG9kO1xuICAgIH0sXG5cbiAgICBoYW5kbGVSZXF1ZXN0OiBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KHhocikge1xuICAgICAgICBpZiAoeGhyLmFzeW5jKSB7XG4gICAgICAgICAgICBwdXNoLmNhbGwodGhpcy5xdWV1ZSwgeGhyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3QoeGhyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2dnZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBuby1vcDsgb3ZlcnJpZGUgdmlhIGNvbmZpZ3VyZSgpXG4gICAgfSxcblxuICAgIGxvZ0Vycm9yOiBjb25maWd1cmVMb2dFcnJvcih7fSksXG5cbiAgICBsb2c6IGxvZyxcblxuICAgIHJlc3BvbmRXaXRoOiBmdW5jdGlvbiByZXNwb25kV2l0aChtZXRob2QsIHVybCwgYm9keSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZUFycmF5KG1ldGhvZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBib2R5ID0gbWV0aG9kO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB1cmwgPSBtZXRob2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgYm9keSA9IHVybDtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgdXJsID0gbWV0aG9kO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBtZXRob2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXNjYXBlIHBvcnQgbnVtYmVyIHRvIHByZXZlbnQgXCJuYW1lZFwiIHBhcmFtZXRlcnMgaW4gJ3BhdGgtdG8tcmVnZXhwJyBtb2R1bGVcbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09IFwic3RyaW5nXCIgJiYgdXJsICE9PSBcIlwiICYmIC86WzAtOV0rXFwvLy50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgIHZhciBtID0gdXJsLm1hdGNoKC9eKGh0dHBzPzpcXC9cXC8uKj8pOihbMC05XStcXC8uKikkLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIHVybCA9IG1bMV0gKyBcIlxcXFw6XCIgKyBtWzJdO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaC5jYWxsKHRoaXMucmVzcG9uc2VzLCB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHVybDpcbiAgICAgICAgICAgICAgICB0eXBlb2YgdXJsID09PSBcInN0cmluZ1wiICYmIHVybCAhPT0gXCJcIiA/IHBhdGhUb1JlZ2V4cCh1cmwpIDogdXJsLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR5cGVvZiBib2R5ID09PSBcImZ1bmN0aW9uXCIgPyBib2R5IDogcmVzcG9uc2VBcnJheShib2R5KVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzcG9uZDogZnVuY3Rpb24gcmVzcG9uZCgpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcXVldWUgPSB0aGlzLnF1ZXVlIHx8IFtdO1xuICAgICAgICB2YXIgcmVxdWVzdHMgPSBxdWV1ZS5zcGxpY2UoMCwgcXVldWUubGVuZ3RoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24ocmVxdWVzdCkge1xuICAgICAgICAgICAgc2VsZi5wcm9jZXNzUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc3BvbmRBbGw6IGZ1bmN0aW9uIHJlc3BvbmRBbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3BvbmRJbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZSA9IHRoaXMucmVxdWVzdHMuc2xpY2UoMCk7XG5cbiAgICAgICAgdmFyIHJlcXVlc3Q7XG4gICAgICAgIHdoaWxlICgocmVxdWVzdCA9IHRoaXMucXVldWUuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JlcXVlc3Q6IGZ1bmN0aW9uIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHRoaXMucmVzcG9uc2UgfHwgWzQwNCwge30sIFwiXCJdO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gdGhpcy5yZXNwb25zZXMubGVuZ3RoLCBpID0gbCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jYWxsKHRoaXMsIHRoaXMucmVzcG9uc2VzW2ldLCByZXF1ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlc1tpXS5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cocmVzcG9uc2UsIHJlcXVlc3QpO1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25kKHJlc3BvbnNlWzBdLCByZXNwb25zZVsxXSwgcmVzcG9uc2VbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFwiRmFrZSBzZXJ2ZXIgcmVxdWVzdCBwcm9jZXNzaW5nXCIsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhoci5yZXN0b3JlICYmIHRoaXMueGhyLnJlc3RvcmUuYXBwbHkodGhpcy54aHIsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIGdldFJlcXVlc3Q6IGZ1bmN0aW9uIGdldFJlcXVlc3QoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdHNbaW5kZXhdIHx8IG51bGw7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEJlaGF2aW9yKCk7XG4gICAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcblxuICAgIHJlc2V0QmVoYXZpb3I6IGZ1bmN0aW9uIHJlc2V0QmVoYXZpb3IoKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VzLmxlbmd0aCA9IHRoaXMucXVldWUubGVuZ3RoID0gMDtcbiAgICB9LFxuXG4gICAgcmVzZXRIaXN0b3J5OiBmdW5jdGlvbiByZXNldEhpc3RvcnkoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdHMubGVuZ3RoID0gdGhpcy5yZXF1ZXN0Q291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdGVkT25jZSA9IHRoaXMucmVxdWVzdGVkVHdpY2UgPSB0aGlzLnJlcXVlc3RlZFRocmljZSA9IHRoaXMucmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5maXJzdFJlcXVlc3QgPSB0aGlzLnNlY29uZFJlcXVlc3QgPSB0aGlzLnRoaXJkUmVxdWVzdCA9IHRoaXMubGFzdFJlcXVlc3QgPSBudWxsO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmFrZVNlcnZlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKFwidXRpbFwiKS5pbnNwZWN0O1xuXG5mdW5jdGlvbiBsb2cocmVzcG9uc2UsIHJlcXVlc3QpIHtcbiAgICB2YXIgc3RyO1xuXG4gICAgc3RyID0gXCJSZXF1ZXN0OlxcblwiICsgaW5zcGVjdChyZXF1ZXN0KSArIFwiXFxuXFxuXCI7XG4gICAgc3RyICs9IFwiUmVzcG9uc2U6XFxuXCIgKyBpbnNwZWN0KHJlc3BvbnNlKSArIFwiXFxuXFxuXCI7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogd2hlbiB0aGlzLmxvZ2dlciBpcyBub3QgYSBmdW5jdGlvbiwgaXQgY2FuJ3QgYmUgY2FsbGVkICovXG4gICAgaWYgKHR5cGVvZiB0aGlzLmxvZ2dlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyKHN0cik7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLmlzU3VwcG9ydGVkID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKG5ldyBCbG9iKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pKCk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIEdsb2JhbFRleHRFbmNvZGVyID1cbiAgICB0eXBlb2YgVGV4dEVuY29kZXIgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBUZXh0RW5jb2RlclxuICAgICAgICA6IHJlcXVpcmUoXCJAc2lub25qcy90ZXh0LWVuY29kaW5nXCIpLlRleHRFbmNvZGVyO1xudmFyIGdsb2JhbE9iamVjdCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmdsb2JhbDtcbnZhciBjb25maWd1cmVMb2dFcnJvciA9IHJlcXVpcmUoXCIuLi9jb25maWd1cmUtbG9nZ2VyXCIpO1xudmFyIHNpbm9uRXZlbnQgPSByZXF1aXJlKFwiLi4vZXZlbnRcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcImp1c3QtZXh0ZW5kXCIpO1xuXG52YXIgc3VwcG9ydHNQcm9ncmVzcyA9IHR5cGVvZiBQcm9ncmVzc0V2ZW50ICE9PSBcInVuZGVmaW5lZFwiO1xudmFyIHN1cHBvcnRzQ3VzdG9tRXZlbnQgPSB0eXBlb2YgQ3VzdG9tRXZlbnQgIT09IFwidW5kZWZpbmVkXCI7XG52YXIgc3VwcG9ydHNGb3JtRGF0YSA9IHR5cGVvZiBGb3JtRGF0YSAhPT0gXCJ1bmRlZmluZWRcIjtcbnZhciBzdXBwb3J0c0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiO1xudmFyIHN1cHBvcnRzQmxvYiA9IHJlcXVpcmUoXCIuL2Jsb2JcIikuaXNTdXBwb3J0ZWQ7XG5cbmZ1bmN0aW9uIGdldFdvcmtpbmdYSFIoZ2xvYmFsU2NvcGUpIHtcbiAgICB2YXIgc3VwcG9ydHNYSFIgPSB0eXBlb2YgZ2xvYmFsU2NvcGUuWE1MSHR0cFJlcXVlc3QgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgaWYgKHN1cHBvcnRzWEhSKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxTY29wZS5YTUxIdHRwUmVxdWVzdDtcbiAgICB9XG5cbiAgICB2YXIgc3VwcG9ydHNBY3RpdmVYID0gdHlwZW9mIGdsb2JhbFNjb3BlLkFjdGl2ZVhPYmplY3QgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgaWYgKHN1cHBvcnRzQWN0aXZlWCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGdsb2JhbFNjb3BlLkFjdGl2ZVhPYmplY3QoXCJNU1hNTDIuWE1MSFRUUC4zLjBcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBSZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmb3JiaWRkZW4taGVhZGVyLW5hbWVcbnZhciB1bnNhZmVIZWFkZXJzID0ge1xuICAgIFwiQWNjZXB0LUNoYXJzZXRcIjogdHJ1ZSxcbiAgICBcIkFjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVyc1wiOiB0cnVlLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2RcIjogdHJ1ZSxcbiAgICBcIkFjY2VwdC1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIENvbm5lY3Rpb246IHRydWUsXG4gICAgXCJDb250ZW50LUxlbmd0aFwiOiB0cnVlLFxuICAgIENvb2tpZTogdHJ1ZSxcbiAgICBDb29raWUyOiB0cnVlLFxuICAgIFwiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIERhdGU6IHRydWUsXG4gICAgRE5UOiB0cnVlLFxuICAgIEV4cGVjdDogdHJ1ZSxcbiAgICBIb3N0OiB0cnVlLFxuICAgIFwiS2VlcC1BbGl2ZVwiOiB0cnVlLFxuICAgIE9yaWdpbjogdHJ1ZSxcbiAgICBSZWZlcmVyOiB0cnVlLFxuICAgIFRFOiB0cnVlLFxuICAgIFRyYWlsZXI6IHRydWUsXG4gICAgXCJUcmFuc2Zlci1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIFVwZ3JhZGU6IHRydWUsXG4gICAgXCJVc2VyLUFnZW50XCI6IHRydWUsXG4gICAgVmlhOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBFdmVudFRhcmdldEhhbmRsZXIoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBldmVudHMgPSBbXG4gICAgICAgIFwibG9hZHN0YXJ0XCIsXG4gICAgICAgIFwicHJvZ3Jlc3NcIixcbiAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIFwibG9hZFwiLFxuICAgICAgICBcInRpbWVvdXRcIixcbiAgICAgICAgXCJsb2FkZW5kXCJcbiAgICBdO1xuXG4gICAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUpIHtcbiAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IHNlbGZbXCJvblwiICsgZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGV2ZW50cy5mb3JFYWNoKGFkZEV2ZW50TGlzdGVuZXIpO1xufVxuXG5FdmVudFRhcmdldEhhbmRsZXIucHJvdG90eXBlID0gc2lub25FdmVudC5FdmVudFRhcmdldDtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyVmFsdWUodmFsdWUpIHtcbiAgICAvLyBSZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2UtYnl0ZXNcbiAgICAvKmVzbGludCBuby1jb250cm9sLXJlZ2V4OiBcIm9mZlwiKi9cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXltcXHgwOVxceDBBXFx4MERcXHgyMF0rfFtcXHgwOVxceDBBXFx4MERcXHgyMF0rJC9nLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gZ2V0SGVhZGVyKGhlYWRlcnMsIGhlYWRlcikge1xuICAgIHZhciBmb3VuZEhlYWRlciA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLmZpbHRlcihmdW5jdGlvbihoKSB7XG4gICAgICAgIHJldHVybiBoLnRvTG93ZXJDYXNlKCkgPT09IGhlYWRlci50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvdW5kSGVhZGVyWzBdIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXRDb29raWUySGVhZGVyKGhlYWRlcikge1xuICAgIHJldHVybiAhL15TZXQtQ29va2llMj8kL2kudGVzdChoZWFkZXIpO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlSZXNwb25zZUJvZHlUeXBlKGJvZHksIHJlc3BvbnNlVHlwZSkge1xuICAgIHZhciBlcnJvciA9IG51bGw7XG4gICAgdmFyIGlzU3RyaW5nID0gdHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCI7XG5cbiAgICBpZiAocmVzcG9uc2VUeXBlID09PSBcImFycmF5YnVmZmVyXCIpIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZyAmJiAhKGJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQXR0ZW1wdGVkIHRvIHJlc3BvbmQgdG8gZmFrZSBYTUxIdHRwUmVxdWVzdCB3aXRoIFwiICtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArXG4gICAgICAgICAgICAgICAgICAgIFwiLCB3aGljaCBpcyBub3QgYSBzdHJpbmcgb3IgQXJyYXlCdWZmZXIuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnJvci5uYW1lID0gXCJJbnZhbGlkQm9keUV4Y2VwdGlvblwiO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpbmcpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkF0dGVtcHRlZCB0byByZXNwb25kIHRvIGZha2UgWE1MSHR0cFJlcXVlc3Qgd2l0aCBcIiArXG4gICAgICAgICAgICAgICAgYm9keSArXG4gICAgICAgICAgICAgICAgXCIsIHdoaWNoIGlzIG5vdCBhIHN0cmluZy5cIlxuICAgICAgICApO1xuICAgICAgICBlcnJvci5uYW1lID0gXCJJbnZhbGlkQm9keUV4Y2VwdGlvblwiO1xuICAgIH1cblxuICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0FycmF5QnVmZmVyKGJvZHksIGVuY29kaW5nKSB7XG4gICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gYm9keTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEdsb2JhbFRleHRFbmNvZGVyKGVuY29kaW5nIHx8IFwidXRmLThcIikuZW5jb2RlKGJvZHkpLmJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gaXNYbWxDb250ZW50VHlwZShjb250ZW50VHlwZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgICFjb250ZW50VHlwZSB8fFxuICAgICAgICAvKHRleHRcXC94bWwpfChhcHBsaWNhdGlvblxcL3htbCl8KFxcK3htbCkvLnRlc3QoY29udGVudFR5cGUpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gY2xlYXJSZXNwb25zZSh4aHIpIHtcbiAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiB8fCB4aHIucmVzcG9uc2VUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICB4aHIucmVzcG9uc2UgPSB4aHIucmVzcG9uc2VUZXh0ID0gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB4aHIucmVzcG9uc2UgPSB4aHIucmVzcG9uc2VUZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgeGhyLnJlc3BvbnNlWE1MID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmFrZVhNTEh0dHBSZXF1ZXN0Rm9yKGdsb2JhbFNjb3BlKSB7XG4gICAgdmFyIGlzUmVhY3ROYXRpdmUgPVxuICAgICAgICBnbG9iYWxTY29wZS5uYXZpZ2F0b3IgJiZcbiAgICAgICAgZ2xvYmFsU2NvcGUubmF2aWdhdG9yLnByb2R1Y3QgPT09IFwiUmVhY3ROYXRpdmVcIjtcbiAgICB2YXIgc2lub25YaHIgPSB7IFhNTEh0dHBSZXF1ZXN0OiBnbG9iYWxTY29wZS5YTUxIdHRwUmVxdWVzdCB9O1xuICAgIHNpbm9uWGhyLkdsb2JhbFhNTEh0dHBSZXF1ZXN0ID0gZ2xvYmFsU2NvcGUuWE1MSHR0cFJlcXVlc3Q7XG4gICAgc2lub25YaHIuR2xvYmFsQWN0aXZlWE9iamVjdCA9IGdsb2JhbFNjb3BlLkFjdGl2ZVhPYmplY3Q7XG4gICAgc2lub25YaHIuc3VwcG9ydHNBY3RpdmVYID1cbiAgICAgICAgdHlwZW9mIHNpbm9uWGhyLkdsb2JhbEFjdGl2ZVhPYmplY3QgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgc2lub25YaHIuc3VwcG9ydHNYSFIgPSB0eXBlb2Ygc2lub25YaHIuR2xvYmFsWE1MSHR0cFJlcXVlc3QgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgc2lub25YaHIud29ya2luZ1hIUiA9IGdldFdvcmtpbmdYSFIoZ2xvYmFsU2NvcGUpO1xuICAgIHNpbm9uWGhyLnN1cHBvcnRzVGltZW91dCA9XG4gICAgICAgIHNpbm9uWGhyLnN1cHBvcnRzWEhSICYmXG4gICAgICAgIFwidGltZW91dFwiIGluIG5ldyBzaW5vblhoci5HbG9iYWxYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHNpbm9uWGhyLnN1cHBvcnRzQ09SUyA9XG4gICAgICAgIGlzUmVhY3ROYXRpdmUgfHxcbiAgICAgICAgKHNpbm9uWGhyLnN1cHBvcnRzWEhSICYmXG4gICAgICAgICAgICBcIndpdGhDcmVkZW50aWFsc1wiIGluIG5ldyBzaW5vblhoci5HbG9iYWxYTUxIdHRwUmVxdWVzdCgpKTtcblxuICAgIC8vIE5vdGUgdGhhdCBmb3IgRmFrZVhNTEh0dHBSZXF1ZXN0IHRvIHdvcmsgcHJlIEVTNVxuICAgIC8vIHdlIGxvc2Ugc29tZSBvZiB0aGUgYWxpZ25tZW50IHdpdGggdGhlIHNwZWMuXG4gICAgLy8gVG8gZW5zdXJlIGFzIGNsb3NlIGEgbWF0Y2ggYXMgcG9zc2libGUsXG4gICAgLy8gc2V0IHJlc3BvbnNlVHlwZSBiZWZvcmUgY2FsbGluZyBvcGVuLCBzZW5kIG9yIHJlc3BvbmQ7XG4gICAgZnVuY3Rpb24gRmFrZVhNTEh0dHBSZXF1ZXN0KGNvbmZpZykge1xuICAgICAgICBFdmVudFRhcmdldEhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gRmFrZVhNTEh0dHBSZXF1ZXN0LlVOU0VOVDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLnJlcXVlc3RCb2R5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAwO1xuICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnVwbG9hZCA9IG5ldyBFdmVudFRhcmdldEhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZVR5cGUgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dFcnJvciA9IGNvbmZpZ3VyZUxvZ0Vycm9yKGNvbmZpZyk7XG5cbiAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzVGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW5vblhoci5zdXBwb3J0c0NPUlMpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIEZha2VYTUxIdHRwUmVxdWVzdC5vbkNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBGYWtlWE1MSHR0cFJlcXVlc3Qub25DcmVhdGUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2ZXJpZnlTdGF0ZSh4aHIpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuT1BFTkVEKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh4aHIuc2VuZEZsYWcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbGFyZ2VzdCBhcml0eSBpbiBYSFIgaXMgNSAtIFhIUiNvcGVuXG4gICAgdmFyIGFwcGx5ID0gZnVuY3Rpb24ob2JqLCBtZXRob2QsIGFyZ3MpIHtcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kXSgpO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kXShhcmdzWzBdKTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW21ldGhvZF0oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialttZXRob2RdKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbWV0aG9kXShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW21ldGhvZF0oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBjYXNlXCIpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEZha2VYTUxIdHRwUmVxdWVzdC5maWx0ZXJzID0gW107XG4gICAgRmFrZVhNTEh0dHBSZXF1ZXN0LmFkZEZpbHRlciA9IGZ1bmN0aW9uIGFkZEZpbHRlcihmbikge1xuICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChmbik7XG4gICAgfTtcbiAgICBGYWtlWE1MSHR0cFJlcXVlc3QuZGVmYWtlID0gZnVuY3Rpb24gZGVmYWtlKGZha2VYaHIsIHhockFyZ3MpIHtcbiAgICAgICAgdmFyIHhociA9IG5ldyBzaW5vblhoci53b3JraW5nWEhSKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFwib3BlblwiLFxuICAgICAgICAgICAgXCJzZXRSZXF1ZXN0SGVhZGVyXCIsXG4gICAgICAgICAgICBcImFib3J0XCIsXG4gICAgICAgICAgICBcImdldFJlc3BvbnNlSGVhZGVyXCIsXG4gICAgICAgICAgICBcImdldEFsbFJlc3BvbnNlSGVhZGVyc1wiLFxuICAgICAgICAgICAgXCJhZGRFdmVudExpc3RlbmVyXCIsXG4gICAgICAgICAgICBcIm92ZXJyaWRlTWltZVR5cGVcIixcbiAgICAgICAgICAgIFwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgIGZha2VYaHJbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHBseSh4aHIsIG1ldGhvZCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZha2VYaHIuc2VuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gUmVmOiBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1yZXNwb25zZXR5cGUtYXR0cmlidXRlXG4gICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSAhPT0gZmFrZVhoci5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gZmFrZVhoci5yZXNwb25zZVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoeGhyLCBcInNlbmRcIiwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY29weUF0dHJzID0gZnVuY3Rpb24oYXJncykge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgICAgICAgICAgICBmYWtlWGhyW2F0dHJdID0geGhyW2F0dHJdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHN0YXRlQ2hhbmdlU3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZha2VYaHIucmVhZHlTdGF0ZSA9IHhoci5yZWFkeVN0YXRlO1xuICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID49IEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEKSB7XG4gICAgICAgICAgICAgICAgY29weUF0dHJzKFtcInN0YXR1c1wiLCBcInN0YXR1c1RleHRcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID49IEZha2VYTUxIdHRwUmVxdWVzdC5MT0FESU5HKSB7XG4gICAgICAgICAgICAgICAgY29weUF0dHJzKFtcInJlc3BvbnNlXCJdKTtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiB8fCB4aHIucmVzcG9uc2VUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgICAgICAgICBjb3B5QXR0cnMoW1wicmVzcG9uc2VUZXh0XCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgeGhyLnJlYWR5U3RhdGUgPT09IEZha2VYTUxIdHRwUmVxdWVzdC5ET05FICYmXG4gICAgICAgICAgICAgICAgKHhoci5yZXNwb25zZVR5cGUgPT09IFwiXCIgfHwgeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29weUF0dHJzKFtcInJlc3BvbnNlWE1MXCJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgc3RhdGVDaGFuZ2VFbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChmYWtlWGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhbGxcbiAgICAgICAgICAgICAgICBmYWtlWGhyLm9ucmVhZHlzdGF0ZWNoYW5nZS5jYWxsKGZha2VYaHIsIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBmYWtlWGhyLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBmYWtlWGhyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gc3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgICAgICBzdGF0ZUNoYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBzdGF0ZUNoYW5nZUVuZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh4aHIuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoXCJyZWFkeXN0YXRlY2hhbmdlXCIsIHN0YXRlQ2hhbmdlU3RhcnQpO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmYWtlWGhyLmV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgLyplc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMqL1xuICAgICAgICAgICAgICAgIGZha2VYaHIuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlci5saXN0ZW5lciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZTogaGFuZGxlci5jYXB0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25jZTogaGFuZGxlci5vbmNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8qZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMqL1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHhoci5hZGRFdmVudExpc3RlbmVyKFwicmVhZHlzdGF0ZWNoYW5nZVwiLCBzdGF0ZUNoYW5nZUVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gc3RhdGVDaGFuZ2U7XG4gICAgICAgIH1cbiAgICAgICAgYXBwbHkoeGhyLCBcIm9wZW5cIiwgeGhyQXJncyk7XG4gICAgfTtcbiAgICBGYWtlWE1MSHR0cFJlcXVlc3QudXNlRmlsdGVycyA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdmVyaWZ5UmVxdWVzdE9wZW5lZCh4aHIpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuT1BFTkVEKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUiAtIFwiICsgeGhyLnJlYWR5U3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmVyaWZ5UmVxdWVzdFNlbnQoeGhyKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gRmFrZVhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3QgZG9uZVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZlcmlmeUhlYWRlcnNSZWNlaXZlZCh4aHIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgeGhyLmFzeW5jICYmXG4gICAgICAgICAgICB4aHIucmVhZHlTdGF0ZSAhPT0gRmFrZVhNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRURcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBoZWFkZXJzIHJlY2VpdmVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29udmVydFJlc3BvbnNlQm9keShyZXNwb25zZVR5cGUsIGNvbnRlbnRUeXBlLCBib2R5KSB7XG4gICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09IFwiXCIgfHwgcmVzcG9uc2VUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNBcnJheUJ1ZmZlciAmJiByZXNwb25zZVR5cGUgPT09IFwiYXJyYXlidWZmZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0FycmF5QnVmZmVyKGJvZHkpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHBhcnNpbmcgZmFpbHVyZSBhcyBudWxsXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNCbG9iICYmIHJlc3BvbnNlVHlwZSA9PT0gXCJibG9iXCIpIHtcbiAgICAgICAgICAgIHZhciBibG9iT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgYmxvYk9wdGlvbnMudHlwZSA9IGNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtjb252ZXJ0VG9BcnJheUJ1ZmZlcihib2R5KV0sIGJsb2JPcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09IFwiZG9jdW1lbnRcIikge1xuICAgICAgICAgICAgaWYgKGlzWG1sQ29udGVudFR5cGUoY29udGVudFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZha2VYTUxIdHRwUmVxdWVzdC5wYXJzZVhNTChib2R5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVzcG9uc2VUeXBlIFwiICsgcmVzcG9uc2VUeXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGVwcyB0byBmb2xsb3cgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciwgYWNjb3JkaW5nIHRvOlxuICAgICAqIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1lcnJvci1zdGVwc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcXVlc3RFcnJvclN0ZXBzKHhocikge1xuICAgICAgICBjbGVhclJlc3BvbnNlKHhocik7XG4gICAgICAgIHhoci5lcnJvckZsYWcgPSB0cnVlO1xuICAgICAgICB4aHIucmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICAgICAgeGhyLnJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuVU5TRU5UICYmXG4gICAgICAgICAgICB4aHIuc2VuZEZsYWcgJiZcbiAgICAgICAgICAgIHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHhoci5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKTtcbiAgICAgICAgICAgIHhoci5zZW5kRmxhZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgRmFrZVhNTEh0dHBSZXF1ZXN0LnBhcnNlWE1MID0gZnVuY3Rpb24gcGFyc2VYTUwodGV4dCkge1xuICAgICAgICAvLyBUcmVhdCBlbXB0eSBzdHJpbmcgYXMgcGFyc2luZyBmYWlsdXJlXG4gICAgICAgIGlmICh0ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgRE9NUGFyc2VyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZXJlcnJvck5TID0gXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlcmVycm9ycyA9IHBhcnNlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZUZyb21TdHJpbmcoXCJJTlZBTElEXCIsIFwidGV4dC94bWxcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJwYXJzZXJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyZXJyb3JOUyA9IHBhcnNlcmVycm9yc1swXS5uYW1lc3BhY2VVUkk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3NpbmcgaW52YWxpZCBYTUwgbWFrZXMgSUUxMSB0aHJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbm8gbmFtZXNwYWNlIG5lZWRzIHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsIFwidGV4dC94bWxcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJlcnJvck5TLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJwYXJzZXJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICkubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgeG1sRG9jID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTERPTVwiKTtcbiAgICAgICAgICAgICAgICB4bWxEb2MuYXN5bmMgPSBcImZhbHNlXCI7XG4gICAgICAgICAgICAgICAgeG1sRG9jLmxvYWRYTUwodGV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhtbERvYy5wYXJzZUVycm9yLmVycm9yQ29kZSAhPT0gMCA/IG51bGwgOiB4bWxEb2M7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIHBhcnNlIFhNTCAtIG5vIGJpZ2dpZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIEZha2VYTUxIdHRwUmVxdWVzdC5zdGF0dXNDb2RlcyA9IHtcbiAgICAgICAgMTAwOiBcIkNvbnRpbnVlXCIsXG4gICAgICAgIDEwMTogXCJTd2l0Y2hpbmcgUHJvdG9jb2xzXCIsXG4gICAgICAgIDIwMDogXCJPS1wiLFxuICAgICAgICAyMDE6IFwiQ3JlYXRlZFwiLFxuICAgICAgICAyMDI6IFwiQWNjZXB0ZWRcIixcbiAgICAgICAgMjAzOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsXG4gICAgICAgIDIwNDogXCJObyBDb250ZW50XCIsXG4gICAgICAgIDIwNTogXCJSZXNldCBDb250ZW50XCIsXG4gICAgICAgIDIwNjogXCJQYXJ0aWFsIENvbnRlbnRcIixcbiAgICAgICAgMjA3OiBcIk11bHRpLVN0YXR1c1wiLFxuICAgICAgICAzMDA6IFwiTXVsdGlwbGUgQ2hvaWNlXCIsXG4gICAgICAgIDMwMTogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICAgICAgICAzMDI6IFwiRm91bmRcIixcbiAgICAgICAgMzAzOiBcIlNlZSBPdGhlclwiLFxuICAgICAgICAzMDQ6IFwiTm90IE1vZGlmaWVkXCIsXG4gICAgICAgIDMwNTogXCJVc2UgUHJveHlcIixcbiAgICAgICAgMzA3OiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICAgICAgICA0MDA6IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgNDAxOiBcIlVuYXV0aG9yaXplZFwiLFxuICAgICAgICA0MDI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuICAgICAgICA0MDM6IFwiRm9yYmlkZGVuXCIsXG4gICAgICAgIDQwNDogXCJOb3QgRm91bmRcIixcbiAgICAgICAgNDA1OiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuICAgICAgICA0MDY6IFwiTm90IEFjY2VwdGFibGVcIixcbiAgICAgICAgNDA3OiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gICAgICAgIDQwODogXCJSZXF1ZXN0IFRpbWVvdXRcIixcbiAgICAgICAgNDA5OiBcIkNvbmZsaWN0XCIsXG4gICAgICAgIDQxMDogXCJHb25lXCIsXG4gICAgICAgIDQxMTogXCJMZW5ndGggUmVxdWlyZWRcIixcbiAgICAgICAgNDEyOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgICAgICAgNDEzOiBcIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZVwiLFxuICAgICAgICA0MTQ6IFwiUmVxdWVzdC1VUkkgVG9vIExvbmdcIixcbiAgICAgICAgNDE1OiBcIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGVcIixcbiAgICAgICAgNDE2OiBcIlJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGVcIixcbiAgICAgICAgNDE3OiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLFxuICAgICAgICA0MjI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgICAgICAgNTAwOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgICAgICA1MDE6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gICAgICAgIDUwMjogXCJCYWQgR2F0ZXdheVwiLFxuICAgICAgICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICAgICAgICA1MDQ6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gICAgICAgIDUwNTogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiXG4gICAgfTtcblxuICAgIGV4dGVuZChGYWtlWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCBzaW5vbkV2ZW50LkV2ZW50VGFyZ2V0LCB7XG4gICAgICAgIGFzeW5jOiB0cnVlLFxuXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uIG9wZW4obWV0aG9kLCB1cmwsIGFzeW5jLCB1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgICAgICB0aGlzLmFzeW5jID0gdHlwZW9mIGFzeW5jID09PSBcImJvb2xlYW5cIiA/IGFzeW5jIDogdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICAgICAgICAgIGNsZWFyUmVzcG9uc2UodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLnNlbmRGbGFnID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChGYWtlWE1MSHR0cFJlcXVlc3QudXNlRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciB4aHJBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgIHZhciBkZWZha2UgPSBGYWtlWE1MSHR0cFJlcXVlc3QuZmlsdGVycy5zb21lKGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLmFwcGx5KHRoaXMsIHhockFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChkZWZha2UpIHtcbiAgICAgICAgICAgICAgICAgICAgRmFrZVhNTEh0dHBSZXF1ZXN0LmRlZmFrZSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5PUEVORUQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlYWR5U3RhdGVDaGFuZ2U6IGZ1bmN0aW9uIHJlYWR5U3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICAgICAgICB2YXIgcmVhZHlTdGF0ZUNoYW5nZUV2ZW50ID0gbmV3IHNpbm9uRXZlbnQuRXZlbnQoXG4gICAgICAgICAgICAgICAgXCJyZWFkeXN0YXRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhciBldmVudCwgcHJvZ3Jlc3M7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKHJlYWR5U3RhdGVDaGFuZ2VFdmVudCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFwiRmFrZSBYSFIgb25yZWFkeXN0YXRlY2hhbmdlIGhhbmRsZXJcIiwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVkT3V0IHx8IHRoaXMuYWJvcnRlZCB8fCB0aGlzLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IHsgbG9hZGVkOiAwLCB0b3RhbDogMCB9O1xuICAgICAgICAgICAgICAgICAgICBldmVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy50aW1lZE91dCAmJiBcInRpbWVvdXRcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFib3J0ZWQgJiYgXCJhYm9ydFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0geyBsb2FkZWQ6IDEwMCwgdG90YWw6IDEwMCB9O1xuICAgICAgICAgICAgICAgICAgICBldmVudCA9IFwibG9hZFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFwicHJvZ3Jlc3NcIiwgcHJvZ3Jlc3MsIHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KGV2ZW50LCBwcm9ncmVzcywgdGhpcylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBzaW5vbkV2ZW50LlByb2dyZXNzRXZlbnQoXCJsb2FkZW5kXCIsIHByb2dyZXNzLCB0aGlzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgICAgICAgbmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcInByb2dyZXNzXCIsIHByb2dyZXNzLCB0aGlzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KGV2ZW50LCBwcm9ncmVzcywgdGhpcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgICAgICAgbmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcImxvYWRlbmRcIiwgcHJvZ3Jlc3MsIHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHJlYWR5U3RhdGVDaGFuZ2VFdmVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gUmVmIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jdGhlLXNldHJlcXVlc3RoZWFkZXIoKS1tZXRob2RcbiAgICAgICAgc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJCeSBSRkM3MjMwLCBzZWN0aW9uIDMuMi40LCBoZWFkZXIgdmFsdWVzIHNob3VsZCBiZSBzdHJpbmdzLiBHb3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcmlmeVN0YXRlKHRoaXMpO1xuXG4gICAgICAgICAgICB2YXIgY2hlY2tVbnNhZmVIZWFkZXJzID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy51bnNhZmVIZWFkZXJzRW5hYmxlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tVbnNhZmVIZWFkZXJzID0gdGhpcy51bnNhZmVIZWFkZXJzRW5hYmxlZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2hlY2tVbnNhZmVIZWFkZXJzICYmXG4gICAgICAgICAgICAgICAgKGdldEhlYWRlcih1bnNhZmVIZWFkZXJzLCBoZWFkZXIpICE9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIC9eKFNlYy18UHJveHktKS9pLnRlc3QoaGVhZGVyKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHF1b3Rlc1xuICAgICAgICAgICAgICAgICAgICAnUmVmdXNlZCB0byBzZXQgdW5zYWZlIGhlYWRlciBcIicgKyBoZWFkZXIgKyAnXCInXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB2YWx1ZSA9IG5vcm1hbGl6ZUhlYWRlclZhbHVlKHZhbHVlKTtcblxuICAgICAgICAgICAgdmFyIGV4aXN0aW5nSGVhZGVyID0gZ2V0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlcnMsIGhlYWRlcik7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzW2V4aXN0aW5nSGVhZGVyXSArPSBcIiwgXCIgKyB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVyc1toZWFkZXJdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0U3RhdHVzOiBmdW5jdGlvbiBzZXRTdGF0dXMoc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgc2FuaXRpemVkU3RhdHVzID0gdHlwZW9mIHN0YXR1cyA9PT0gXCJudW1iZXJcIiA/IHN0YXR1cyA6IDIwMDtcblxuICAgICAgICAgICAgdmVyaWZ5UmVxdWVzdE9wZW5lZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc2FuaXRpemVkU3RhdHVzO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gRmFrZVhNTEh0dHBSZXF1ZXN0LnN0YXR1c0NvZGVzW3Nhbml0aXplZFN0YXR1c107XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gSGVscHMgdGVzdGluZ1xuICAgICAgICBzZXRSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgICAgICAgICB2ZXJpZnlSZXF1ZXN0T3BlbmVkKHRoaXMpO1xuXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gKHRoaXMucmVzcG9uc2VIZWFkZXJzID0ge30pO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1toZWFkZXJdID0gaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gRmFrZVhNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gQ3VycmVudGx5IHRyZWF0cyBBTEwgZGF0YSBhcyBhIERPTVN0cmluZyAoaS5lLiBubyBEb2N1bWVudClcbiAgICAgICAgc2VuZDogZnVuY3Rpb24gc2VuZChkYXRhKSB7XG4gICAgICAgICAgICB2ZXJpZnlTdGF0ZSh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKCEvXihoZWFkKSQvaS50ZXN0KHRoaXMubWV0aG9kKSkge1xuICAgICAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IGdldEhlYWRlcihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdEhlYWRlcnNbY29udGVudFR5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucmVxdWVzdEhlYWRlcnNbY29udGVudFR5cGVdLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVyc1tjb250ZW50VHlwZV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbMF0gKyBcIjtjaGFyc2V0PXV0Zi04XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c0Zvcm1EYXRhICYmICEoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Qm9keSA9IGRhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3JGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbmRGbGFnID0gdGhpcy5hc3luYztcbiAgICAgICAgICAgIGNsZWFyUmVzcG9uc2UodGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vblNlbmQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25TZW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbmx5IGxpc3RlbiBpZiBzZXRJbnRlcnZhbCBhbmQgRGF0ZSBhcmUgYSBzdHViYmVkLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNpbm9uWGhyLnN1cHBvcnRzVGltZW91dCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZXRJbnRlcnZhbC5jbG9jayA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBEYXRlLmNsb2NrID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhdGVkVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIGFueSBwb3NzaWJsZSB0aWNrIGJ5IGZha2UgdGltZXJzIGFuZCBjaGVjayB0byBzZWUgaWYgdGltZW91dCBoYXNcbiAgICAgICAgICAgICAgICAvLyBiZWVuIGV4Y2VlZGVkLiBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGltZW91dCBjYW4gYmUgY2hhbmdlZCB3aGlsZSBhIHJlcXVlc3RcbiAgICAgICAgICAgICAgICAvLyBpcyBpbiBmbGlnaHQsIHNvIHdlIG11c3QgY2hlY2sgYW55dGltZSB0aGUgZW5kIHVzZXIgZm9yY2VzIGEgY2xvY2sgdGljayB0byBtYWtlXG4gICAgICAgICAgICAgICAgLy8gc3VyZSB0aW1lb3V0IGhhc24ndCBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jZGZuUmV0dXJuTGluay0yXG4gICAgICAgICAgICAgICAgdmFyIGNsZWFySW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVhZHlTdGF0ZSBoYXMgYmVlbiByZXNldCBvciBpcyBkb25lLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgbm8gdGltZW91dC4gVGhpcyB3aWxsIGFsc28gcHJldmVudCBhYm9ydGVkIHJlcXVlc3RzIGFuZFxuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlU2VydmVyV2l0aENsb2NrIGZyb20gdHJpZ2dlcmluZyB1bm5lY2Vzc2FyeSByZXNwb25zZXMuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVhZHlTdGF0ZSA9PT0gRmFrZVhNTEh0dHBSZXF1ZXN0LlVOU0VOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWFkeVN0YXRlID09PSBGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2xlYXJJbnRlcnZhbElkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmLnRpbWVvdXQgPT09IFwibnVtYmVyXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZW91dCA+IDBcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBpbml0aWF0ZWRUaW1lICsgc2VsZi50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2xlYXJJbnRlcnZhbElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgICAgbmV3IHNpbm9uRXZlbnQuRXZlbnQoXCJsb2Fkc3RhcnRcIiwgZmFsc2UsIGZhbHNlLCB0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhYm9ydDogZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVxdWVzdEVycm9yU3RlcHModGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBGYWtlWE1MSHR0cFJlcXVlc3QuVU5TRU5UO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsZWFyUmVzcG9uc2UodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmVycm9yRmxhZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGVDaGFuZ2UoRmFrZVhNTEh0dHBSZXF1ZXN0LkRPTkUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXJUaW1lb3V0OiBmdW5jdGlvbiB0cmlnZ2VyVGltZW91dCgpIHtcbiAgICAgICAgICAgIGlmIChzaW5vblhoci5zdXBwb3J0c1RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0RXJyb3JTdGVwcyh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlIDwgRmFrZVhNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9eU2V0LUNvb2tpZTI/JC9pLnRlc3QoaGVhZGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGhlYWRlciA9IGdldEhlYWRlcih0aGlzLnJlc3BvbnNlSGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VIZWFkZXJzW2hlYWRlcl0gfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uIGdldEFsbFJlc3BvbnNlSGVhZGVycygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPCBGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnM7XG4gICAgICAgICAgICB2YXIgaGVhZGVycyA9IE9iamVjdC5rZXlzKHJlc3BvbnNlSGVhZGVycylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGV4Y2x1ZGVTZXRDb29raWUySGVhZGVyKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3BvbnNlSGVhZGVyc1toZWFkZXJdO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgKGhlYWRlciArIFwiOiBcIiArIHZhbHVlICsgXCJcXHJcXG5cIik7XG4gICAgICAgICAgICAgICAgfSwgXCJcIik7XG5cbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldFJlc3BvbnNlQm9keTogZnVuY3Rpb24gc2V0UmVzcG9uc2VCb2R5KGJvZHkpIHtcbiAgICAgICAgICAgIHZlcmlmeVJlcXVlc3RTZW50KHRoaXMpO1xuICAgICAgICAgICAgdmVyaWZ5SGVhZGVyc1JlY2VpdmVkKHRoaXMpO1xuICAgICAgICAgICAgdmVyaWZ5UmVzcG9uc2VCb2R5VHlwZShib2R5LCB0aGlzLnJlc3BvbnNlVHlwZSk7XG4gICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPVxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcnJpZGRlbk1pbWVUeXBlIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcblxuICAgICAgICAgICAgdmFyIGlzVGV4dFJlc3BvbnNlID1cbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiB8fCB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICBjbGVhclJlc3BvbnNlKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemUgfHwgMTA7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5MT0FESU5HKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNUZXh0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gdGhpcy5yZXNwb25zZSArPSBib2R5LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArIGNodW5rU2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSBjaHVua1NpemU7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaW5kZXggPCBib2R5Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSBjb252ZXJ0UmVzcG9uc2VCb2R5KFxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGJvZHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNUZXh0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IHRoaXMucmVzcG9uc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZVhNTCA9IHRoaXMucmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUeXBlID09PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgaXNYbWxDb250ZW50VHlwZShjb250ZW50VHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VYTUwgPSBGYWtlWE1MSHR0cFJlcXVlc3QucGFyc2VYTUwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUZXh0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZUNoYW5nZShGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uZDogZnVuY3Rpb24gcmVzcG9uZChzdGF0dXMsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHN0YXR1cyk7XG4gICAgICAgICAgICB0aGlzLnNldFJlc3BvbnNlSGVhZGVycyhoZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0UmVzcG9uc2VCb2R5KGJvZHkgfHwgXCJcIik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uIHVwbG9hZFByb2dyZXNzKHByb2dyZXNzRXZlbnRSYXcpIHtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgICAgICAgbmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRXZlbnRSYXcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBkb3dubG9hZFByb2dyZXNzOiBmdW5jdGlvbiBkb3dubG9hZFByb2dyZXNzKHByb2dyZXNzRXZlbnRSYXcpIHtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudFJhdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBsb2FkRXJyb3I6IGZ1bmN0aW9uIHVwbG9hZEVycm9yKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoc3VwcG9ydHNDdXN0b21FdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIG5ldyBzaW5vbkV2ZW50LkN1c3RvbUV2ZW50KFwiZXJyb3JcIiwgeyBkZXRhaWw6IGVycm9yIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiBvdmVycmlkZU1pbWVUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPj0gRmFrZVhNTEh0dHBSZXF1ZXN0LkxPQURJTkcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGRlbk1pbWVUeXBlID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHN0YXRlcyA9IHtcbiAgICAgICAgVU5TRU5UOiAwLFxuICAgICAgICBPUEVORUQ6IDEsXG4gICAgICAgIEhFQURFUlNfUkVDRUlWRUQ6IDIsXG4gICAgICAgIExPQURJTkc6IDMsXG4gICAgICAgIERPTkU6IDRcbiAgICB9O1xuXG4gICAgZXh0ZW5kKEZha2VYTUxIdHRwUmVxdWVzdCwgc3RhdGVzKTtcbiAgICBleHRlbmQoRmFrZVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwgc3RhdGVzKTtcblxuICAgIGZ1bmN0aW9uIHVzZUZha2VYTUxIdHRwUmVxdWVzdCgpIHtcbiAgICAgICAgRmFrZVhNTEh0dHBSZXF1ZXN0LnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKGtlZXBPbkNyZWF0ZSkge1xuICAgICAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzWEhSKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsU2NvcGUuWE1MSHR0cFJlcXVlc3QgPSBzaW5vblhoci5HbG9iYWxYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzQWN0aXZlWCkge1xuICAgICAgICAgICAgICAgIGdsb2JhbFNjb3BlLkFjdGl2ZVhPYmplY3QgPSBzaW5vblhoci5HbG9iYWxBY3RpdmVYT2JqZWN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgRmFrZVhNTEh0dHBSZXF1ZXN0LnJlc3RvcmU7XG5cbiAgICAgICAgICAgIGlmIChrZWVwT25DcmVhdGUgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgRmFrZVhNTEh0dHBSZXF1ZXN0Lm9uQ3JlYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2lub25YaHIuc3VwcG9ydHNYSFIpIHtcbiAgICAgICAgICAgIGdsb2JhbFNjb3BlLlhNTEh0dHBSZXF1ZXN0ID0gRmFrZVhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzQWN0aXZlWCkge1xuICAgICAgICAgICAgZ2xvYmFsU2NvcGUuQWN0aXZlWE9iamVjdCA9IGZ1bmN0aW9uIEFjdGl2ZVhPYmplY3Qob2JqSWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG9iaklkID09PSBcIk1pY3Jvc29mdC5YTUxIVFRQXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgL15Nc3htbDJcXC5YTUxIVFRQL2kudGVzdChvYmpJZClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWtlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNpbm9uWGhyLkdsb2JhbEFjdGl2ZVhPYmplY3Qob2JqSWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBGYWtlWE1MSHR0cFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeGhyOiBzaW5vblhocixcbiAgICAgICAgRmFrZVhNTEh0dHBSZXF1ZXN0OiBGYWtlWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIHVzZUZha2VYTUxIdHRwUmVxdWVzdDogdXNlRmFrZVhNTEh0dHBSZXF1ZXN0XG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHRlbmQoZmFrZVhNTEh0dHBSZXF1ZXN0Rm9yKGdsb2JhbE9iamVjdCksIHtcbiAgICBmYWtlWE1MSHR0cFJlcXVlc3RGb3I6IGZha2VYTUxIdHRwUmVxdWVzdEZvclxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmFrZVNlcnZlcjogcmVxdWlyZShcIi4vZmFrZS1zZXJ2ZXJcIiksXG4gICAgZmFrZVNlcnZlcldpdGhDbG9jazogcmVxdWlyZShcIi4vZmFrZS1zZXJ2ZXIvZmFrZS1zZXJ2ZXItd2l0aC1jbG9ja1wiKSxcbiAgICBmYWtlWGhyOiByZXF1aXJlKFwiLi9mYWtlLXhoclwiKVxufTtcbiIsInZhciBpc2FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbi8qKlxuICogRXhwb3NlIGBwYXRoVG9SZWdleHBgLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGhUb1JlZ2V4cFxubW9kdWxlLmV4cG9ydHMucGFyc2UgPSBwYXJzZVxubW9kdWxlLmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGVcbm1vZHVsZS5leHBvcnRzLnRva2Vuc1RvRnVuY3Rpb24gPSB0b2tlbnNUb0Z1bmN0aW9uXG5tb2R1bGUuZXhwb3J0cy50b2tlbnNUb1JlZ0V4cCA9IHRva2Vuc1RvUmVnRXhwXG5cbi8qKlxuICogVGhlIG1haW4gcGF0aCBtYXRjaGluZyByZWdleHAgdXRpbGl0eS5cbiAqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG52YXIgUEFUSF9SRUdFWFAgPSBuZXcgUmVnRXhwKFtcbiAgLy8gTWF0Y2ggZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGFwcGVhciBpbiBmdXR1cmUgbWF0Y2hlcy5cbiAgLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IHdvbid0IHRyYW5zZm9ybS5cbiAgJyhcXFxcXFxcXC4pJyxcbiAgLy8gTWF0Y2ggRXhwcmVzcy1zdHlsZSBwYXJhbWV0ZXJzIGFuZCB1bi1uYW1lZCBwYXJhbWV0ZXJzIHdpdGggYSBwcmVmaXhcbiAgLy8gYW5kIG9wdGlvbmFsIHN1ZmZpeGVzLiBNYXRjaGVzIGFwcGVhciBhczpcbiAgLy9cbiAgLy8gXCIvOnRlc3QoXFxcXGQrKT9cIiA9PiBbXCIvXCIsIFwidGVzdFwiLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCBcIj9cIiwgdW5kZWZpbmVkXVxuICAvLyBcIi9yb3V0ZShcXFxcZCspXCIgID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gIC8vIFwiLypcIiAgICAgICAgICAgID0+IFtcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIipcIl1cbiAgJyhbXFxcXC8uXSk/KD86KD86XFxcXDooXFxcXHcrKSg/OlxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpP3xcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKShbKyo/XSk/fChcXFxcKikpJ1xuXS5qb2luKCd8JyksICdnJylcblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBmb3IgdGhlIHJhdyB0b2tlbnMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshQXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlIChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIHRva2VucyA9IFtdXG4gIHZhciBrZXkgPSAwXG4gIHZhciBpbmRleCA9IDBcbiAgdmFyIHBhdGggPSAnJ1xuICB2YXIgZGVmYXVsdERlbGltaXRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kZWxpbWl0ZXIgfHwgJy8nXG4gIHZhciByZXNcblxuICB3aGlsZSAoKHJlcyA9IFBBVEhfUkVHRVhQLmV4ZWMoc3RyKSkgIT0gbnVsbCkge1xuICAgIHZhciBtID0gcmVzWzBdXG4gICAgdmFyIGVzY2FwZWQgPSByZXNbMV1cbiAgICB2YXIgb2Zmc2V0ID0gcmVzLmluZGV4XG4gICAgcGF0aCArPSBzdHIuc2xpY2UoaW5kZXgsIG9mZnNldClcbiAgICBpbmRleCA9IG9mZnNldCArIG0ubGVuZ3RoXG5cbiAgICAvLyBJZ25vcmUgYWxyZWFkeSBlc2NhcGVkIHNlcXVlbmNlcy5cbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgcGF0aCArPSBlc2NhcGVkWzFdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBuZXh0ID0gc3RyW2luZGV4XVxuICAgIHZhciBwcmVmaXggPSByZXNbMl1cbiAgICB2YXIgbmFtZSA9IHJlc1szXVxuICAgIHZhciBjYXB0dXJlID0gcmVzWzRdXG4gICAgdmFyIGdyb3VwID0gcmVzWzVdXG4gICAgdmFyIG1vZGlmaWVyID0gcmVzWzZdXG4gICAgdmFyIGFzdGVyaXNrID0gcmVzWzddXG5cbiAgICAvLyBQdXNoIHRoZSBjdXJyZW50IHBhdGggb250byB0aGUgdG9rZW5zLlxuICAgIGlmIChwYXRoKSB7XG4gICAgICB0b2tlbnMucHVzaChwYXRoKVxuICAgICAgcGF0aCA9ICcnXG4gICAgfVxuXG4gICAgdmFyIHBhcnRpYWwgPSBwcmVmaXggIT0gbnVsbCAmJiBuZXh0ICE9IG51bGwgJiYgbmV4dCAhPT0gcHJlZml4XG4gICAgdmFyIHJlcGVhdCA9IG1vZGlmaWVyID09PSAnKycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIHZhciBvcHRpb25hbCA9IG1vZGlmaWVyID09PSAnPycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZXNbMl0gfHwgZGVmYXVsdERlbGltaXRlclxuICAgIHZhciBwYXR0ZXJuID0gY2FwdHVyZSB8fCBncm91cFxuXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSB8fCBrZXkrKyxcbiAgICAgIHByZWZpeDogcHJlZml4IHx8ICcnLFxuICAgICAgZGVsaW1pdGVyOiBkZWxpbWl0ZXIsXG4gICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICByZXBlYXQ6IHJlcGVhdCxcbiAgICAgIHBhcnRpYWw6IHBhcnRpYWwsXG4gICAgICBhc3RlcmlzazogISFhc3RlcmlzayxcbiAgICAgIHBhdHRlcm46IHBhdHRlcm4gPyBlc2NhcGVHcm91cChwYXR0ZXJuKSA6IChhc3RlcmlzayA/ICcuKicgOiAnW14nICsgZXNjYXBlU3RyaW5nKGRlbGltaXRlcikgKyAnXSs/JylcbiAgICB9KVxuICB9XG5cbiAgLy8gTWF0Y2ggYW55IGNoYXJhY3RlcnMgc3RpbGwgcmVtYWluaW5nLlxuICBpZiAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgcGF0aCArPSBzdHIuc3Vic3RyKGluZGV4KVxuICB9XG5cbiAgLy8gSWYgdGhlIHBhdGggZXhpc3RzLCBwdXNoIGl0IG9udG8gdGhlIGVuZC5cbiAgaWYgKHBhdGgpIHtcbiAgICB0b2tlbnMucHVzaChwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBzdHJpbmcgdG8gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGhlIHBhdGguXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICBzdHJcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IWZ1bmN0aW9uKE9iamVjdD0sIE9iamVjdD0pfVxuICovXG5mdW5jdGlvbiBjb21waWxlIChzdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvRnVuY3Rpb24ocGFyc2Uoc3RyLCBvcHRpb25zKSwgb3B0aW9ucylcbn1cblxuLyoqXG4gKiBQcmV0dGllciBlbmNvZGluZyBvZiBVUkkgcGF0aCBzZWdtZW50cy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bXFwvPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEVuY29kZSB0aGUgYXN0ZXJpc2sgcGFyYW1ldGVyLiBTaW1pbGFyIHRvIGBwcmV0dHlgLCBidXQgYWxsb3dzIHNsYXNoZXMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbmNvZGVBc3RlcmlzayAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIG1ldGhvZCBmb3IgdHJhbnNmb3JtaW5nIHRva2VucyBpbnRvIHRoZSBwYXRoIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uICh0b2tlbnMsIG9wdGlvbnMpIHtcbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHRva2VucyBpbnRvIHJlZ2V4cHMuXG4gIHZhciBtYXRjaGVzID0gbmV3IEFycmF5KHRva2Vucy5sZW5ndGgpXG5cbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRva2Vuc1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1hdGNoZXNbaV0gPSBuZXcgUmVnRXhwKCdeKD86JyArIHRva2Vuc1tpXS5wYXR0ZXJuICsgJykkJywgZmxhZ3Mob3B0aW9ucykpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmosIG9wdHMpIHtcbiAgICB2YXIgcGF0aCA9ICcnXG4gICAgdmFyIGRhdGEgPSBvYmogfHwge31cbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgfHwge31cbiAgICB2YXIgZW5jb2RlID0gb3B0aW9ucy5wcmV0dHkgPyBlbmNvZGVVUklDb21wb25lbnRQcmV0dHkgOiBlbmNvZGVVUklDb21wb25lbnRcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV1cblxuICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGF0aCArPSB0b2tlblxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbdG9rZW4ubmFtZV1cbiAgICAgIHZhciBzZWdtZW50XG5cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgIC8vIFByZXBlbmQgcGFydGlhbCBzZWdtZW50IHByZWZpeGVzLlxuICAgICAgICAgIGlmICh0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgICBwYXRoICs9IHRva2VuLnByZWZpeFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBiZSBkZWZpbmVkJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNhcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG5vdCByZXBlYXQsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICdgJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc2VnbWVudCA9IGVuY29kZSh2YWx1ZVtqXSlcblxuICAgICAgICAgIGlmICghbWF0Y2hlc1tpXS50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhbGwgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgYCcgKyBKU09OLnN0cmluZ2lmeShzZWdtZW50KSArICdgJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoICs9IChqID09PSAwID8gdG9rZW4ucHJlZml4IDogdG9rZW4uZGVsaW1pdGVyKSArIHNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHNlZ21lbnQgPSB0b2tlbi5hc3RlcmlzayA/IGVuY29kZUFzdGVyaXNrKHZhbHVlKSA6IGVuY29kZSh2YWx1ZSlcblxuICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgXCInICsgc2VnbWVudCArICdcIicpXG4gICAgICB9XG5cbiAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4ICsgc2VnbWVudFxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBFc2NhcGUgYSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKyo/PV4hOiR7fSgpW1xcXXxcXC9cXFxcXSkvZywgJ1xcXFwkMScpXG59XG5cbi8qKlxuICogRXNjYXBlIHRoZSBjYXB0dXJpbmcgZ3JvdXAgYnkgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBtZWFuaW5nLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZ3JvdXBcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZXNjYXBlR3JvdXAgKGdyb3VwKSB7XG4gIHJldHVybiBncm91cC5yZXBsYWNlKC8oWz0hOiRcXC8oKV0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEF0dGFjaCB0aGUga2V5cyBhcyBhIHByb3BlcnR5IG9mIHRoZSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcmVcbiAqIEBwYXJhbSAge0FycmF5fSAgIGtleXNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEtleXMgKHJlLCBrZXlzKSB7XG4gIHJlLmtleXMgPSBrZXlzXG4gIHJldHVybiByZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZmxhZ3MgZm9yIGEgcmVnZXhwIGZyb20gdGhlIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGZsYWdzIChvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuc2Vuc2l0aXZlID8gJycgOiAnaSdcbn1cblxuLyoqXG4gKiBQdWxsIG91dCBrZXlzIGZyb20gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcmVnZXhwVG9SZWdleHAgKHBhdGgsIGtleXMpIHtcbiAgLy8gVXNlIGEgbmVnYXRpdmUgbG9va2FoZWFkIHRvIG1hdGNoIG9ubHkgY2FwdHVyaW5nIGdyb3Vwcy5cbiAgdmFyIGdyb3VwcyA9IHBhdGguc291cmNlLm1hdGNoKC9cXCgoPyFcXD8pL2cpXG5cbiAgaWYgKGdyb3Vwcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXlzLnB1c2goe1xuICAgICAgICBuYW1lOiBpLFxuICAgICAgICBwcmVmaXg6IG51bGwsXG4gICAgICAgIGRlbGltaXRlcjogbnVsbCxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICByZXBlYXQ6IGZhbHNlLFxuICAgICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAgICAgYXN0ZXJpc2s6IGZhbHNlLFxuICAgICAgICBwYXR0ZXJuOiBudWxsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKHBhdGgsIGtleXMpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5IGludG8gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgcGF0aFxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICB2YXIgcGFydHMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHBhcnRzLnB1c2gocGF0aFRvUmVnZXhwKHBhdGhbaV0sIGtleXMsIG9wdGlvbnMpLnNvdXJjZSlcbiAgfVxuXG4gIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKCcoPzonICsgcGFydHMuam9pbignfCcpICsgJyknLCBmbGFncyhvcHRpb25zKSlcblxuICByZXR1cm4gYXR0YWNoS2V5cyhyZWdleHAsIGtleXMpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGF0aCByZWdleHAgZnJvbSBzdHJpbmcgaW5wdXQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9SZWdleHAgKHBhdGgsIGtleXMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvUmVnRXhwKHBhcnNlKHBhdGgsIG9wdGlvbnMpLCBrZXlzLCBvcHRpb25zKVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIGZ1bmN0aW9uIGZvciB0YWtpbmcgdG9rZW5zIGFuZCByZXR1cm5pbmcgYSBSZWdFeHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgICAgICAgICB0b2tlbnNcbiAqIEBwYXJhbSAgeyhBcnJheXxPYmplY3QpPX0ga2V5c1xuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiB0b2tlbnNUb1JlZ0V4cCAodG9rZW5zLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpXG4gICAga2V5cyA9IFtdXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdFxuICB2YXIgZW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlXG4gIHZhciByb3V0ZSA9ICcnXG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0b2tlbnMgYW5kIGNyZWF0ZSBvdXIgcmVnZXhwIHN0cmluZy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV1cblxuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByb3V0ZSArPSBlc2NhcGVTdHJpbmcodG9rZW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmVmaXggPSBlc2NhcGVTdHJpbmcodG9rZW4ucHJlZml4KVxuICAgICAgdmFyIGNhcHR1cmUgPSAnKD86JyArIHRva2VuLnBhdHRlcm4gKyAnKSdcblxuICAgICAga2V5cy5wdXNoKHRva2VuKVxuXG4gICAgICBpZiAodG9rZW4ucmVwZWF0KSB7XG4gICAgICAgIGNhcHR1cmUgKz0gJyg/OicgKyBwcmVmaXggKyBjYXB0dXJlICsgJykqJ1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgY2FwdHVyZSA9ICcoPzonICsgcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpKT8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKT8nXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcHR1cmUgPSBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJyknXG4gICAgICB9XG5cbiAgICAgIHJvdXRlICs9IGNhcHR1cmVcbiAgICB9XG4gIH1cblxuICB2YXIgZGVsaW1pdGVyID0gZXNjYXBlU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJylcbiAgdmFyIGVuZHNXaXRoRGVsaW1pdGVyID0gcm91dGUuc2xpY2UoLWRlbGltaXRlci5sZW5ndGgpID09PSBkZWxpbWl0ZXJcblxuICAvLyBJbiBub24tc3RyaWN0IG1vZGUgd2UgYWxsb3cgYSBzbGFzaCBhdCB0aGUgZW5kIG9mIG1hdGNoLiBJZiB0aGUgcGF0aCB0b1xuICAvLyBtYXRjaCBhbHJlYWR5IGVuZHMgd2l0aCBhIHNsYXNoLCB3ZSByZW1vdmUgaXQgZm9yIGNvbnNpc3RlbmN5LiBUaGUgc2xhc2hcbiAgLy8gaXMgdmFsaWQgYXQgdGhlIGVuZCBvZiBhIHBhdGggbWF0Y2gsIG5vdCBpbiB0aGUgbWlkZGxlLiBUaGlzIGlzIGltcG9ydGFudFxuICAvLyBpbiBub24tZW5kaW5nIG1vZGUsIHdoZXJlIFwiL3Rlc3QvXCIgc2hvdWxkbid0IG1hdGNoIFwiL3Rlc3QvL3JvdXRlXCIuXG4gIGlmICghc3RyaWN0KSB7XG4gICAgcm91dGUgPSAoZW5kc1dpdGhEZWxpbWl0ZXIgPyByb3V0ZS5zbGljZSgwLCAtZGVsaW1pdGVyLmxlbmd0aCkgOiByb3V0ZSkgKyAnKD86JyArIGRlbGltaXRlciArICcoPz0kKSk/J1xuICB9XG5cbiAgaWYgKGVuZCkge1xuICAgIHJvdXRlICs9ICckJ1xuICB9IGVsc2Uge1xuICAgIC8vIEluIG5vbi1lbmRpbmcgbW9kZSwgd2UgbmVlZCB0aGUgY2FwdHVyaW5nIGdyb3VwcyB0byBtYXRjaCBhcyBtdWNoIGFzXG4gICAgLy8gcG9zc2libGUgYnkgdXNpbmcgYSBwb3NpdGl2ZSBsb29rYWhlYWQgdG8gdGhlIGVuZCBvciBuZXh0IHBhdGggc2VnbWVudC5cbiAgICByb3V0ZSArPSBzdHJpY3QgJiYgZW5kc1dpdGhEZWxpbWl0ZXIgPyAnJyA6ICcoPz0nICsgZGVsaW1pdGVyICsgJ3wkKSdcbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKG5ldyBSZWdFeHAoJ14nICsgcm91dGUsIGZsYWdzKG9wdGlvbnMpKSwga2V5cylcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIHBhdGggc3RyaW5nLCByZXR1cm5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQW4gZW1wdHkgYXJyYXkgY2FuIGJlIHBhc3NlZCBpbiBmb3IgdGhlIGtleXMsIHdoaWNoIHdpbGwgaG9sZCB0aGVcbiAqIHBsYWNlaG9sZGVyIGtleSBkZXNjcmlwdGlvbnMuIEZvciBleGFtcGxlLCB1c2luZyBgL3VzZXIvOmlkYCwgYGtleXNgIHdpbGxcbiAqIGNvbnRhaW4gYFt7IG5hbWU6ICdpZCcsIGRlbGltaXRlcjogJy8nLCBvcHRpb25hbDogZmFsc2UsIHJlcGVhdDogZmFsc2UgfV1gLlxuICpcbiAqIEBwYXJhbSAgeyhzdHJpbmd8UmVnRXhwfEFycmF5KX0gcGF0aFxuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSAgICAgICBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHBhdGhUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICBpZiAoIWlzYXJyYXkoa2V5cykpIHtcbiAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyAoa2V5cyB8fCBvcHRpb25zKVxuICAgIGtleXMgPSBbXVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiByZWdleHBUb1JlZ2V4cChwYXRoLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpKVxuICB9XG5cbiAgaWYgKGlzYXJyYXkocGF0aCkpIHtcbiAgICByZXR1cm4gYXJyYXlUb1JlZ2V4cCgvKiogQHR5cGUgeyFBcnJheX0gKi8gKHBhdGgpLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIHN0cmluZ1RvUmVnZXhwKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3Rkb3V0OiBmYWxzZSxcblx0c3RkZXJyOiBmYWxzZVxufTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC50eXBlRGV0ZWN0ID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiB0eXBlLWRldGVjdFxuICogQ29weXJpZ2h0KGMpIDIwMTMgamFrZSBsdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xudmFyIHByb21pc2VFeGlzdHMgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJztcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbnZhciBnbG9iYWxPYmplY3QgPSB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgPyBzZWxmIDogZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGlkLWJsYWNrbGlzdFxuXG52YXIgc3ltYm9sRXhpc3RzID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgbWFwRXhpc3RzID0gdHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc2V0RXhpc3RzID0gdHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgd2Vha01hcEV4aXN0cyA9IHR5cGVvZiBXZWFrTWFwICE9PSAndW5kZWZpbmVkJztcbnZhciB3ZWFrU2V0RXhpc3RzID0gdHlwZW9mIFdlYWtTZXQgIT09ICd1bmRlZmluZWQnO1xudmFyIGRhdGFWaWV3RXhpc3RzID0gdHlwZW9mIERhdGFWaWV3ICE9PSAndW5kZWZpbmVkJztcbnZhciBzeW1ib2xJdGVyYXRvckV4aXN0cyA9IHN5bWJvbEV4aXN0cyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSAndW5kZWZpbmVkJztcbnZhciBzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyA9IHN5bWJvbEV4aXN0cyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnICE9PSAndW5kZWZpbmVkJztcbnZhciBzZXRFbnRyaWVzRXhpc3RzID0gc2V0RXhpc3RzICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG52YXIgbWFwRW50cmllc0V4aXN0cyA9IG1hcEV4aXN0cyAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xudmFyIHNldEl0ZXJhdG9yUHJvdG90eXBlID0gc2V0RW50cmllc0V4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IFNldCgpLmVudHJpZXMoKSk7XG52YXIgbWFwSXRlcmF0b3JQcm90b3R5cGUgPSBtYXBFbnRyaWVzRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgTWFwKCkuZW50cmllcygpKTtcbnZhciBhcnJheUl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sSXRlcmF0b3JFeGlzdHMgJiYgdHlwZW9mIEFycmF5LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xudmFyIGFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBhcnJheUl0ZXJhdG9yRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpO1xudmFyIHN0cmluZ0l0ZXJhdG9yRXhpc3RzID0gc3ltYm9sSXRlcmF0b3JFeGlzdHMgJiYgdHlwZW9mIFN0cmluZy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbnZhciBzdHJpbmdJdGVyYXRvclByb3RvdHlwZSA9IHN0cmluZ0l0ZXJhdG9yRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZignJ1tTeW1ib2wuaXRlcmF0b3JdKCkpO1xudmFyIHRvU3RyaW5nTGVmdFNsaWNlTGVuZ3RoID0gODtcbnZhciB0b1N0cmluZ1JpZ2h0U2xpY2VMZW5ndGggPSAtMTtcbi8qKlxuICogIyMjIHR5cGVPZiAob2JqKVxuICpcbiAqIFVzZXMgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhbiBvYmplY3QsXG4gKiBub3JtYWxpc2luZyBiZWhhdmlvdXIgYWNyb3NzIGVuZ2luZSB2ZXJzaW9ucyAmIHdlbGwgb3B0aW1pc2VkLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBvYmplY3QgdHlwZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gdHlwZURldGVjdChvYmopIHtcbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgICogUHJlOlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDMsMDM5LDAzNSBvcHMvc2VjIMKxMS42MiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAxLDQyNCwxMzggb3BzL3NlYyDCsTQuNTQlICg3NSBydW5zIHNhbXBsZWQpXG4gICAqICAgbnVtYmVyIGxpdGVyYWwgICAgIHggMSw2NTMsMTUzIG9wcy9zZWMgwrExLjkxJSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDksOTc4LDY2MCBvcHMvc2VjIMKxMS45MiUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAyLDU1Niw3Njkgb3BzL3NlYyDCsTEuNzMlICg3NyBydW5zIHNhbXBsZWQpXG4gICAqIFBvc3Q6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMzgsNTY0LDc5NiBvcHMvc2VjIMKxMS4xNSUgKDc5IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAzMSwxNDgsOTQwIG9wcy9zZWMgwrExLjEwJSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDMyLDY3OSwzMzAgb3BzL3NlYyDCsTEuOTAlICg3OCBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggMzIsMzYzLDM2OCBvcHMvc2VjIMKxMS4wNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAzMSwyOTYsODcwIG9wcy9zZWMgwrEwLjk2JSAoODMgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGVvZk9iajtcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAyOCw2NDUsNzY1IG9wcy9zZWMgwrExLjE3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIG51bGwgICAgICAgICAgICAgICB4IDM2LDQyOCw5NjIgb3BzL3NlYyDCsTEuMzclICg4NCBydW5zIHNhbXBsZWQpXG4gICAqL1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdylgYFxuICAgKiAgLSBOb2RlID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFBoYW50b21KUyA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gSUUgMTEgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gSUUgRWRnZSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpYGBcbiAgICogIC0gQ2hyb21lIFdvcmtlciA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBGaXJlZm94IFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIFNhZmFyaSBXb3JrZXIgPT09IFwiW29iamVjdCBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBJRSAxMSBXb3JrZXIgPT09IFwiW29iamVjdCBXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBJRSBFZGdlIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqL1xuICBpZiAob2JqID09PSBnbG9iYWxPYmplY3QpIHtcbiAgICByZXR1cm4gJ2dsb2JhbCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgYXJyYXkgbGl0ZXJhbCAgICAgIHggMiw4ODgsMzUyIG9wcy9zZWMgwrEwLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIyLDQ3OSw2NTAgb3BzL3NlYyDCsTAuOTYlICg4MSBydW5zIHNhbXBsZWQpXG4gICAqL1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShvYmopICYmXG4gICAgKHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID09PSBmYWxzZSB8fCAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBvYmopKVxuICApIHtcbiAgICByZXR1cm4gJ0FycmF5JztcbiAgfVxuXG4gIC8vIE5vdCBjYWNoaW5nIGV4aXN0ZW5jZSBvZiBgd2luZG93YCBhbmQgcmVsYXRlZCBwcm9wZXJ0aWVzIGR1ZSB0byBwb3RlbnRpYWxcbiAgLy8gZm9yIGB3aW5kb3dgIHRvIGJlIHVuc2V0IGJlZm9yZSB0ZXN0cyBpbiBxdWFzaS1icm93c2VyIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmIHdpbmRvdyAhPT0gbnVsbCkge1xuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2xvY2F0aW9uKVxuICAgICAqIFdoYXRXRyBIVE1MJDcuNy4zIC0gVGhlIGBMb2NhdGlvbmAgaW50ZXJmYWNlXG4gICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cubG9jYXRpb24pYGBcbiAgICAgKiAgLSBJRSA8PTExID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAgICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYXRpb24gPT09ICdvYmplY3QnICYmIG9iaiA9PT0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gJ0xvY2F0aW9uJztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG9jdW1lbnQpXG4gICAgICogV2hhdFdHIEhUTUwkMy4xLjEgLSBUaGUgYERvY3VtZW50YCBvYmplY3RcbiAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTI2ODA5MjY4KVxuICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgKiAgICAgICBXaGF0V0cgSFRNTCBzdGF0ZXM6XG4gICAgICogICAgICAgICA+IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIFdpbmRvdyBvYmplY3RzIG11c3QgYWxzbyBoYXZlIGFcbiAgICAgKiAgICAgICAgID4gd3JpdGFibGUsIGNvbmZpZ3VyYWJsZSwgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgbmFtZWRcbiAgICAgKiAgICAgICAgID4gSFRNTERvY3VtZW50IHdob3NlIHZhbHVlIGlzIHRoZSBEb2N1bWVudCBpbnRlcmZhY2Ugb2JqZWN0LlxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQpYGBcbiAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgMTEgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBJRSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5kb2N1bWVudCA9PT0gJ29iamVjdCcgJiYgb2JqID09PSB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiAnRG9jdW1lbnQnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNtaW1ldHlwZWFycmF5KVxuICAgICAgICogV2hhdFdHIEhUTUwkOC42LjEuNSAtIFBsdWdpbnMgLSBJbnRlcmZhY2UgTWltZVR5cGVBcnJheVxuICAgICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuYXZpZ2F0b3IubWltZVR5cGVzKWBgXG4gICAgICAgKiAgLSBJRSA8PTEwID09PSBcIltvYmplY3QgTVNNaW1lVHlwZXNDb2xsZWN0aW9uXVwiXG4gICAgICAgKi9cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5taW1lVHlwZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgb2JqID09PSB3aW5kb3cubmF2aWdhdG9yLm1pbWVUeXBlcykge1xuICAgICAgICByZXR1cm4gJ01pbWVUeXBlQXJyYXknO1xuICAgICAgfVxuXG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjcGx1Z2luYXJyYXkpXG4gICAgICAgKiBXaGF0V0cgSFRNTCQ4LjYuMS41IC0gUGx1Z2lucyAtIEludGVyZmFjZSBQbHVnaW5BcnJheVxuICAgICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuYXZpZ2F0b3IucGx1Z2lucylgYFxuICAgICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TUGx1Z2luc0NvbGxlY3Rpb25dXCJcbiAgICAgICAqL1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLnBsdWdpbnMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgb2JqID09PSB3aW5kb3cubmF2aWdhdG9yLnBsdWdpbnMpIHtcbiAgICAgICAgcmV0dXJuICdQbHVnaW5BcnJheSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCh0eXBlb2Ygd2luZG93LkhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgPT09ICdvYmplY3QnKSAmJlxuICAgICAgICBvYmogaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpIHtcbiAgICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3BsdWdpbmFycmF5KVxuICAgICAgKiBXaGF0V0cgSFRNTCQ0LjQuNCAtIFRoZSBgYmxvY2txdW90ZWAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFF1b3RlRWxlbWVudGBcbiAgICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdibG9ja3F1b3RlJykpYGBcbiAgICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IEhUTUxCbG9ja0VsZW1lbnRdXCJcbiAgICAgICovXG4gICAgICBpZiAob2JqLnRhZ05hbWUgPT09ICdCTE9DS1FVT1RFJykge1xuICAgICAgICByZXR1cm4gJ0hUTUxRdW90ZUVsZW1lbnQnO1xuICAgICAgfVxuXG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNodG1sdGFibGVkYXRhY2VsbGVsZW1lbnQpXG4gICAgICAgKiBXaGF0V0cgSFRNTCQ0LjkuOSAtIFRoZSBgdGRgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxUYWJsZURhdGFDZWxsRWxlbWVudGBcbiAgICAgICAqIE5vdGU6IE1vc3QgYnJvd3NlcnMgY3VycmVudGx5IGFkaGVyIHRvIHRoZSBXM0MgRE9NIExldmVsIDIgc3BlY1xuICAgICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC04MjkxNTA3NSlcbiAgICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgICAqICAgICAgIGJvdGggVEQgYW5kIFRIIGVsZW1lbnRzLiBXaGF0V0cgc2VwYXJhdGVzIHRoZXNlLlxuICAgICAgICogVGVzdDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJykpXG4gICAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICovXG4gICAgICBpZiAob2JqLnRhZ05hbWUgPT09ICdURCcpIHtcbiAgICAgICAgcmV0dXJuICdIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQnO1xuICAgICAgfVxuXG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNodG1sdGFibGVoZWFkZXJjZWxsZWxlbWVudClcbiAgICAgICAqIFdoYXRXRyBIVE1MJDQuOS45IC0gVGhlIGB0ZGAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnRgXG4gICAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtODI5MTUwNzUpXG4gICAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgICAqIFRlc3Q6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0aCcpKVxuICAgICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnVEgnKSB7XG4gICAgICAgIHJldHVybiAnSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgRmxvYXQ2NEFycmF5ICAgICAgIHggNjI1LDY0NCBvcHMvc2VjIMKxMS41OCUgKDgwIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEZsb2F0MzJBcnJheSAgICAgICB4IDEsMjc5LDg1MiBvcHMvc2VjIMKxMi45MSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDEsMTc4LDE4NSBvcHMvc2VjIMKxMS45NSUgKDgzIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQxNkFycmF5ICAgICAgICB4IDEsMDA4LDM4MCBvcHMvc2VjIMKxMi4yNSUgKDgwIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4QXJyYXkgICAgICAgICB4IDEsMTI4LDA0MCBvcHMvc2VjIMKxMi4xMSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDEsMTcwLDExOSBvcHMvc2VjIMKxMi44OCUgKDgwIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDE2QXJyYXkgICAgICAgICB4IDEsMTc2LDM0OCBvcHMvc2VjIMKxNS43OSUgKDg2IHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDhBcnJheSAgICAgICAgICB4IDEsMDU4LDcwNyBvcHMvc2VjIMKxNC45NCUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDEsMTEwLDYzMyBvcHMvc2VjIMKxNC4yMCUgKDgwIHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgRmxvYXQ2NEFycmF5ICAgICAgIHggNywxMDUsNjcxIG9wcy9zZWMgwrExMy40NyUgKDY0IHJ1bnMgc2FtcGxlZClcbiAgKiAgIEZsb2F0MzJBcnJheSAgICAgICB4IDUsODg3LDkxMiBvcHMvc2VjIMKxMS40NiUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDYsNDkxLDY2MSBvcHMvc2VjIMKxMS43NiUgKDc5IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQxNkFycmF5ICAgICAgICB4IDYsNTU5LDc5NSBvcHMvc2VjIMKxMS42NyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4QXJyYXkgICAgICAgICB4IDYsNDYzLDk2NiBvcHMvc2VjIMKxMS40MyUgKDg1IHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDUsNjQxLDg0MSBvcHMvc2VjIMKxMy40OSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDE2QXJyYXkgICAgICAgICB4IDYsNTgzLDUxMSBvcHMvc2VjIMKxMS45OCUgKDgwIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDhBcnJheSAgICAgICAgICB4IDYsNjA2LDA3OCBvcHMvc2VjIMKxMS43NCUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDYsNjAyLDIyNCBvcHMvc2VjIMKxMS43NyUgKDgzIHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgdmFyIHN0cmluZ1RhZyA9IChzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyAmJiBvYmpbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmdUYWc7XG4gIH1cblxuICB2YXIgb2JqUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgcmVnZXggbGl0ZXJhbCAgICAgIHggMSw3NzIsMzg1IG9wcy9zZWMgwrExLjg1JSAoNzcgcnVucyBzYW1wbGVkKVxuICAqICAgcmVnZXggY29uc3RydWN0b3IgIHggMiwxNDMsNjM0IG9wcy9zZWMgwrEyLjQ2JSAoNzggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICByZWdleCBsaXRlcmFsICAgICAgeCAzLDkyOCwwMDkgb3BzL3NlYyDCsTAuNjUlICg3OCBydW5zIHNhbXBsZWQpXG4gICogICByZWdleCBjb25zdHJ1Y3RvciAgeCAzLDkzMSwxMDggb3BzL3NlYyDCsTAuNTglICg4NCBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IFJlZ0V4cC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1JlZ0V4cCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIGRhdGUgICAgICAgICAgICAgICB4IDIsMTMwLDA3NCBvcHMvc2VjIMKxNC40MiUgKDY4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMyw5NTMsNzc5IG9wcy9zZWMgwrExLjM1JSAoNzcgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAob2JqUHJvdG90eXBlID09PSBEYXRlLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnRGF0ZSc7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtcHJvbWlzZS5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDI1LjQuNS40IC0gUHJvbWlzZS5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiUHJvbWlzZVwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFByb21pc2UucmVzb2x2ZSgpKWBgXG4gICAqICAtIENocm9tZSA8PTQ3ID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqICAtIEVkZ2UgPD0yMCA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKiAgLSBGaXJlZm94IDI5LUxhdGVzdCA9PT0gXCJbb2JqZWN0IFByb21pc2VdXCJcbiAgICogIC0gU2FmYXJpIDcuMS1MYXRlc3QgPT09IFwiW29iamVjdCBQcm9taXNlXVwiXG4gICAqL1xuICBpZiAocHJvbWlzZUV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFByb21pc2UucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdQcm9taXNlJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgc2V0ICAgICAgICAgICAgICAgIHggMiwyMjIsMTg2IG9wcy9zZWMgwrExLjMxJSAoODIgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBzZXQgICAgICAgICAgICAgICAgeCA0LDU0NSw4Nzkgb3BzL3NlYyDCsTEuMTMlICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChzZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBTZXQucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTZXQnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCAyLDM5Niw4NDIgb3BzL3NlYyDCsTEuNTklICg4MSBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIG1hcCAgICAgICAgICAgICAgICB4IDQsMTgzLDk0NSBvcHMvc2VjIMKxNi41OSUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG1hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IE1hcC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ01hcCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHdlYWtzZXQgICAgICAgICAgICB4IDEsMzIzLDIyMCBvcHMvc2VjIMKxMi4xNyUgKDc2IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggNCwyMzcsNTEwIG9wcy9zZWMgwrEyLjAxJSAoNzcgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAod2Vha1NldEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFdlYWtTZXQucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdXZWFrU2V0JztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgd2Vha21hcCAgICAgICAgICAgIHggMSw1MDAsMjYwIG9wcy9zZWMgwrEyLjAyJSAoNzggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICB3ZWFrbWFwICAgICAgICAgICAgeCAzLDg4MSwzODQgb3BzL3NlYyDCsTEuNDUlICg4MiBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmICh3ZWFrTWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gV2Vha01hcC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWRhdGF2aWV3LnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjQuMi40LjIxIC0gRGF0YVZpZXcucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkRhdGFWaWV3XCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoZGF0YVZpZXdFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBEYXRhVmlldy5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGFWaWV3JztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lbWFwaXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMy4xLjUuMi4yIC0gJU1hcEl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJNYXAgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgTWFwKCkuZW50cmllcygpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKG1hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IG1hcEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdNYXAgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVzZXRpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIzLjIuNS4yLjIgLSAlU2V0SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlNldCBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBTZXQoKS5lbnRyaWVzKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc2V0SXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1NldCBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMi4xLjUuMi4yIC0gJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkFycmF5IEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoW11bU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBhcnJheUl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdBcnJheSBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjEuMS41LjIuMiAtICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiU3RyaW5nIEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoJydbU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKHN0cmluZ0l0ZXJhdG9yRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc3RyaW5nSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1N0cmluZyBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDIsNDI0LDMyMCBvcHMvc2VjIMKxMS42NyUgKDc2IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgb2JqZWN0IGZyb20gbnVsbCAgIHggNSw4MzgsMDAwIG9wcy9zZWMgwrEwLjk5JSAoODQgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAob2JqUHJvdG90eXBlID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdFxuICAgIC5wcm90b3R5cGVcbiAgICAudG9TdHJpbmdcbiAgICAuY2FsbChvYmopXG4gICAgLnNsaWNlKHRvU3RyaW5nTGVmdFNsaWNlTGVuZ3RoLCB0b1N0cmluZ1JpZ2h0U2xpY2VMZW5ndGgpO1xufVxuXG5yZXR1cm4gdHlwZURldGVjdDtcblxufSkpKTtcbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiJdfQ== diff --git a/www/static/test/1.9.2/src/ext/ajax-header.js b/www/static/test/1.9.2/src/ext/ajax-header.js new file mode 100644 index 000000000..5c6221bf6 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/ajax-header.js @@ -0,0 +1,7 @@ +htmx.defineExtension('ajax-header', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + evt.detail.headers['X-Requested-With'] = 'XMLHttpRequest'; + } + } +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/alpine-morph.js b/www/static/test/1.9.2/src/ext/alpine-morph.js new file mode 100644 index 000000000..1872daec7 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/alpine-morph.js @@ -0,0 +1,16 @@ +htmx.defineExtension('alpine-morph', { + isInlineSwap: function (swapStyle) { + return swapStyle === 'morph'; + }, + handleSwap: function (swapStyle, target, fragment) { + if (swapStyle === 'morph') { + if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + Alpine.morph(target, fragment.firstElementChild); + return [target]; + } else { + Alpine.morph(target, fragment.outerHTML); + return [target]; + } + } + } +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/class-tools.js b/www/static/test/1.9.2/src/ext/class-tools.js new file mode 100644 index 000000000..1cf4b4269 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/class-tools.js @@ -0,0 +1,92 @@ +(function () { + + function splitOnWhitespace(trigger) { + return trigger.split(/\s+/); + } + + function parseClassOperation(trimmedValue) { + var split = splitOnWhitespace(trimmedValue); + if (split.length > 1) { + var operation = split[0]; + var classDef = split[1].trim(); + var cssClass; + var delay; + if (classDef.indexOf(":") > 0) { + var splitCssClass = classDef.split(':'); + cssClass = splitCssClass[0]; + delay = htmx.parseInterval(splitCssClass[1]); + } else { + cssClass = classDef; + delay = 100; + } + return { + operation: operation, + cssClass: cssClass, + delay: delay + } + } else { + return null; + } + } + + function performOperation(elt, classOperation, classList, currentRunTime) { + setTimeout(function () { + elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass); + }, currentRunTime) + } + + function toggleOperation(elt, classOperation, classList, currentRunTime) { + setTimeout(function () { + setInterval(function () { + elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass); + }, classOperation.delay); + }, currentRunTime) + } + + function processClassList(elt, classList) { + var runs = classList.split("&"); + for (var i = 0; i < runs.length; i++) { + var run = runs[i]; + var currentRunTime = 0; + var classOperations = run.split(","); + for (var j = 0; j < classOperations.length; j++) { + var value = classOperations[j]; + var trimmedValue = value.trim(); + var classOperation = parseClassOperation(trimmedValue); + if (classOperation) { + if (classOperation.operation === "toggle") { + toggleOperation(elt, classOperation, classList, currentRunTime); + currentRunTime = currentRunTime + classOperation.delay; + } else { + currentRunTime = currentRunTime + classOperation.delay; + performOperation(elt, classOperation, classList, currentRunTime); + } + } + } + } + } + + function maybeProcessClasses(elt) { + if (elt.getAttribute) { + var classList = elt.getAttribute("classes") || elt.getAttribute("data-classes"); + if (classList) { + processClassList(elt, classList); + } + } + } + + htmx.defineExtension('class-tools', { + onEvent: function (name, evt) { + if (name === "htmx:afterProcessNode") { + var elt = evt.detail.elt; + maybeProcessClasses(elt); + if (elt.querySelectorAll) { + var children = elt.querySelectorAll("[classes], [data-classes]"); + for (var i = 0; i < children.length; i++) { + maybeProcessClasses(children[i]); + } + } + } + } + }); +})(); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/client-side-templates.js b/www/static/test/1.9.2/src/ext/client-side-templates.js new file mode 100644 index 000000000..9d47d270e --- /dev/null +++ b/www/static/test/1.9.2/src/ext/client-side-templates.js @@ -0,0 +1,37 @@ +htmx.defineExtension('client-side-templates', { + transformResponse : function(text, xhr, elt) { + + var mustacheTemplate = htmx.closest(elt, "[mustache-template]"); + if (mustacheTemplate) { + var data = JSON.parse(text); + var templateId = mustacheTemplate.getAttribute('mustache-template'); + var template = htmx.find("#" + templateId); + if (template) { + return Mustache.render(template.innerHTML, data); + } else { + throw "Unknown mustache template: " + templateId; + } + } + + var handlebarsTemplate = htmx.closest(elt, "[handlebars-template]"); + if (handlebarsTemplate) { + var data = JSON.parse(text); + var templateName = handlebarsTemplate.getAttribute('handlebars-template'); + return Handlebars.partials[templateName](data); + } + + var nunjucksTemplate = htmx.closest(elt, "[nunjucks-template]"); + if (nunjucksTemplate) { + var data = JSON.parse(text); + var templateName = nunjucksTemplate.getAttribute('nunjucks-template'); + var template = htmx.find('#' + templateName); + if (template) { + return nunjucks.renderString(template.innerHTML, data); + } else { + return nunjucks.render(templateName, data); + } + } + + return text; + } +}); diff --git a/www/static/test/1.9.2/src/ext/debug.js b/www/static/test/1.9.2/src/ext/debug.js new file mode 100644 index 000000000..861ee743c --- /dev/null +++ b/www/static/test/1.9.2/src/ext/debug.js @@ -0,0 +1,11 @@ +htmx.defineExtension('debug', { + onEvent: function (name, evt) { + if (console.debug) { + console.debug(name, evt); + } else if (console) { + console.log("DEBUG:", name, evt); + } else { + throw "NO CONSOLE SUPPORTED" + } + } +}); diff --git a/www/static/test/1.9.2/src/ext/disable-element.js b/www/static/test/1.9.2/src/ext/disable-element.js new file mode 100644 index 000000000..3493d811a --- /dev/null +++ b/www/static/test/1.9.2/src/ext/disable-element.js @@ -0,0 +1,16 @@ +"use strict"; + +// Disable Submit Button +htmx.defineExtension('disable-element', { + onEvent: function (name, evt) { + let elt = evt.detail.elt; + let target = elt.getAttribute("hx-disable-element"); + let targetElement = (target == "self") ? elt : document.querySelector(target); + + if (name === "htmx:beforeRequest" && targetElement) { + targetElement.disabled = true; + } else if (name == "htmx:afterRequest" && targetElement) { + targetElement.disabled = false; + } + } +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/event-header.js b/www/static/test/1.9.2/src/ext/event-header.js new file mode 100644 index 000000000..c7d29334e --- /dev/null +++ b/www/static/test/1.9.2/src/ext/event-header.js @@ -0,0 +1,37 @@ +(function(){ + function stringifyEvent(event) { + var obj = {}; + for (var key in event) { + obj[key] = event[key]; + } + return JSON.stringify(obj, function(key, value){ + if(value instanceof Node){ + var nodeRep = value.tagName; + if (nodeRep) { + nodeRep = nodeRep.toLowerCase(); + if(value.id){ + nodeRep += "#" + value.id; + } + if(value.classList && value.classList.length){ + nodeRep += "." + value.classList.toString().replace(" ", ".") + } + return nodeRep; + } else { + return "Node" + } + } + if (value instanceof Window) return 'Window'; + return value; + }); + } + + htmx.defineExtension('event-header', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + if (evt.detail.triggeringEvent) { + evt.detail.headers['Triggering-Event'] = stringifyEvent(evt.detail.triggeringEvent); + } + } + } + }); +})(); diff --git a/www/static/test/1.9.2/src/ext/head-support.js b/www/static/test/1.9.2/src/ext/head-support.js new file mode 100644 index 000000000..67cfc6924 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/head-support.js @@ -0,0 +1,141 @@ +//========================================================== +// head-support.js +// +// An extension to htmx 1.0 to add head tag merging. +//========================================================== +(function(){ + + var api = null; + + function log() { + //console.log(arguments); + } + + function mergeHead(newContent, defaultMergeStrategy) { + + if (newContent && newContent.indexOf(' -1) { + const htmlDoc = document.createElement("html"); + // remove svgs to avoid conflicts + var contentWithSvgsRemoved = newContent.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); + // extract head tag + var headTag = contentWithSvgsRemoved.match(/(]*>|>)([\s\S]*?)<\/head>)/im); + + // if the head tag exists... + if (headTag) { + + var added = [] + var removed = [] + var preserved = [] + var nodesToAppend = [] + + htmlDoc.innerHTML = headTag; + var newHeadTag = htmlDoc.querySelector("head"); + var currentHead = document.head; + + if (newHeadTag == null) { + return; + } else { + // put all new head elements into a Map, by their outerHTML + var srcToNewHeadNodes = new Map(); + for (const newHeadChild of newHeadTag.children) { + srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); + } + } + + + + // determine merge strategy + var mergeStrategy = api.getAttributeValue(newHeadTag, "hx-head") || defaultMergeStrategy; + + // get the current head + for (const currentHeadElt of currentHead.children) { + + // If the current head element is in the map + var inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); + var isReAppended = currentHeadElt.getAttribute("hx-head") === "re-eval"; + var isPreserved = api.getAttributeValue(currentHeadElt, "hx-preserve") === "true"; + if (inNewContent || isPreserved) { + if (isReAppended) { + // remove the current version and let the new version replace it and re-execute + removed.push(currentHeadElt); + } else { + // this element already exists and should not be re-appended, so remove it from + // the new content map, preserving it in the DOM + srcToNewHeadNodes.delete(currentHeadElt.outerHTML); + preserved.push(currentHeadElt); + } + } else { + if (mergeStrategy === "append") { + // we are appending and this existing element is not new content + // so if and only if it is marked for re-append do we do anything + if (isReAppended) { + removed.push(currentHeadElt); + nodesToAppend.push(currentHeadElt); + } + } else { + // if this is a merge, we remove this content since it is not in the new head + if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: currentHeadElt}) !== false) { + removed.push(currentHeadElt); + } + } + } + } + + // Push the tremaining new head elements in the Map into the + // nodes to append to the head tag + nodesToAppend.push(...srcToNewHeadNodes.values()); + log("to append: ", nodesToAppend); + + for (const newNode of nodesToAppend) { + log("adding: ", newNode); + var newElt = document.createRange().createContextualFragment(newNode.outerHTML); + log(newElt); + if (api.triggerEvent(document.body, "htmx:addingHeadElement", {headElement: newElt}) !== false) { + currentHead.appendChild(newElt); + added.push(newElt); + } + } + + // remove all removed elements, after we have appended the new elements to avoid + // additional network requests for things like style sheets + for (const removedElement of removed) { + if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: removedElement}) !== false) { + currentHead.removeChild(removedElement); + } + } + + api.triggerEvent(document.body, "htmx:afterHeadMerge", {added: added, kept: preserved, removed: removed}); + } + } + } + + htmx.defineExtension("head-support", { + init: function(apiRef) { + // store a reference to the internal API. + api = apiRef; + + htmx.on('htmx:afterSwap', function(evt){ + var serverResponse = evt.detail.xhr.response; + if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) { + mergeHead(serverResponse, evt.detail.boosted ? "merge" : "append"); + } + }) + + htmx.on('htmx:historyRestore', function(evt){ + if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) { + if (evt.detail.cacheMiss) { + mergeHead(evt.detail.serverResponse, "merge"); + } else { + mergeHead(evt.detail.item.head, "merge"); + } + } + }) + + htmx.on('htmx:historyItemCreated', function(evt){ + var historyItem = evt.detail.item; + historyItem.head = document.head.outerHTML; + }) + } + }); + +})() \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/include-vals.js b/www/static/test/1.9.2/src/ext/include-vals.js new file mode 100644 index 000000000..d8f5ce4fa --- /dev/null +++ b/www/static/test/1.9.2/src/ext/include-vals.js @@ -0,0 +1,24 @@ +(function(){ + + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + htmx.defineExtension('include-vals', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + var includeValsElt = htmx.closest(evt.detail.elt, "[include-vals],[data-include-vals]"); + if (includeValsElt) { + var includeVals = includeValsElt.getAttribute("include-vals") || includeValsElt.getAttribute("data-include-vals"); + var valuesToInclude = eval("({" + includeVals + "})"); + mergeObjects(evt.detail.parameters, valuesToInclude); + } + } + } + }); +})(); diff --git a/www/static/test/1.9.2/src/ext/json-enc.js b/www/static/test/1.9.2/src/ext/json-enc.js new file mode 100644 index 000000000..db0aa36f2 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/json-enc.js @@ -0,0 +1,12 @@ +htmx.defineExtension('json-enc', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + evt.detail.headers['Content-Type'] = "application/json"; + } + }, + + encodeParameters : function(xhr, parameters, elt) { + xhr.overrideMimeType('text/json'); + return (JSON.stringify(parameters)); + } +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/loading-states.js b/www/static/test/1.9.2/src/ext/loading-states.js new file mode 100644 index 000000000..20f7d3bfb --- /dev/null +++ b/www/static/test/1.9.2/src/ext/loading-states.js @@ -0,0 +1,179 @@ +;(function () { + let loadingStatesUndoQueue = [] + + function loadingStateContainer(target) { + return htmx.closest(target, '[data-loading-states]') || document.body + } + + function mayProcessUndoCallback(target, callback) { + if (document.body.contains(target)) { + callback() + } + } + + function mayProcessLoadingStateByPath(elt, requestPath) { + const pathElt = htmx.closest(elt, '[data-loading-path]') + if (!pathElt) { + return true + } + + return pathElt.getAttribute('data-loading-path') === requestPath + } + + function queueLoadingState(sourceElt, targetElt, doCallback, undoCallback) { + const delayElt = htmx.closest(sourceElt, '[data-loading-delay]') + if (delayElt) { + const delayInMilliseconds = + delayElt.getAttribute('data-loading-delay') || 200 + const timeout = setTimeout(() => { + doCallback() + + loadingStatesUndoQueue.push(() => { + mayProcessUndoCallback(targetElt, () => undoCallback()) + }) + }, delayInMilliseconds) + + loadingStatesUndoQueue.push(() => { + mayProcessUndoCallback(targetElt, () => clearTimeout(timeout)) + }) + } else { + doCallback() + loadingStatesUndoQueue.push(() => { + mayProcessUndoCallback(targetElt, () => undoCallback()) + }) + } + } + + function getLoadingStateElts(loadingScope, type, path) { + return Array.from(htmx.findAll(loadingScope, `[${type}]`)).filter( + (elt) => mayProcessLoadingStateByPath(elt, path) + ) + } + + function getLoadingTarget(elt) { + if (elt.getAttribute('data-loading-target')) { + return Array.from( + htmx.findAll(elt.getAttribute('data-loading-target')) + ) + } + return [elt] + } + + htmx.defineExtension('loading-states', { + onEvent: function (name, evt) { + if (name === 'htmx:beforeRequest') { + const container = loadingStateContainer(evt.target) + + const loadingStateTypes = [ + 'data-loading', + 'data-loading-class', + 'data-loading-class-remove', + 'data-loading-disable', + 'data-loading-aria-busy', + ] + + let loadingStateEltsByType = {} + + loadingStateTypes.forEach((type) => { + loadingStateEltsByType[type] = getLoadingStateElts( + container, + type, + evt.detail.pathInfo.requestPath + ) + }) + + loadingStateEltsByType['data-loading'].forEach((sourceElt) => { + getLoadingTarget(sourceElt).forEach((targetElt) => { + queueLoadingState( + sourceElt, + targetElt, + () => + (targetElt.style.display = + sourceElt.getAttribute('data-loading') || + 'inline-block'), + () => (targetElt.style.display = 'none') + ) + }) + }) + + loadingStateEltsByType['data-loading-class'].forEach( + (sourceElt) => { + const classNames = sourceElt + .getAttribute('data-loading-class') + .split(' ') + + getLoadingTarget(sourceElt).forEach((targetElt) => { + queueLoadingState( + sourceElt, + targetElt, + () => + classNames.forEach((className) => + targetElt.classList.add(className) + ), + () => + classNames.forEach((className) => + targetElt.classList.remove(className) + ) + ) + }) + } + ) + + loadingStateEltsByType['data-loading-class-remove'].forEach( + (sourceElt) => { + const classNames = sourceElt + .getAttribute('data-loading-class-remove') + .split(' ') + + getLoadingTarget(sourceElt).forEach((targetElt) => { + queueLoadingState( + sourceElt, + targetElt, + () => + classNames.forEach((className) => + targetElt.classList.remove(className) + ), + () => + classNames.forEach((className) => + targetElt.classList.add(className) + ) + ) + }) + } + ) + + loadingStateEltsByType['data-loading-disable'].forEach( + (sourceElt) => { + getLoadingTarget(sourceElt).forEach((targetElt) => { + queueLoadingState( + sourceElt, + targetElt, + () => (targetElt.disabled = true), + () => (targetElt.disabled = false) + ) + }) + } + ) + + loadingStateEltsByType['data-loading-aria-busy'].forEach( + (sourceElt) => { + getLoadingTarget(sourceElt).forEach((targetElt) => { + queueLoadingState( + sourceElt, + targetElt, + () => (targetElt.setAttribute("aria-busy", "true")), + () => (targetElt.removeAttribute("aria-busy")) + ) + }) + } + ) + } + + if (name === 'htmx:beforeOnLoad') { + while (loadingStatesUndoQueue.length > 0) { + loadingStatesUndoQueue.shift()() + } + } + }, + }) +})() diff --git a/www/static/test/1.9.2/src/ext/method-override.js b/www/static/test/1.9.2/src/ext/method-override.js new file mode 100644 index 000000000..2e3504cb0 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/method-override.js @@ -0,0 +1,11 @@ +htmx.defineExtension('method-override', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + var method = evt.detail.verb; + if (method !== "get" || method !== "post") { + evt.detail.headers['X-HTTP-Method-Override'] = method.toUpperCase(); + evt.detail.verb = "post"; + } + } + } +}); diff --git a/www/static/test/1.9.2/src/ext/morphdom-swap.js b/www/static/test/1.9.2/src/ext/morphdom-swap.js new file mode 100644 index 000000000..a5a7e5a3c --- /dev/null +++ b/www/static/test/1.9.2/src/ext/morphdom-swap.js @@ -0,0 +1,16 @@ +htmx.defineExtension('morphdom-swap', { + isInlineSwap: function(swapStyle) { + return swapStyle === 'morphdom'; + }, + handleSwap: function (swapStyle, target, fragment) { + if (swapStyle === 'morphdom') { + if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + morphdom(target, fragment.firstElementChild); + return [target]; + } else { + morphdom(target, fragment.outerHTML); + return [target]; + } + } + } +}); diff --git a/www/static/test/1.9.2/src/ext/multi-swap.js b/www/static/test/1.9.2/src/ext/multi-swap.js new file mode 100644 index 000000000..f38f5b065 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/multi-swap.js @@ -0,0 +1,45 @@ +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension('multi-swap', { + init: function (apiRef) { + api = apiRef; + }, + isInlineSwap: function (swapStyle) { + return swapStyle.indexOf('multi:') === 0; + }, + handleSwap: function (swapStyle, target, fragment, settleInfo) { + if (swapStyle.indexOf('multi:') === 0) { + var selectorToSwapStyle = {}; + var elements = swapStyle.replace(/^multi\s*:\s*/, '').split(/\s*,\s*/); + + elements.map(function (element) { + var split = element.split(/\s*:\s*/); + var elementSelector = split[0]; + var elementSwapStyle = typeof (split[1]) !== "undefined" ? split[1] : "innerHTML"; + + if (elementSelector.charAt(0) !== '#') { + console.error("HTMX multi-swap: unsupported selector '" + elementSelector + "'. Only ID selectors starting with '#' are supported."); + return; + } + + selectorToSwapStyle[elementSelector] = elementSwapStyle; + }); + + for (var selector in selectorToSwapStyle) { + var swapStyle = selectorToSwapStyle[selector]; + var elementToSwap = fragment.querySelector(selector); + if (elementToSwap) { + api.oobSwap(swapStyle, elementToSwap, settleInfo); + } else { + console.warn("HTMX multi-swap: selector '" + selector + "' not found in source content."); + } + } + + return true; + } + } + }); +})(); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/path-deps.js b/www/static/test/1.9.2/src/ext/path-deps.js new file mode 100644 index 000000000..4987e50eb --- /dev/null +++ b/www/static/test/1.9.2/src/ext/path-deps.js @@ -0,0 +1,60 @@ +(function(undefined){ + 'use strict'; + + // Save a reference to the global object (window in the browser) + var _root = this; + + function dependsOn(pathSpec, url) { + if (pathSpec === "ignore") { + return false; + } + var dependencyPath = pathSpec.split("/"); + var urlPath = url.split("/"); + for (var i = 0; i < urlPath.length; i++) { + var dependencyElement = dependencyPath.shift(); + var pathElement = urlPath[i]; + if (dependencyElement !== pathElement && dependencyElement !== "*") { + return false; + } + if (dependencyPath.length === 0 || (dependencyPath.length === 1 && dependencyPath[0] === "")) { + return true; + } + } + return false; + } + + function refreshPath(path) { + var eltsWithDeps = htmx.findAll("[path-deps]"); + for (var i = 0; i < eltsWithDeps.length; i++) { + var elt = eltsWithDeps[i]; + if (dependsOn(elt.getAttribute('path-deps'), path)) { + htmx.trigger(elt, "path-deps"); + } + } + } + + htmx.defineExtension('path-deps', { + onEvent: function (name, evt) { + if (name === "htmx:beforeOnLoad") { + var config = evt.detail.requestConfig; + // mutating call + if (config.verb !== "get" && evt.target.getAttribute('path-deps') !== 'ignore') { + refreshPath(config.path); + } + } + } + }); + + /** + * ******************** + * Expose functionality + * ******************** + */ + + _root.PathDeps = { + refresh: function(path) { + refreshPath(path); + } + }; + +}).call(this); diff --git a/www/static/test/1.9.2/src/ext/preload.js b/www/static/test/1.9.2/src/ext/preload.js new file mode 100644 index 000000000..21e966f84 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/preload.js @@ -0,0 +1,144 @@ +// This adds the "preload" extension to htmx. By default, this will +// preload the targets of any tags with `href` or `hx-get` attributes +// if they also have a `preload` attribute as well. See documentation +// for more details +htmx.defineExtension("preload", { + + onEvent: function(name, event) { + + // Only take actions on "htmx:afterProcessNode" + if (name !== "htmx:afterProcessNode") { + return; + } + + // SOME HELPER FUNCTIONS WE'LL NEED ALONG THE WAY + + // attr gets the closest non-empty value from the attribute. + var attr = function(node, property) { + if (node == undefined) {return undefined;} + return node.getAttribute(property) || node.getAttribute("data-" + property) || attr(node.parentElement, property) + } + + // load handles the actual HTTP fetch, and uses htmx.ajax in cases where we're + // preloading an htmx resource (this sends the same HTTP headers as a regular htmx request) + var load = function(node) { + + // Called after a successful AJAX request, to mark the + // content as loaded (and prevent additional AJAX calls.) + var done = function(html) { + if (!node.preloadAlways) { + node.preloadState = "DONE" + } + + if (attr(node, "preload-images") == "true") { + document.createElement("div").innerHTML = html // create and populate a node to load linked resources, too. + } + } + + return function() { + + // If this value has already been loaded, then do not try again. + if (node.preloadState !== "READY") { + return; + } + + // Special handling for HX-GET - use built-in htmx.ajax function + // so that headers match other htmx requests, then set + // node.preloadState = TRUE so that requests are not duplicated + // in the future + var hxGet = node.getAttribute("hx-get") || node.getAttribute("data-hx-get") + if (hxGet) { + htmx.ajax("GET", hxGet, {handler:function(elt, info) { + done(info.xhr.responseText); + }}); + return; + } + + // Otherwise, perform a standard xhr request, then set + // node.preloadState = TRUE so that requests are not duplicated + // in the future. + if (node.getAttribute("href")) { + var r = new XMLHttpRequest(); + r.open("GET", node.getAttribute("href")); + r.onload = function() {done(r.responseText);}; + r.send(); + return; + } + } + } + + // This function processes a specific node and sets up event handlers. + // We'll search for nodes and use it below. + var init = function(node) { + + // If this node DOES NOT include a "GET" transaction, then there's nothing to do here. + if (node.getAttribute("href") + node.getAttribute("hx-get") + node.getAttribute("data-hx-get") == "") { + return; + } + + // Guarantee that we only initialize each node once. + if (node.preloadState !== undefined) { + return; + } + + // Get event name from config. + var on = attr(node, "preload") || "mousedown" + const always = on.indexOf("always") !== -1 + if (always) { + on = on.replace('always', '').trim() + } + + // FALL THROUGH to here means we need to add an EventListener + + // Apply the listener to the node + node.addEventListener(on, function(evt) { + if (node.preloadState === "PAUSE") { // Only add one event listener + node.preloadState = "READY"; // Requred for the `load` function to trigger + + // Special handling for "mouseover" events. Wait 100ms before triggering load. + if (on === "mouseover") { + window.setTimeout(load(node), 100); + } else { + load(node)() // all other events trigger immediately. + } + } + }) + + // Special handling for certain built-in event handlers + switch (on) { + + case "mouseover": + // Mirror `touchstart` events (fires immediately) + node.addEventListener("touchstart", load(node)); + + // WHhen the mouse leaves, immediately disable the preload + node.addEventListener("mouseout", function(evt) { + if ((evt.target === node) && (node.preloadState === "READY")) { + node.preloadState = "PAUSE"; + } + }) + break; + + case "mousedown": + // Mirror `touchstart` events (fires immediately) + node.addEventListener("touchstart", load(node)); + break; + } + + // Mark the node as ready to run. + node.preloadState = "PAUSE"; + node.preloadAlways = always; + htmx.trigger(node, "preload:init") // This event can be used to load content immediately. + } + + // Search for all child nodes that have a "preload" attribute + event.target.querySelectorAll("[preload]").forEach(function(node) { + + // Initialize the node with the "preload" attribute + init(node) + + // Initialize all child elements that are anchors or have `hx-get` (use with care) + node.querySelectorAll("a,[hx-get],[data-hx-get]").forEach(init) + }) + } +}) diff --git a/www/static/test/1.9.2/src/ext/remove-me.js b/www/static/test/1.9.2/src/ext/remove-me.js new file mode 100644 index 000000000..42be99327 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/remove-me.js @@ -0,0 +1,27 @@ +(function(){ + function maybeRemoveMe(elt) { + var timing = elt.getAttribute("remove-me") || elt.getAttribute("data-remove-me"); + if (timing) { + setTimeout(function () { + elt.parentElement.removeChild(elt); + }, htmx.parseInterval(timing)); + } + } + + htmx.defineExtension('remove-me', { + onEvent: function (name, evt) { + if (name === "htmx:afterProcessNode") { + var elt = evt.detail.elt; + if (elt.getAttribute) { + maybeRemoveMe(elt); + if (elt.querySelectorAll) { + var children = elt.querySelectorAll("[remove-me], [data-remove-me]"); + for (var i = 0; i < children.length; i++) { + maybeRemoveMe(children[i]); + } + } + } + } + } + }); +})(); diff --git a/www/static/test/1.9.2/src/ext/restored.js b/www/static/test/1.9.2/src/ext/restored.js new file mode 100644 index 000000000..6f65267ce --- /dev/null +++ b/www/static/test/1.9.2/src/ext/restored.js @@ -0,0 +1,15 @@ +htmx.defineExtension('restored', { + onEvent : function(name, evt) { + if (name === 'htmx:restored'){ + var restoredElts = evt.detail.document.querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']" + ); + // need a better way to do this, would prefer to just trigger from evt.detail.elt + var foundElt = Array.from(restoredElts).find( + (x) => (x.outerHTML === evt.detail.elt.outerHTML) + ); + var restoredEvent = evt.detail.triggerEvent(foundElt, 'restored'); + } + return; + } +}) \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/sse.js b/www/static/test/1.9.2/src/ext/sse.js new file mode 100644 index 000000000..4088cd29a --- /dev/null +++ b/www/static/test/1.9.2/src/ext/sse.js @@ -0,0 +1,322 @@ +/* +Server Sent Events Extension +============================ +This extension adds support for Server Sent Events to htmx. See /www/extensions/sse.md for usage instructions. + +*/ + +(function(){ + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("sse", { + + /** + * Init saves the provided reference to the internal HTMX API. + * + * @param {import("../htmx").HtmxInternalApi} api + * @returns void + */ + init: function(apiRef) { + // store a reference to the internal API. + api = apiRef; + + // set a function in the public API for creating new EventSource objects + if (htmx.createEventSource == undefined) { + htmx.createEventSource = createEventSource; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + * @returns void + */ + onEvent: function(name, evt) { + + switch (name) { + + // Try to remove remove an EventSource when elements are removed + case "htmx:beforeCleanupElement": + var internalData = api.getInternalData(evt.target) + if (internalData.sseEventSource) { + internalData.sseEventSource.close(); + } + return; + + // Try to create EventSources when elements are processed + case "htmx:afterProcessNode": + createEventSourceOnElement(evt.target); + } + } + }); + + /////////////////////////////////////////////// + // HELPER FUNCTIONS + /////////////////////////////////////////////// + + + /** + * createEventSource is the default method for creating new EventSource objects. + * it is hoisted into htmx.config.createEventSource to be overridden by the user, if needed. + * + * @param {string} url + * @returns EventSource + */ + function createEventSource(url) { + return new EventSource(url, {withCredentials:true}); + } + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacySSEURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + function getLegacySSESwaps(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); + var returnArr = []; + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "swap") { + returnArr.push(value[1]); + } + } + } + return returnArr; + } + + /** + * createEventSourceOnElement creates a new EventSource connection on the provided element. + * If a usable EventSource already exists, then it is returned. If not, then a new EventSource + * is created and stored in the element's internalData. + * @param {HTMLElement} elt + * @param {number} retryCount + * @returns {EventSource | null} + */ + function createEventSourceOnElement(elt, retryCount) { + + if (elt == null) { + return null; + } + + var internalData = api.getInternalData(elt); + + // get URL from element's attribute + var sseURL = api.getAttributeValue(elt, "sse-connect"); + + + if (sseURL == undefined) { + var legacyURL = getLegacySSEURL(elt) + if (legacyURL) { + sseURL = legacyURL; + } else { + return null; + } + } + + // Connect to the EventSource + var source = htmx.createEventSource(sseURL); + internalData.sseEventSource = source; + + // Create event handlers + source.onerror = function (err) { + + // Log an error event + api.triggerErrorEvent(elt, "htmx:sseError", {error:err, source:source}); + + // If parent no longer exists in the document, then clean up this EventSource + if (maybeCloseSSESource(elt)) { + return; + } + + // Otherwise, try to reconnect the EventSource + if (source.readyState === EventSource.CLOSED) { + retryCount = retryCount || 0; + var timeout = Math.random() * (2 ^ retryCount) * 500; + window.setTimeout(function() { + createEventSourceOnElement(elt, Math.min(7, retryCount+1)); + }, timeout); + } + }; + + source.onopen = function (evt) { + api.triggerEvent(elt, "htmx::sseOpen", {source: source}); + } + + // Add message handlers for every `sse-swap` attribute + queryAttributeOnThisOrChildren(elt, "sse-swap").forEach(function(child) { + + var sseSwapAttr = api.getAttributeValue(child, "sse-swap"); + if (sseSwapAttr) { + var sseEventNames = sseSwapAttr.split(","); + } else { + var sseEventNames = getLegacySSESwaps(child); + } + + for (var i = 0 ; i < sseEventNames.length ; i++) { + var sseEventName = sseEventNames[i].trim(); + var listener = function(event) { + + // If the parent is missing then close SSE and remove listener + if (maybeCloseSSESource(elt)) { + source.removeEventListener(sseEventName, listener); + return; + } + + // swap the response into the DOM and trigger a notification + swap(child, event.data); + api.triggerEvent(elt, "htmx:sseMessage", event); + }; + + // Register the new listener + api.getInternalData(elt).sseEventListener = listener; + source.addEventListener(sseEventName, listener); + } + }); + + // Add message handlers for every `hx-trigger="sse:*"` attribute + queryAttributeOnThisOrChildren(elt, "hx-trigger").forEach(function(child) { + + var sseEventName = api.getAttributeValue(child, "hx-trigger"); + if (sseEventName == null) { + return; + } + + // Only process hx-triggers for events with the "sse:" prefix + if (sseEventName.slice(0, 4) != "sse:") { + return; + } + + var listener = function(event) { + + // If parent is missing, then close SSE and remove listener + if (maybeCloseSSESource(elt)) { + source.removeEventListener(sseEventName, listener); + return; + } + + // Trigger events to be handled by the rest of htmx + htmx.trigger(child, sseEventName, event); + htmx.trigger(child, "htmx:sseMessage", event); + } + + // Register the new listener + api.getInternalData(elt).sseEventListener = listener; + source.addEventListener(sseEventName.slice(4), listener); + }); + } + + /** + * maybeCloseSSESource confirms that the parent element still exists. + * If not, then any associated SSE source is closed and the function returns true. + * + * @param {HTMLElement} elt + * @returns boolean + */ + function maybeCloseSSESource(elt) { + if (!api.bodyContains(elt)) { + var source = api.getInternalData(elt).sseEventSource; + if (source != undefined) { + source.close(); + // source = null + return true; + } + } + return false; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = []; + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-sse")) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [hx-sse], [data-hx-sse]").forEach(function(node) { + result.push(node); + }); + + return result; + } + + /** + * @param {HTMLElement} elt + * @param {string} content + */ + function swap(elt, content) { + + api.withExtensions(elt, function(extension) { + content = extension.transformResponse(content, null, elt); + }); + + var swapSpec = api.getSwapSpecification(elt); + var target = api.getTarget(elt); + var settleInfo = api.makeSettleInfo(elt); + + api.selectAndSwap(swapSpec.swapStyle, target, elt, content, settleInfo); + + settleInfo.elts.forEach(function (elt) { + if (elt.classList) { + elt.classList.add(htmx.config.settlingClass); + } + api.triggerEvent(elt, 'htmx:beforeSettle'); + }); + + // Handle settle tasks (with delay if requested) + if (swapSpec.settleDelay > 0) { + setTimeout(doSettle(settleInfo), swapSpec.settleDelay); + } else { + doSettle(settleInfo)(); + } + } + + /** + * doSettle mirrors much of the functionality in htmx that + * settles elements after their content has been swapped. + * TODO: this should be published by htmx, and not duplicated here + * @param {import("../htmx").HtmxSettleInfo} settleInfo + * @returns () => void + */ + function doSettle(settleInfo) { + + return function() { + settleInfo.tasks.forEach(function (task) { + task.call(); + }); + + settleInfo.elts.forEach(function (elt) { + if (elt.classList) { + elt.classList.remove(htmx.config.settlingClass); + } + api.triggerEvent(elt, 'htmx:afterSettle'); + }); + } + } + +})(); \ No newline at end of file diff --git a/www/static/test/1.9.2/src/ext/ws.js b/www/static/test/1.9.2/src/ext/ws.js new file mode 100644 index 000000000..ddccc1dc2 --- /dev/null +++ b/www/static/test/1.9.2/src/ext/ws.js @@ -0,0 +1,477 @@ +/* +WebSockets Extension +============================ +This extension adds support for WebSockets to htmx. See /www/extensions/ws.md for usage instructions. +*/ + +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("ws", { + + /** + * init is called once, when this extension is first registered. + * @param {import("../htmx").HtmxInternalApi} apiRef + */ + init: function (apiRef) { + + // Store reference to internal API + api = apiRef; + + // Default function for creating new EventSource objects + if (!htmx.createWebSocket) { + htmx.createWebSocket = createWebSocket; + } + + // Default setting for reconnect delay + if (!htmx.config.wsReconnectDelay) { + htmx.config.wsReconnectDelay = "full-jitter"; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + */ + onEvent: function (name, evt) { + + switch (name) { + + // Try to close the socket when elements are removed + case "htmx:beforeCleanupElement": + + var internalData = api.getInternalData(evt.target) + + if (internalData.webSocket) { + internalData.webSocket.close(); + } + return; + + // Try to create websockets when elements are processed + case "htmx:afterProcessNode": + var parent = evt.target; + + forEach(queryAttributeOnThisOrChildren(parent, "ws-connect"), function (child) { + ensureWebSocket(child) + }); + forEach(queryAttributeOnThisOrChildren(parent, "ws-send"), function (child) { + ensureWebSocketSend(child) + }); + } + } + }); + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacyWebsocketURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-ws"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + /** + * ensureWebSocket creates a new WebSocket on the designated element, using + * the element's "ws-connect" attribute. + * @param {HTMLElement} socketElt + * @returns + */ + function ensureWebSocket(socketElt) { + + // If the element containing the WebSocket connection no longer exists, then + // do not connect/reconnect the WebSocket. + if (!api.bodyContains(socketElt)) { + return; + } + + // Get the source straight from the element's value + var wssSource = api.getAttributeValue(socketElt, "ws-connect") + + if (wssSource == null || wssSource === "") { + var legacySource = getLegacyWebsocketURL(socketElt); + if (legacySource == null) { + return; + } else { + wssSource = legacySource; + } + } + + // Guarantee that the wssSource value is a fully qualified URL + if (wssSource.indexOf("/") === 0) { + var base_part = location.hostname + (location.port ? ':' + location.port : ''); + if (location.protocol === 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol === 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + + var socketWrapper = createWebsocketWrapper(socketElt, function () { + return htmx.createWebSocket(wssSource) + }); + + socketWrapper.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + var response = event.data; + if (!api.triggerEvent(socketElt, "htmx:wsBeforeMessage", { + message: response, + socketWrapper: socketWrapper.publicInterface + })) { + return; + } + + api.withExtensions(socketElt, function (extension) { + response = extension.transformResponse(response, null, socketElt); + }); + + var settleInfo = api.makeSettleInfo(socketElt); + var fragment = api.makeFragment(response); + + if (fragment.children.length) { + var children = Array.from(fragment.children); + for (var i = 0; i < children.length; i++) { + api.oobSwap(api.getAttributeValue(children[i], "hx-swap-oob") || "true", children[i], settleInfo); + } + } + + api.settleImmediately(settleInfo.tasks); + api.triggerEvent(socketElt, "htmx:wsAfterMessage", { message: response, socketWrapper: socketWrapper.publicInterface }) + }); + + // Put the WebSocket into the HTML Element's custom data. + api.getInternalData(socketElt).webSocket = socketWrapper; + } + + /** + * @typedef {Object} WebSocketWrapper + * @property {WebSocket} socket + * @property {Array<{message: string, sendElt: Element}>} messageQueue + * @property {number} retryCount + * @property {(message: string, sendElt: Element) => void} sendImmediately sendImmediately sends message regardless of websocket connection state + * @property {(message: string, sendElt: Element) => void} send + * @property {(event: string, handler: Function) => void} addEventListener + * @property {() => void} handleQueuedMessages + * @property {() => void} init + * @property {() => void} close + */ + /** + * + * @param socketElt + * @param socketFunc + * @returns {WebSocketWrapper} + */ + function createWebsocketWrapper(socketElt, socketFunc) { + var wrapper = { + socket: null, + messageQueue: [], + retryCount: 0, + + /** @type {Object} */ + events: {}, + + addEventListener: function (event, handler) { + if (this.socket) { + this.socket.addEventListener(event, handler); + } + + if (!this.events[event]) { + this.events[event] = []; + } + + this.events[event].push(handler); + }, + + sendImmediately: function (message, sendElt) { + if (!this.socket) { + api.triggerErrorEvent() + } + if (sendElt && api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { + message: message, + socketWrapper: this.publicInterface + })) { + this.socket.send(message); + sendElt && api.triggerEvent(sendElt, 'htmx:wsAfterSend', { + message: message, + socketWrapper: this.publicInterface + }) + } + }, + + send: function (message, sendElt) { + if (this.socket.readyState !== this.socket.OPEN) { + this.messageQueue.push({ message: message, sendElt: sendElt }); + } else { + this.sendImmediately(message, sendElt); + } + }, + + handleQueuedMessages: function () { + while (this.messageQueue.length > 0) { + var queuedItem = this.messageQueue[0] + if (this.socket.readyState === this.socket.OPEN) { + this.sendImmediately(queuedItem.message, queuedItem.sendElt); + this.messageQueue.shift(); + } else { + break; + } + } + }, + + init: function () { + if (this.socket && this.socket.readyState === this.socket.OPEN) { + // Close discarded socket + this.socket.close() + } + + // Create a new WebSocket and event handlers + /** @type {WebSocket} */ + var socket = socketFunc(); + + // The event.type detail is added for interface conformance with the + // other two lifecycle events (open and close) so a single handler method + // can handle them polymorphically, if required. + api.triggerEvent(socketElt, "htmx:wsConnecting", { event: { type: 'connecting' } }); + + this.socket = socket; + + socket.onopen = function (e) { + wrapper.retryCount = 0; + api.triggerEvent(socketElt, "htmx:wsOpen", { event: e, socketWrapper: wrapper.publicInterface }); + wrapper.handleQueuedMessages(); + } + + socket.onclose = function (e) { + // If socket should not be connected, stop further attempts to establish connection + // If Abnormal Closure/Service Restart/Try Again Later, then set a timer to reconnect after a pause. + if (!maybeCloseWebSocketSource(socketElt) && [1006, 1012, 1013].indexOf(e.code) >= 0) { + var delay = getWebSocketReconnectDelay(wrapper.retryCount); + setTimeout(function () { + wrapper.retryCount += 1; + wrapper.init(); + }, delay); + } + + // Notify client code that connection has been closed. Client code can inspect `event` field + // to determine whether closure has been valid or abnormal + api.triggerEvent(socketElt, "htmx:wsClose", { event: e, socketWrapper: wrapper.publicInterface }) + }; + + socket.onerror = function (e) { + api.triggerErrorEvent(socketElt, "htmx:wsError", { error: e, socketWrapper: wrapper }); + maybeCloseWebSocketSource(socketElt); + }; + + var events = this.events; + Object.keys(events).forEach(function (k) { + events[k].forEach(function (e) { + socket.addEventListener(k, e); + }) + }); + }, + + close: function () { + this.socket.close() + } + } + + wrapper.init(); + + wrapper.publicInterface = { + send: wrapper.send.bind(wrapper), + sendImmediately: wrapper.sendImmediately.bind(wrapper), + queue: wrapper.messageQueue + }; + + return wrapper; + } + + /** + * ensureWebSocketSend attaches trigger handles to elements with + * "ws-send" attribute + * @param {HTMLElement} elt + */ + function ensureWebSocketSend(elt) { + var legacyAttribute = api.getAttributeValue(elt, "hx-ws"); + if (legacyAttribute && legacyAttribute !== 'send') { + return; + } + + var webSocketParent = api.getClosestMatch(elt, hasWebSocket) + processWebSocketSend(webSocketParent, elt); + } + + /** + * hasWebSocket function checks if a node has webSocket instance attached + * @param {HTMLElement} node + * @returns {boolean} + */ + function hasWebSocket(node) { + return api.getInternalData(node).webSocket != null; + } + + /** + * processWebSocketSend adds event listeners to the
    element so that + * messages can be sent to the WebSocket server when the form is submitted. + * @param {HTMLElement} socketElt + * @param {HTMLElement} sendElt + */ + function processWebSocketSend(socketElt, sendElt) { + var nodeData = api.getInternalData(sendElt); + var triggerSpecs = api.getTriggerSpecs(sendElt); + triggerSpecs.forEach(function (ts) { + api.addTriggerHandler(sendElt, ts, nodeData, function (elt, evt) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + /** @type {WebSocketWrapper} */ + var socketWrapper = api.getInternalData(socketElt).webSocket; + var headers = api.getHeaders(sendElt, socketElt); + var results = api.getInputValues(sendElt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = api.getExpressionVars(sendElt); + var allParameters = api.mergeObjects(rawParameters, expressionVars); + var filteredParameters = api.filterValues(allParameters, sendElt); + + var sendConfig = { + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers: headers, + errors: errors, + + triggeringEvent: evt, + messageBody: undefined, + socketWrapper: socketWrapper.publicInterface + }; + + if (!api.triggerEvent(elt, 'htmx:wsConfigSend', sendConfig)) { + return; + } + + if (errors && errors.length > 0) { + api.triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + + var body = sendConfig.messageBody; + if (body === undefined) { + var toSend = Object.assign({}, sendConfig.parameters); + if (sendConfig.headers) + toSend['HEADERS'] = headers; + body = JSON.stringify(toSend); + } + + socketWrapper.send(body, elt); + + if (api.shouldCancel(evt, elt)) { + evt.preventDefault(); + } + }); + }); + } + + /** + * getWebSocketReconnectDelay is the default easing function for WebSocket reconnects. + * @param {number} retryCount // The number of retries that have already taken place + * @returns {number} + */ + function getWebSocketReconnectDelay(retryCount) { + + /** @type {"full-jitter" | ((retryCount:number) => number)} */ + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + /** + * maybeCloseWebSocketSource checks to the if the element that created the WebSocket + * still exists in the DOM. If NOT, then the WebSocket is closed and this function + * returns TRUE. If the element DOES EXIST, then no action is taken, and this function + * returns FALSE. + * + * @param {*} elt + * @returns + */ + function maybeCloseWebSocketSource(elt) { + if (!api.bodyContains(elt)) { + api.getInternalData(elt).webSocket.close(); + return true; + } + return false; + } + + /** + * createWebSocket is the default method for creating new WebSocket objects. + * it is hoisted into htmx.createWebSocket to be overridden by the user, if needed. + * + * @param {string} url + * @returns WebSocket + */ + function createWebSocket(url) { + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = [] + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-ws")) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [data-hx-ws], [hx-ws]").forEach(function (node) { + result.push(node) + }) + + return result + } + + /** + * @template T + * @param {T[]} arr + * @param {(T) => void} func + */ + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + +})(); + diff --git a/www/static/test/1.9.2/src/htmx.d.ts b/www/static/test/1.9.2/src/htmx.d.ts new file mode 100644 index 000000000..1090aa811 --- /dev/null +++ b/www/static/test/1.9.2/src/htmx.d.ts @@ -0,0 +1,339 @@ +// https://htmx.org/reference/#api + +/** + * This method adds a class to the given element. + * + * https://htmx.org/api/#addClass + * + * @param elt the element to add the class to + * @param clazz the class to add + * @param delay the delay (in milliseconds before class is added) + */ +export function addClass(elt: Element, clazz: string, delay?: number): void; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param element the element to target (defaults to the **body**) + */ +export function ajax(verb: string, path: string, element: Element): void; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param selector a selector for the target + */ +export function ajax(verb: string, path: string, selector: string): void; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param context a context object that contains any of the following + */ +export function ajax( + verb: string, + path: string, + context: Partial<{ source: any; event: any; handler: any; target: any; values: any; headers: any }> +): void; + +/** + * Finds the closest matching element in the given elements parentage, inclusive of the element + * + * https://htmx.org/api/#closest + * + * @param elt the element to find the selector from + * @param selector the selector to find + */ +export function closest(elt: Element, selector: string): Element | null; + +/** + * A property holding the configuration htmx uses at runtime. + * + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. + * + * https://htmx.org/api/#config + */ +export var config: HtmxConfig; + +/** + * A property used to create new [Server Sent Event](https://htmx.org/docs/#sse) sources. This can be updated to provide custom SSE setup. + * + * https://htmx.org/api/#createEventSource + */ +export var createEventSource: (url: string) => EventSource; + +/** + * A property used to create new [WebSocket](https://htmx.org/docs/#websockets). This can be updated to provide custom WebSocket setup. + * + * https://htmx.org/api/#createWebSocket + */ +export var createWebSocket: (url: string) => WebSocket; + +/** + * Defines a new htmx [extension](https://htmx.org/extensions). + * + * https://htmx.org/api/#defineExtension + * + * @param name the extension name + * @param ext the extension definition + */ +export function defineExtension(name: string, ext: HtmxExtension): void; + +/** + * Finds an element matching the selector + * + * https://htmx.org/api/#find + * + * @param selector the selector to match + */ +export function find(selector: string): Element | null; + +/** + * Finds an element matching the selector + * + * https://htmx.org/api/#find + * + * @param elt the root element to find the matching element in, inclusive + * @param selector the selector to match + */ +export function find(elt: Element, selector: string): Element | null; + +/** + * Finds all elements matching the selector + * + * https://htmx.org/api/#findAll + * + * @param selector the selector to match + */ +export function findAll(selector: string): NodeListOf; + +/** + * Finds all elements matching the selector + * + * https://htmx.org/api/#findAll + * + * @param elt the root element to find the matching elements in, inclusive + * @param selector the selector to match + */ +export function findAll(elt: Element, selector: string): NodeListOf; + +/** + * Log all htmx events, useful for debugging. + * + * https://htmx.org/api/#logAll + */ +export function logAll(): void; + +/** + * The logger htmx uses to log with + * + * https://htmx.org/api/#logger + */ +export var logger: (elt: Element, eventName: string, detail: any) => void | null; + +/** + * Removes an event listener from an element + * + * https://htmx.org/api/#off + * + * @param eventName the event name to remove the listener from + * @param listener the listener to remove + */ +export function off(eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Removes an event listener from an element + * + * https://htmx.org/api/#off + * + * @param target the element to remove the listener from + * @param eventName the event name to remove the listener from + * @param listener the listener to remove + */ +export function off(target: string, eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds an event listener to an element + * + * https://htmx.org/api/#on + * + * @param eventName the event name to add the listener for + * @param listener the listener to add + */ +export function on(eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds an event listener to an element + * + * https://htmx.org/api/#on + * + * @param target the element to add the listener to + * @param eventName the event name to add the listener for + * @param listener the listener to add + */ +export function on(target: string, eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds a callback for the **htmx:load** event. This can be used to process new content, for example initializing the content with a javascript library + * + * https://htmx.org/api/#onLoad + * + * @param callback the callback to call on newly loaded content + */ +export function onLoad(callback: (element: Element) => void): void; + +/** + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. + * + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** + * + * https://htmx.org/api/#parseInterval + * + * @param str timing string + */ +export function parseInterval(str: string): number; + +/** + * Processes new content, enabling htmx behavior. This can be useful if you have content that is added to the DOM outside of the normal htmx request cycle but still want htmx attributes to work. + * + * https://htmx.org/api/#process + * + * @param element element to process + */ +export function process(element: Element): void; + +/** + * Removes an element from the DOM + * + * https://htmx.org/api/#remove + * + * @param elt element to remove + * @param delay the delay (in milliseconds before element is removed) + */ +export function remove(elt: Element, delay?: number): void; + +/** + * Removes a class from the given element + * + * https://htmx.org/api/#removeClass + * + * @param elt element to remove the class from + * @param clazz the class to remove + * @param delay the delay (in milliseconds before class is removed) + */ +export function removeClass(elt: Element, clazz: string, delay?: number): void; + +/** + * Removes the given extension from htmx + * + * https://htmx.org/api/#removeExtension + * + * @param name the name of the extension to remove + */ +export function removeExtension(name: string): void; + +/** + * Takes the given class from its siblings, so that among its siblings, only the given element will have the class. + * + * https://htmx.org/api/#takeClass + * + * @param elt the element that will take the class + * @param clazz the class to take + */ +export function takeClass(elt: Element, clazz: string): void; + +/** + * Toggles the given class on an element + * + * https://htmx.org/api/#toggleClass + * + * @param elt the element to toggle the class on + * @param clazz the class to toggle + */ +export function toggleClass(elt: Element, clazz: string): void; + +/** + * Triggers a given event on an element + * + * https://htmx.org/api/#trigger + * + * @param elt the element to trigger the event on + * @param name the name of the event to trigger + * @param detail details for the event + */ +export function trigger(elt: Element, name: string, detail: any): void; + +/** + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism + * + * https://htmx.org/api/#values + * + * @param elt the element to resolve values on + * @param requestType the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** + */ +export function values(elt: Element, requestType?: string): any; + +export const version: string; + +export interface HtmxConfig { + /** array of strings: the attributes to settle during the settling phase */ + attributesToSettle?: ["class", "style", "width", "height"] | string[]; + /** the default delay between completing the content swap and settling attributes */ + defaultSettleDelay?: number; + /** the default delay between receiving a response from the server and doing the swap */ + defaultSwapDelay?: number; + /** the default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted */ + defaultSwapStyle?: "innerHTML" | string; + /** the number of pages to keep in **localStorage** for history support */ + historyCacheSize?: number; + /** whether or not to use history */ + historyEnabled?: boolean; + /** if true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present */ + includeIndicatorStyles?: boolean; + /** the class to place on indicators when a request is in flight */ + indicatorClass?: "htmx-indicator" | string; + /** the class to place on triggering elements when a request is in flight */ + requestClass?: "htmx-request" | string; + /** the class to temporarily place on elements that htmx has added to the DOM */ + addedClass?: "htmx-added" | string; + /** the class to place on target elements when htmx is in the settling phase */ + settlingClass?: "htmx-settling" | string; + /** the class to place on target elements when htmx is in the swapping phase */ + swappingClass?: "htmx-swapping" | string; + /** allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility */ + allowEval?: boolean; + /** use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible. */ + useTemplateFragments?: boolean; + /** allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates */ + withCredentials?: boolean; + /** the default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later** */ + wsReconnectDelay?: "full-jitter" | string | ((retryCount: number) => number); + // following don't appear in the docs + refreshOnHistoryMiss?: boolean; + timeout?: number; + disableSelector?: "[hx-disable], [data-hx-disable]" | string; + scrollBehavior?: "smooth"; +} + +/** + * https://htmx.org/extensions/#defining + */ +export interface HtmxExtension { + onEvent?: (name: string, evt: CustomEvent) => any; + transformResponse?: (text: any, xhr: XMLHttpRequest, elt: any) => any; + isInlineSwap?: (swapStyle: any) => any; + handleSwap?: (swapStyle: any, target: any, fragment: any, settleInfo: any) => any; + encodeParameters?: (xhr: XMLHttpRequest, parameters: any, elt: any) => any; +} diff --git a/www/static/test/1.9.2/src/htmx.js b/www/static/test/1.9.2/src/htmx.js new file mode 100644 index 000000000..c7ea3f451 --- /dev/null +++ b/www/static/test/1.9.2/src/htmx.js @@ -0,0 +1,3566 @@ +// UMD insanity +// This code sets up support for (in order) AMD, ES6 modules, and globals. +(function (root, factory) { + //@ts-ignore + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + //@ts-ignore + define([], factory); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals + root.htmx = root.htmx || factory(); + } +}(typeof self !== 'undefined' ? self : this, function () { +return (function () { + 'use strict'; + + // Public API + //** @type {import("./htmx").HtmxApi} */ + // TODO: list all methods in public API + var htmx = { + onLoad: onLoadHelper, + process: processNode, + on: addEventListenerImpl, + off: removeEventListenerImpl, + trigger : triggerEvent, + ajax : ajaxHelper, + find : find, + findAll : findAll, + closest : closest, + values : function(elt, type){ + var inputValues = getInputValues(elt, type || "post"); + return inputValues.values; + }, + remove : removeElement, + addClass : addClassToElement, + removeClass : removeClassFromElement, + toggleClass : toggleClassOnElement, + takeClass : takeClassForElement, + defineExtension : defineExtension, + removeExtension : removeExtension, + logAll : logAll, + logger : null, + config : { + historyEnabled:true, + historyCacheSize:10, + refreshOnHistoryMiss:false, + defaultSwapStyle:'innerHTML', + defaultSwapDelay:0, + defaultSettleDelay:20, + includeIndicatorStyles:true, + indicatorClass:'htmx-indicator', + requestClass:'htmx-request', + addedClass:'htmx-added', + settlingClass:'htmx-settling', + swappingClass:'htmx-swapping', + allowEval:true, + inlineScriptNonce:'', + attributesToSettle:["class", "style", "width", "height"], + withCredentials:false, + timeout:0, + wsReconnectDelay: 'full-jitter', + wsBinaryType: 'blob', + disableSelector: "[hx-disable], [data-hx-disable]", + useTemplateFragments: false, + scrollBehavior: 'smooth', + defaultFocusScroll: false, + getCacheBusterParam: false, + globalViewTransitions: false, + }, + parseInterval:parseInterval, + _:internalEval, + createEventSource: function(url){ + return new EventSource(url, {withCredentials:true}) + }, + createWebSocket: function(url){ + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + }, + version: "1.9.2" + }; + + /** @type {import("./htmx").HtmxInternalApi} */ + var internalAPI = { + addTriggerHandler: addTriggerHandler, + bodyContains: bodyContains, + canAccessLocalStorage: canAccessLocalStorage, + filterValues: filterValues, + hasAttribute: hasAttribute, + getAttributeValue: getAttributeValue, + getClosestMatch: getClosestMatch, + getExpressionVars: getExpressionVars, + getHeaders: getHeaders, + getInputValues: getInputValues, + getInternalData: getInternalData, + getSwapSpecification: getSwapSpecification, + getTriggerSpecs: getTriggerSpecs, + getTarget: getTarget, + makeFragment: makeFragment, + mergeObjects: mergeObjects, + makeSettleInfo: makeSettleInfo, + oobSwap: oobSwap, + selectAndSwap: selectAndSwap, + settleImmediately: settleImmediately, + shouldCancel: shouldCancel, + triggerEvent: triggerEvent, + triggerErrorEvent: triggerErrorEvent, + withExtensions: withExtensions, + } + + var VERBS = ['get', 'post', 'put', 'delete', 'patch']; + var VERB_SELECTOR = VERBS.map(function(verb){ + return "[hx-" + verb + "], [data-hx-" + verb + "]" + }).join(", "); + + //==================================================================== + // Utilities + //==================================================================== + + function parseInterval(str) { + if (str == undefined) { + return undefined + } + if (str.slice(-2) == "ms") { + return parseFloat(str.slice(0,-2)) || undefined + } + if (str.slice(-1) == "s") { + return (parseFloat(str.slice(0,-1)) * 1000) || undefined + } + if (str.slice(-1) == "m") { + return (parseFloat(str.slice(0,-1)) * 1000 * 60) || undefined + } + return parseFloat(str) || undefined + } + + /** + * @param {HTMLElement} elt + * @param {string} name + * @returns {(string | null)} + */ + function getRawAttribute(elt, name) { + return elt.getAttribute && elt.getAttribute(name); + } + + // resolve with both hx and data-hx prefixes + function hasAttribute(elt, qualifiedName) { + return elt.hasAttribute && (elt.hasAttribute(qualifiedName) || + elt.hasAttribute("data-" + qualifiedName)); + } + + /** + * + * @param {HTMLElement} elt + * @param {string} qualifiedName + * @returns {(string | null)} + */ + function getAttributeValue(elt, qualifiedName) { + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, "data-" + qualifiedName); + } + + /** + * @param {HTMLElement} elt + * @returns {HTMLElement | null} + */ + function parentElt(elt) { + return elt.parentElement; + } + + /** + * @returns {Document} + */ + function getDocument() { + return document; + } + + /** + * @param {HTMLElement} elt + * @param {(e:HTMLElement) => boolean} condition + * @returns {HTMLElement | null} + */ + function getClosestMatch(elt, condition) { + while (elt && !condition(elt)) { + elt = parentElt(elt); + } + + return elt ? elt : null; + } + + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName){ + var attributeValue = getAttributeValue(ancestor, attributeName); + var disinherit = getAttributeValue(ancestor, "hx-disinherit"); + if (initialElement !== ancestor && disinherit && (disinherit === "*" || disinherit.split(" ").indexOf(attributeName) >= 0)) { + return "unset"; + } else { + return attributeValue + } + } + + /** + * @param {HTMLElement} elt + * @param {string} attributeName + * @returns {string | null} + */ + function getClosestAttributeValue(elt, attributeName) { + var closestAttr = null; + getClosestMatch(elt, function (e) { + return closestAttr = getAttributeValueWithDisinheritance(elt, e, attributeName); + }); + if (closestAttr !== "unset") { + return closestAttr; + } + } + + /** + * @param {HTMLElement} elt + * @param {string} selector + * @returns {boolean} + */ + function matches(elt, selector) { + // @ts-ignore: non-standard properties for browser compatability + // noinspection JSUnresolvedVariable + var matchesFunction = elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector; + return matchesFunction && matchesFunction.call(elt, selector); + } + + /** + * @param {string} str + * @returns {string} + */ + function getStartTag(str) { + var tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i + var match = tagMatcher.exec( str ); + if (match) { + return match[1].toLowerCase(); + } else { + return ""; + } + } + + /** + * + * @param {string} resp + * @param {number} depth + * @returns {Element} + */ + function parseHTML(resp, depth) { + var parser = new DOMParser(); + var responseDoc = parser.parseFromString(resp, "text/html"); + + /** @type {Element} */ + var responseNode = responseDoc.body; + while (depth > 0) { + depth--; + // @ts-ignore + responseNode = responseNode.firstChild; + } + if (responseNode == null) { + // @ts-ignore + responseNode = getDocument().createDocumentFragment(); + } + return responseNode; + } + + function aFullPageResponse(resp) { + return resp.match(/", 0); + // @ts-ignore type mismatch between DocumentFragment and Element. + // TODO: Are these close enough for htmx to use interchangably? + return documentFragment.querySelector('template').content; + } else { + var startTag = getStartTag(resp); + switch (startTag) { + case "thead": + case "tbody": + case "tfoot": + case "colgroup": + case "caption": + return parseHTML("" + resp + "
    ", 1); + case "col": + return parseHTML("" + resp + "
    ", 2); + case "tr": + return parseHTML("" + resp + "
    ", 2); + case "td": + case "th": + return parseHTML("" + resp + "
    ", 3); + case "script": + return parseHTML("
    " + resp + "
    ", 1); + default: + return parseHTML(resp, 0); + } + } + } + + /** + * @param {Function} func + */ + function maybeCall(func){ + if(func) { + func(); + } + } + + /** + * @param {any} o + * @param {string} type + * @returns + */ + function isType(o, type) { + return Object.prototype.toString.call(o) === "[object " + type + "]"; + } + + /** + * @param {*} o + * @returns {o is Function} + */ + function isFunction(o) { + return isType(o, "Function"); + } + + /** + * @param {*} o + * @returns {o is Object} + */ + function isRawObject(o) { + return isType(o, "Object"); + } + + /** + * getInternalData retrieves "private" data stored by htmx within an element + * @param {HTMLElement} elt + * @returns {*} + */ + function getInternalData(elt) { + var dataProp = 'htmx-internal-data'; + var data = elt[dataProp]; + if (!data) { + data = elt[dataProp] = {}; + } + return data; + } + + /** + * toArray converts an ArrayLike object into a real array. + * @param {ArrayLike} arr + * @returns {any[]} + */ + function toArray(arr) { + var returnArr = []; + if (arr) { + for (var i = 0; i < arr.length; i++) { + returnArr.push(arr[i]); + } + } + return returnArr + } + + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + + function isScrolledIntoView(el) { + var rect = el.getBoundingClientRect(); + var elemTop = rect.top; + var elemBottom = rect.bottom; + return elemTop < window.innerHeight && elemBottom >= 0; + } + + function bodyContains(elt) { + // IE Fix + if (elt.getRootNode && elt.getRootNode() instanceof ShadowRoot) { + return getDocument().body.contains(elt.getRootNode().host); + } else { + return getDocument().body.contains(elt); + } + } + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + /** + * mergeObjects takes all of the keys from + * obj2 and duplicates them into obj1 + * @param {Object} obj1 + * @param {Object} obj2 + * @returns {Object} + */ + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + function parseJSON(jString) { + try { + return JSON.parse(jString); + } catch(error) { + logError(error); + return null; + } + } + + function canAccessLocalStorage() { + var test = 'htmx:localStorageTest'; + try { + localStorage.setItem(test, test); + localStorage.removeItem(test); + return true; + } catch(e) { + return false; + } + } + + function normalizePath(path) { + try { + var url = new URL(path); + if (url) { + path = url.pathname + url.search; + } + // remove trailing slash, unless index page + if (!path.match('^/$')) { + path = path.replace(/\/+$/, ''); + } + return path; + } catch (e) { + // be kind to IE11, which doesn't support URL() + return path; + } + } + + //========================================================================================== + // public API + //========================================================================================== + + function internalEval(str){ + return maybeEval(getDocument().body, function () { + return eval(str); + }); + } + + function onLoadHelper(callback) { + var value = htmx.on("htmx:load", function(evt) { + callback(evt.detail.elt); + }); + return value; + } + + function logAll(){ + htmx.logger = function(elt, event, data) { + if(console) { + console.log(event, elt, data); + } + } + } + + function find(eltOrSelector, selector) { + if (selector) { + return eltOrSelector.querySelector(selector); + } else { + return find(getDocument(), eltOrSelector); + } + } + + function findAll(eltOrSelector, selector) { + if (selector) { + return eltOrSelector.querySelectorAll(selector); + } else { + return findAll(getDocument(), eltOrSelector); + } + } + + function removeElement(elt, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + removeElement(elt); + elt = null; + }, delay); + } else { + elt.parentElement.removeChild(elt); + } + } + + function addClassToElement(elt, clazz, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + addClassToElement(elt, clazz); + elt = null; + }, delay); + } else { + elt.classList && elt.classList.add(clazz); + } + } + + function removeClassFromElement(elt, clazz, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + removeClassFromElement(elt, clazz); + elt = null; + }, delay); + } else { + if (elt.classList) { + elt.classList.remove(clazz); + // if there are no classes left, remove the class attribute + if (elt.classList.length === 0) { + elt.removeAttribute("class"); + } + } + } + } + + function toggleClassOnElement(elt, clazz) { + elt = resolveTarget(elt); + elt.classList.toggle(clazz); + } + + function takeClassForElement(elt, clazz) { + elt = resolveTarget(elt); + forEach(elt.parentElement.children, function(child){ + removeClassFromElement(child, clazz); + }) + addClassToElement(elt, clazz); + } + + function closest(elt, selector) { + elt = resolveTarget(elt); + if (elt.closest) { + return elt.closest(selector); + } else { + // TODO remove when IE goes away + do{ + if (elt == null || matches(elt, selector)){ + return elt; + } + } + while (elt = elt && parentElt(elt)); + return null; + } + } + + function normalizeSelector(selector) { + var trimmedSelector = selector.trim(); + if (trimmedSelector.startsWith("<") && trimmedSelector.endsWith("/>")) { + return trimmedSelector.substring(1, trimmedSelector.length - 2); + } else { + return trimmedSelector; + } + } + + function querySelectorAllExt(elt, selector) { + if (selector.indexOf("closest ") === 0) { + return [closest(elt, normalizeSelector(selector.substr(8)))]; + } else if (selector.indexOf("find ") === 0) { + return [find(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector.indexOf("next ") === 0) { + return [scanForwardQuery(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector.indexOf("previous ") === 0) { + return [scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)))]; + } else if (selector === 'document') { + return [document]; + } else if (selector === 'window') { + return [window]; + } else { + return getDocument().querySelectorAll(normalizeSelector(selector)); + } + } + + var scanForwardQuery = function(start, match) { + var results = getDocument().querySelectorAll(match); + for (var i = 0; i < results.length; i++) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_PRECEDING) { + return elt; + } + } + } + + var scanBackwardsQuery = function(start, match) { + var results = getDocument().querySelectorAll(match); + for (var i = results.length - 1; i >= 0; i--) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_FOLLOWING) { + return elt; + } + } + } + + function querySelectorExt(eltOrSelector, selector) { + if (selector) { + return querySelectorAllExt(eltOrSelector, selector)[0]; + } else { + return querySelectorAllExt(getDocument().body, eltOrSelector)[0]; + } + } + + function resolveTarget(arg2) { + if (isType(arg2, 'String')) { + return find(arg2); + } else { + return arg2; + } + } + + function processEventArgs(arg1, arg2, arg3) { + if (isFunction(arg2)) { + return { + target: getDocument().body, + event: arg1, + listener: arg2 + } + } else { + return { + target: resolveTarget(arg1), + event: arg2, + listener: arg3 + } + } + + } + + function addEventListenerImpl(arg1, arg2, arg3) { + ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); + }) + var b = isFunction(arg2); + return b ? arg2 : arg3; + } + + function removeEventListenerImpl(arg1, arg2, arg3) { + ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.removeEventListener(eventArgs.event, eventArgs.listener); + }) + return isFunction(arg2) ? arg2 : arg3; + } + + //==================================================================== + // Node processing + //==================================================================== + + var DUMMY_ELT = getDocument().createElement("output"); // dummy element for bad selectors + function findAttributeTargets(elt, attrName) { + var attrTarget = getClosestAttributeValue(elt, attrName); + if (attrTarget) { + if (attrTarget === "this") { + return [findThisElement(elt, attrName)]; + } else { + var result = querySelectorAllExt(elt, attrTarget); + if (result.length === 0) { + logError('The selector "' + attrTarget + '" on ' + attrName + " returned no matches!"); + return [DUMMY_ELT] + } else { + return result; + } + } + } + } + + function findThisElement(elt, attribute){ + return getClosestMatch(elt, function (elt) { + return getAttributeValue(elt, attribute) != null; + }) + } + + function getTarget(elt) { + var targetStr = getClosestAttributeValue(elt, "hx-target"); + if (targetStr) { + if (targetStr === "this") { + return findThisElement(elt,'hx-target'); + } else { + return querySelectorExt(elt, targetStr) + } + } else { + var data = getInternalData(elt); + if (data.boosted) { + return getDocument().body; + } else { + return elt; + } + } + } + + function shouldSettleAttribute(name) { + var attributesToSettle = htmx.config.attributesToSettle; + for (var i = 0; i < attributesToSettle.length; i++) { + if (name === attributesToSettle[i]) { + return true; + } + } + return false; + } + + function cloneAttributes(mergeTo, mergeFrom) { + forEach(mergeTo.attributes, function (attr) { + if (!mergeFrom.hasAttribute(attr.name) && shouldSettleAttribute(attr.name)) { + mergeTo.removeAttribute(attr.name) + } + }); + forEach(mergeFrom.attributes, function (attr) { + if (shouldSettleAttribute(attr.name)) { + mergeTo.setAttribute(attr.name, attr.value); + } + }); + } + + function isInlineSwap(swapStyle, target) { + var extensions = getExtensions(target); + for (var i = 0; i < extensions.length; i++) { + var extension = extensions[i]; + try { + if (extension.isInlineSwap(swapStyle)) { + return true; + } + } catch(e) { + logError(e); + } + } + return swapStyle === "outerHTML"; + } + + /** + * + * @param {string} oobValue + * @param {HTMLElement} oobElement + * @param {*} settleInfo + * @returns + */ + function oobSwap(oobValue, oobElement, settleInfo) { + var selector = "#" + oobElement.id; + var swapStyle = "outerHTML"; + if (oobValue === "true") { + // do nothing + } else if (oobValue.indexOf(":") > 0) { + swapStyle = oobValue.substr(0, oobValue.indexOf(":")); + selector = oobValue.substr(oobValue.indexOf(":") + 1, oobValue.length); + } else { + swapStyle = oobValue; + } + + var targets = getDocument().querySelectorAll(selector); + if (targets) { + forEach( + targets, + function (target) { + var fragment; + var oobElementClone = oobElement.cloneNode(true); + fragment = getDocument().createDocumentFragment(); + fragment.appendChild(oobElementClone); + if (!isInlineSwap(swapStyle, target)) { + fragment = oobElementClone; // if this is not an inline swap, we use the content of the node, not the node itself + } + + var beforeSwapDetails = {shouldSwap: true, target: target, fragment:fragment }; + if (!triggerEvent(target, 'htmx:oobBeforeSwap', beforeSwapDetails)) return; + + target = beforeSwapDetails.target; // allow re-targeting + if (beforeSwapDetails['shouldSwap']){ + swap(swapStyle, target, target, fragment, settleInfo); + } + forEach(settleInfo.elts, function (elt) { + triggerEvent(elt, 'htmx:oobAfterSwap', beforeSwapDetails); + }); + } + ); + oobElement.parentNode.removeChild(oobElement); + } else { + oobElement.parentNode.removeChild(oobElement); + triggerErrorEvent(getDocument().body, "htmx:oobErrorNoTarget", {content: oobElement}); + } + return oobValue; + } + + function handleOutOfBandSwaps(elt, fragment, settleInfo) { + var oobSelects = getClosestAttributeValue(elt, "hx-select-oob"); + if (oobSelects) { + var oobSelectValues = oobSelects.split(","); + for (let i = 0; i < oobSelectValues.length; i++) { + var oobSelectValue = oobSelectValues[i].split(":", 2); + var id = oobSelectValue[0].trim(); + if (id.indexOf("#") === 0) { + id = id.substring(1); + } + var oobValue = oobSelectValue[1] || "true"; + var oobElement = fragment.querySelector("#" + id); + if (oobElement) { + oobSwap(oobValue, oobElement, settleInfo); + } + } + } + forEach(findAll(fragment, '[hx-swap-oob], [data-hx-swap-oob]'), function (oobElement) { + var oobValue = getAttributeValue(oobElement, "hx-swap-oob"); + if (oobValue != null) { + oobSwap(oobValue, oobElement, settleInfo); + } + }); + } + + function handlePreservedElements(fragment) { + forEach(findAll(fragment, '[hx-preserve], [data-hx-preserve]'), function (preservedElt) { + var id = getAttributeValue(preservedElt, "id"); + var oldElt = getDocument().getElementById(id); + if (oldElt != null) { + preservedElt.parentNode.replaceChild(oldElt, preservedElt); + } + }); + } + + function handleAttributes(parentNode, fragment, settleInfo) { + forEach(fragment.querySelectorAll("[id]"), function (newNode) { + if (newNode.id && newNode.id.length > 0) { + var normalizedId = newNode.id.replace("'", "\\'"); + var normalizedTag = newNode.tagName.replace(':', '\\:'); + var oldNode = parentNode.querySelector(normalizedTag + "[id='" + normalizedId + "']"); + if (oldNode && oldNode !== parentNode) { + var newAttributes = newNode.cloneNode(); + cloneAttributes(newNode, oldNode); + settleInfo.tasks.push(function () { + cloneAttributes(newNode, newAttributes); + }); + } + } + }); + } + + function makeAjaxLoadTask(child) { + return function () { + removeClassFromElement(child, htmx.config.addedClass); + processNode(child); + processScripts(child); + processFocus(child) + triggerEvent(child, 'htmx:load'); + }; + } + + function processFocus(child) { + var autofocus = "[autofocus]"; + var autoFocusedElt = matches(child, autofocus) ? child : child.querySelector(autofocus) + if (autoFocusedElt != null) { + autoFocusedElt.focus(); + } + } + + function insertNodesBefore(parentNode, insertBefore, fragment, settleInfo) { + handleAttributes(parentNode, fragment, settleInfo); + while(fragment.childNodes.length > 0){ + var child = fragment.firstChild; + addClassToElement(child, htmx.config.addedClass); + parentNode.insertBefore(child, insertBefore); + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { + settleInfo.tasks.push(makeAjaxLoadTask(child)); + } + } + } + + // based on https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0, + // derived from Java's string hashcode implementation + function stringHash(string, hash) { + var char = 0; + while (char < string.length){ + hash = (hash << 5) - hash + string.charCodeAt(char++) | 0; // bitwise or ensures we have a 32-bit int + } + return hash; + } + + function attributeHash(elt) { + var hash = 0; + // IE fix + if (elt.attributes) { + for (var i = 0; i < elt.attributes.length; i++) { + var attribute = elt.attributes[i]; + if(attribute.value){ // only include attributes w/ actual values (empty is same as non-existent) + hash = stringHash(attribute.name, hash); + hash = stringHash(attribute.value, hash); + } + } + } + return hash; + } + + function deInitNode(element) { + var internalData = getInternalData(element); + if (internalData.timeout) { + clearTimeout(internalData.timeout); + } + if (internalData.webSocket) { + internalData.webSocket.close(); + } + if (internalData.sseEventSource) { + internalData.sseEventSource.close(); + } + if (internalData.listenerInfos) { + forEach(internalData.listenerInfos, function (info) { + if (info.on) { + info.on.removeEventListener(info.trigger, info.listener); + } + }); + } + if (internalData.onHandlers) { + for (let i = 0; i < internalData.onHandlers.length; i++) { + const handlerInfo = internalData.onHandlers[i]; + element.removeEventListener(handlerInfo.name, handlerInfo.handler); + } + } + } + + function cleanUpElement(element) { + triggerEvent(element, "htmx:beforeCleanupElement") + deInitNode(element); + if (element.children) { // IE + forEach(element.children, function(child) { cleanUpElement(child) }); + } + } + + function swapOuterHTML(target, fragment, settleInfo) { + if (target.tagName === "BODY") { + return swapInnerHTML(target, fragment, settleInfo); + } else { + // @type {HTMLElement} + var newElt + var eltBeforeNewContent = target.previousSibling; + insertNodesBefore(parentElt(target), target, fragment, settleInfo); + if (eltBeforeNewContent == null) { + newElt = parentElt(target).firstChild; + } else { + newElt = eltBeforeNewContent.nextSibling; + } + getInternalData(target).replacedWith = newElt; // tuck away so we can fire events on it later + settleInfo.elts = [] // clear existing elements + while(newElt && newElt !== target) { + if (newElt.nodeType === Node.ELEMENT_NODE) { + settleInfo.elts.push(newElt); + } + newElt = newElt.nextElementSibling; + } + cleanUpElement(target); + parentElt(target).removeChild(target); + } + } + + function swapAfterBegin(target, fragment, settleInfo) { + return insertNodesBefore(target, target.firstChild, fragment, settleInfo); + } + + function swapBeforeBegin(target, fragment, settleInfo) { + return insertNodesBefore(parentElt(target), target, fragment, settleInfo); + } + + function swapBeforeEnd(target, fragment, settleInfo) { + return insertNodesBefore(target, null, fragment, settleInfo); + } + + function swapAfterEnd(target, fragment, settleInfo) { + return insertNodesBefore(parentElt(target), target.nextSibling, fragment, settleInfo); + } + function swapDelete(target, fragment, settleInfo) { + cleanUpElement(target); + return parentElt(target).removeChild(target); + } + + function swapInnerHTML(target, fragment, settleInfo) { + var firstChild = target.firstChild; + insertNodesBefore(target, firstChild, fragment, settleInfo); + if (firstChild) { + while (firstChild.nextSibling) { + cleanUpElement(firstChild.nextSibling) + target.removeChild(firstChild.nextSibling); + } + cleanUpElement(firstChild) + target.removeChild(firstChild); + } + } + + function maybeSelectFromResponse(elt, fragment) { + var selector = getClosestAttributeValue(elt, "hx-select"); + if (selector) { + var newFragment = getDocument().createDocumentFragment(); + forEach(fragment.querySelectorAll(selector), function (node) { + newFragment.appendChild(node); + }); + fragment = newFragment; + } + return fragment; + } + + function swap(swapStyle, elt, target, fragment, settleInfo) { + switch (swapStyle) { + case "none": + return; + case "outerHTML": + swapOuterHTML(target, fragment, settleInfo); + return; + case "afterbegin": + swapAfterBegin(target, fragment, settleInfo); + return; + case "beforebegin": + swapBeforeBegin(target, fragment, settleInfo); + return; + case "beforeend": + swapBeforeEnd(target, fragment, settleInfo); + return; + case "afterend": + swapAfterEnd(target, fragment, settleInfo); + return; + case "delete": + swapDelete(target, fragment, settleInfo); + return; + default: + var extensions = getExtensions(elt); + for (var i = 0; i < extensions.length; i++) { + var ext = extensions[i]; + try { + var newElements = ext.handleSwap(swapStyle, target, fragment, settleInfo); + if (newElements) { + if (typeof newElements.length !== 'undefined') { + // if handleSwap returns an array (like) of elements, we handle them + for (var j = 0; j < newElements.length; j++) { + var child = newElements[j]; + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { + settleInfo.tasks.push(makeAjaxLoadTask(child)); + } + } + } + return; + } + } catch (e) { + logError(e); + } + } + if (swapStyle === "innerHTML") { + swapInnerHTML(target, fragment, settleInfo); + } else { + swap(htmx.config.defaultSwapStyle, elt, target, fragment, settleInfo); + } + } + } + + function findTitle(content) { + if (content.indexOf(' -1) { + var contentWithSvgsRemoved = content.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); + var result = contentWithSvgsRemoved.match(/]*>|>)([\s\S]*?)<\/title>/im); + + if (result) { + return result[2]; + } + } + } + + function selectAndSwap(swapStyle, target, elt, responseText, settleInfo) { + settleInfo.title = findTitle(responseText); + var fragment = makeFragment(responseText); + if (fragment) { + handleOutOfBandSwaps(elt, fragment, settleInfo); + fragment = maybeSelectFromResponse(elt, fragment); + handlePreservedElements(fragment); + return swap(swapStyle, elt, target, fragment, settleInfo); + } + } + + function handleTrigger(xhr, header, elt) { + var triggerBody = xhr.getResponseHeader(header); + if (triggerBody.indexOf("{") === 0) { + var triggers = parseJSON(triggerBody); + for (var eventName in triggers) { + if (triggers.hasOwnProperty(eventName)) { + var detail = triggers[eventName]; + if (!isRawObject(detail)) { + detail = {"value": detail} + } + triggerEvent(elt, eventName, detail); + } + } + } else { + triggerEvent(elt, triggerBody, []); + } + } + + var WHITESPACE = /\s/; + var WHITESPACE_OR_COMMA = /[\s,]/; + var SYMBOL_START = /[_$a-zA-Z]/; + var SYMBOL_CONT = /[_$a-zA-Z0-9]/; + var STRINGISH_START = ['"', "'", "/"]; + var NOT_WHITESPACE = /[^\s]/; + function tokenizeString(str) { + var tokens = []; + var position = 0; + while (position < str.length) { + if(SYMBOL_START.exec(str.charAt(position))) { + var startPosition = position; + while (SYMBOL_CONT.exec(str.charAt(position + 1))) { + position++; + } + tokens.push(str.substr(startPosition, position - startPosition + 1)); + } else if (STRINGISH_START.indexOf(str.charAt(position)) !== -1) { + var startChar = str.charAt(position); + var startPosition = position; + position++; + while (position < str.length && str.charAt(position) !== startChar ) { + if (str.charAt(position) === "\\") { + position++; + } + position++; + } + tokens.push(str.substr(startPosition, position - startPosition + 1)); + } else { + var symbol = str.charAt(position); + tokens.push(symbol); + } + position++; + } + return tokens; + } + + function isPossibleRelativeReference(token, last, paramName) { + return SYMBOL_START.exec(token.charAt(0)) && + token !== "true" && + token !== "false" && + token !== "this" && + token !== paramName && + last !== "."; + } + + function maybeGenerateConditional(elt, tokens, paramName) { + if (tokens[0] === '[') { + tokens.shift(); + var bracketCount = 1; + var conditionalSource = " return (function(" + paramName + "){ return ("; + var last = null; + while (tokens.length > 0) { + var token = tokens[0]; + if (token === "]") { + bracketCount--; + if (bracketCount === 0) { + if (last === null) { + conditionalSource = conditionalSource + "true"; + } + tokens.shift(); + conditionalSource += ")})"; + try { + var conditionFunction = maybeEval(elt,function () { + return Function(conditionalSource)(); + }, + function(){return true}) + conditionFunction.source = conditionalSource; + return conditionFunction; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:syntax:error", {error:e, source:conditionalSource}) + return null; + } + } + } else if (token === "[") { + bracketCount++; + } + if (isPossibleRelativeReference(token, last, paramName)) { + conditionalSource += "((" + paramName + "." + token + ") ? (" + paramName + "." + token + ") : (window." + token + "))"; + } else { + conditionalSource = conditionalSource + token; + } + last = tokens.shift(); + } + } + } + + function consumeUntil(tokens, match) { + var result = ""; + while (tokens.length > 0 && !tokens[0].match(match)) { + result += tokens.shift(); + } + return result; + } + + var INPUT_SELECTOR = 'input, textarea, select'; + + /** + * @param {HTMLElement} elt + * @returns {import("./htmx").HtmxTriggerSpecification[]} + */ + function getTriggerSpecs(elt) { + var explicitTrigger = getAttributeValue(elt, 'hx-trigger'); + var triggerSpecs = []; + if (explicitTrigger) { + var tokens = tokenizeString(explicitTrigger); + do { + consumeUntil(tokens, NOT_WHITESPACE); + var initialLength = tokens.length; + var trigger = consumeUntil(tokens, /[,\[\s]/); + if (trigger !== "") { + if (trigger === "every") { + var every = {trigger: 'every'}; + consumeUntil(tokens, NOT_WHITESPACE); + every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)); + consumeUntil(tokens, NOT_WHITESPACE); + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + every.eventFilter = eventFilter; + } + triggerSpecs.push(every); + } else if (trigger.indexOf("sse:") === 0) { + triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)}); + } else { + var triggerSpec = {trigger: trigger}; + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + triggerSpec.eventFilter = eventFilter; + } + while (tokens.length > 0 && tokens[0] !== ",") { + consumeUntil(tokens, NOT_WHITESPACE) + var token = tokens.shift(); + if (token === "changed") { + triggerSpec.changed = true; + } else if (token === "once") { + triggerSpec.once = true; + } else if (token === "consume") { + triggerSpec.consume = true; + } else if (token === "delay" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if (token === "from" && tokens[0] === ":") { + tokens.shift(); + var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA); + if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") { + tokens.shift(); + from_arg += + " " + + consumeUntil( + tokens, + WHITESPACE_OR_COMMA + ); + } + triggerSpec.from = from_arg; + } else if (token === "target" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.target = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else if (token === "throttle" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if (token === "queue" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else if ((token === "root" || token === "threshold") && tokens[0] === ":") { + tokens.shift(); + triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else { + triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); + } + } + triggerSpecs.push(triggerSpec); + } + } + if (tokens.length === initialLength) { + triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); + } + consumeUntil(tokens, NOT_WHITESPACE); + } while (tokens[0] === "," && tokens.shift()) + } + + if (triggerSpecs.length > 0) { + return triggerSpecs; + } else if (matches(elt, 'form')) { + return [{trigger: 'submit'}]; + } else if (matches(elt, 'input[type="button"]')){ + return [{trigger: 'click'}]; + } else if (matches(elt, INPUT_SELECTOR)) { + return [{trigger: 'change'}]; + } else { + return [{trigger: 'click'}]; + } + } + + function cancelPolling(elt) { + getInternalData(elt).cancelled = true; + } + + function processPolling(elt, handler, spec) { + var nodeData = getInternalData(elt); + nodeData.timeout = setTimeout(function () { + if (bodyContains(elt) && nodeData.cancelled !== true) { + if (!maybeFilterEvent(spec, makeEvent('hx:poll:trigger', {triggerSpec:spec, target:elt}))) { + handler(elt); + } + processPolling(elt, handler, spec); + } + }, spec.pollInterval); + } + + function isLocalLink(elt) { + return location.hostname === elt.hostname && + getRawAttribute(elt,'href') && + getRawAttribute(elt,'href').indexOf("#") !== 0; + } + + function boostElement(elt, nodeData, triggerSpecs) { + if ((elt.tagName === "A" && isLocalLink(elt) && (elt.target === "" || elt.target === "_self")) || elt.tagName === "FORM") { + nodeData.boosted = true; + var verb, path; + if (elt.tagName === "A") { + verb = "get"; + path = elt.href; // DOM property gives the fully resolved href of a relative link + } else { + var rawAttribute = getRawAttribute(elt, "method"); + verb = rawAttribute ? rawAttribute.toLowerCase() : "get"; + if (verb === "get") { + } + path = getRawAttribute(elt, 'action'); + } + triggerSpecs.forEach(function(triggerSpec) { + addEventListener(elt, function(elt, evt) { + issueAjaxRequest(verb, path, elt, evt) + }, nodeData, triggerSpec, true); + }); + } + } + + /** + * + * @param {Event} evt + * @param {HTMLElement} elt + * @returns + */ + function shouldCancel(evt, elt) { + if (evt.type === "submit" || evt.type === "click") { + if (elt.tagName === "FORM") { + return true; + } + if (matches(elt, 'input[type="submit"], button') && closest(elt, 'form') !== null) { + return true; + } + if (elt.tagName === "A" && elt.href && + (elt.getAttribute('href') === '#' || elt.getAttribute('href').indexOf("#") !== 0)) { + return true; + } + } + return false; + } + + function ignoreBoostedAnchorCtrlClick(elt, evt) { + return getInternalData(elt).boosted && elt.tagName === "A" && evt.type === "click" && (evt.ctrlKey || evt.metaKey); + } + + function maybeFilterEvent(triggerSpec, evt) { + var eventFilter = triggerSpec.eventFilter; + if(eventFilter){ + try { + return eventFilter(evt) !== true; + } catch(e) { + triggerErrorEvent(getDocument().body, "htmx:eventFilter:error", {error: e, source:eventFilter.source}); + return true; + } + } + return false; + } + + function addEventListener(elt, handler, nodeData, triggerSpec, explicitCancel) { + var elementData = getInternalData(elt); + var eltsToListenOn; + if (triggerSpec.from) { + eltsToListenOn = querySelectorAllExt(elt, triggerSpec.from); + } else { + eltsToListenOn = [elt]; + } + // store the initial value of the element so we can tell if it changes + if (triggerSpec.changed) { + elementData.lastValue = elt.value; + } + forEach(eltsToListenOn, function (eltToListenOn) { + var eventListener = function (evt) { + if (!bodyContains(elt)) { + eltToListenOn.removeEventListener(triggerSpec.trigger, eventListener); + return; + } + if (ignoreBoostedAnchorCtrlClick(elt, evt)) { + return; + } + if (explicitCancel || shouldCancel(evt, elt)) { + evt.preventDefault(); + } + if (maybeFilterEvent(triggerSpec, evt)) { + return; + } + var eventData = getInternalData(evt); + eventData.triggerSpec = triggerSpec; + if (eventData.handledFor == null) { + eventData.handledFor = []; + } + if (eventData.handledFor.indexOf(elt) < 0) { + eventData.handledFor.push(elt); + if (triggerSpec.consume) { + evt.stopPropagation(); + } + if (triggerSpec.target && evt.target) { + if (!matches(evt.target, triggerSpec.target)) { + return; + } + } + if (triggerSpec.once) { + if (elementData.triggeredOnce) { + return; + } else { + elementData.triggeredOnce = true; + } + } + if (triggerSpec.changed) { + if (elementData.lastValue === elt.value) { + return; + } else { + elementData.lastValue = elt.value; + } + } + if (elementData.delayed) { + clearTimeout(elementData.delayed); + } + if (elementData.throttle) { + return; + } + + if (triggerSpec.throttle) { + if (!elementData.throttle) { + handler(elt, evt); + elementData.throttle = setTimeout(function () { + elementData.throttle = null; + }, triggerSpec.throttle); + } + } else if (triggerSpec.delay) { + elementData.delayed = setTimeout(function() { handler(elt, evt) }, triggerSpec.delay); + } else { + triggerEvent(elt, 'htmx:trigger') + handler(elt, evt); + } + } + }; + if (nodeData.listenerInfos == null) { + nodeData.listenerInfos = []; + } + nodeData.listenerInfos.push({ + trigger: triggerSpec.trigger, + listener: eventListener, + on: eltToListenOn + }) + eltToListenOn.addEventListener(triggerSpec.trigger, eventListener); + }); + } + + var windowIsScrolling = false // used by initScrollHandler + var scrollHandler = null; + function initScrollHandler() { + if (!scrollHandler) { + scrollHandler = function() { + windowIsScrolling = true + }; + window.addEventListener("scroll", scrollHandler) + setInterval(function() { + if (windowIsScrolling) { + windowIsScrolling = false; + forEach(getDocument().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"), function (elt) { + maybeReveal(elt); + }) + } + }, 200); + } + } + + function maybeReveal(elt) { + if (!hasAttribute(elt,'data-hx-revealed') && isScrolledIntoView(elt)) { + elt.setAttribute('data-hx-revealed', 'true'); + var nodeData = getInternalData(elt); + if (nodeData.initHash) { + triggerEvent(elt, 'revealed'); + } else { + // if the node isn't initialized, wait for it before triggering the request + elt.addEventListener("htmx:afterProcessNode", function(evt) { triggerEvent(elt, 'revealed') }, {once: true}); + } + } + } + + //==================================================================== + // Web Sockets + //==================================================================== + + function processWebSocketInfo(elt, nodeData, info) { + var values = splitOnWhitespace(info); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + ensureWebSocket(elt, value[1], 0); + } + if (value[0] === "send") { + processWebSocketSend(elt); + } + } + } + + function ensureWebSocket(elt, wssSource, retryCount) { + if (!bodyContains(elt)) { + return; // stop ensuring websocket connection when socket bearing element ceases to exist + } + + if (wssSource.indexOf("/") == 0) { // complete absolute paths only + var base_part = location.hostname + (location.port ? ':'+location.port: ''); + if (location.protocol == 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol == 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + var socket = htmx.createWebSocket(wssSource); + socket.onerror = function (e) { + triggerErrorEvent(elt, "htmx:wsError", {error:e, socket:socket}); + maybeCloseWebSocketSource(elt); + }; + + socket.onclose = function (e) { + if ([1006, 1012, 1013].indexOf(e.code) >= 0) { // Abnormal Closure/Service Restart/Try Again Later + var delay = getWebSocketReconnectDelay(retryCount); + setTimeout(function() { + ensureWebSocket(elt, wssSource, retryCount+1); // creates a websocket with a new timeout + }, delay); + } + }; + socket.onopen = function (e) { + retryCount = 0; + } + + getInternalData(elt).webSocket = socket; + socket.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(elt)) { + return; + } + + var response = event.data; + withExtensions(elt, function(extension){ + response = extension.transformResponse(response, null, elt); + }); + + var settleInfo = makeSettleInfo(elt); + var fragment = makeFragment(response); + var children = toArray(fragment.children); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + oobSwap(getAttributeValue(child, "hx-swap-oob") || "true", child, settleInfo); + } + + settleImmediately(settleInfo.tasks); + }); + } + + function maybeCloseWebSocketSource(elt) { + if (!bodyContains(elt)) { + getInternalData(elt).webSocket.close(); + return true; + } + } + + function processWebSocketSend(elt) { + var webSocketSourceElt = getClosestMatch(elt, function (parent) { + return getInternalData(parent).webSocket != null; + }); + if (webSocketSourceElt) { + elt.addEventListener(getTriggerSpecs(elt)[0].trigger, function (evt) { + var webSocket = getInternalData(webSocketSourceElt).webSocket; + var headers = getHeaders(elt, webSocketSourceElt); + var results = getInputValues(elt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = getExpressionVars(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); + filteredParameters['HEADERS'] = headers; + if (errors && errors.length > 0) { + triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + webSocket.send(JSON.stringify(filteredParameters)); + if(shouldCancel(evt, elt)){ + evt.preventDefault(); + } + }); + } else { + triggerErrorEvent(elt, "htmx:noWebSocketSourceError"); + } + } + + function getWebSocketReconnectDelay(retryCount) { + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + // @ts-ignore + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + //==================================================================== + // Server Sent Events + //==================================================================== + + function processSSEInfo(elt, nodeData, info) { + var values = splitOnWhitespace(info); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + processSSESource(elt, value[1]); + } + + if ((value[0] === "swap")) { + processSSESwap(elt, value[1]) + } + } + } + + function processSSESource(elt, sseSrc) { + var source = htmx.createEventSource(sseSrc); + source.onerror = function (e) { + triggerErrorEvent(elt, "htmx:sseError", {error:e, source:source}); + maybeCloseSSESource(elt); + }; + getInternalData(elt).sseEventSource = source; + } + + function processSSESwap(elt, sseEventName) { + var sseSourceElt = getClosestMatch(elt, hasEventSource); + if (sseSourceElt) { + var sseEventSource = getInternalData(sseSourceElt).sseEventSource; + var sseListener = function (event) { + if (maybeCloseSSESource(sseSourceElt)) { + sseEventSource.removeEventListener(sseEventName, sseListener); + return; + } + + /////////////////////////// + // TODO: merge this code with AJAX and WebSockets code in the future. + + var response = event.data; + withExtensions(elt, function(extension){ + response = extension.transformResponse(response, null, elt); + }); + + var swapSpec = getSwapSpecification(elt) + var target = getTarget(elt) + var settleInfo = makeSettleInfo(elt); + + selectAndSwap(swapSpec.swapStyle, elt, target, response, settleInfo) + settleImmediately(settleInfo.tasks) + triggerEvent(elt, "htmx:sseMessage", event) + }; + + getInternalData(elt).sseListener = sseListener; + sseEventSource.addEventListener(sseEventName, sseListener); + } else { + triggerErrorEvent(elt, "htmx:noSSESourceError"); + } + } + + function processSSETrigger(elt, handler, sseEventName) { + var sseSourceElt = getClosestMatch(elt, hasEventSource); + if (sseSourceElt) { + var sseEventSource = getInternalData(sseSourceElt).sseEventSource; + var sseListener = function () { + if (!maybeCloseSSESource(sseSourceElt)) { + if (bodyContains(elt)) { + handler(elt); + } else { + sseEventSource.removeEventListener(sseEventName, sseListener); + } + } + }; + getInternalData(elt).sseListener = sseListener; + sseEventSource.addEventListener(sseEventName, sseListener); + } else { + triggerErrorEvent(elt, "htmx:noSSESourceError"); + } + } + + function maybeCloseSSESource(elt) { + if (!bodyContains(elt)) { + getInternalData(elt).sseEventSource.close(); + return true; + } + } + + function hasEventSource(node) { + return getInternalData(node).sseEventSource != null; + } + + //==================================================================== + + function loadImmediately(elt, handler, nodeData, delay) { + var load = function(){ + if (!nodeData.loaded) { + nodeData.loaded = true; + handler(elt); + } + } + if (delay) { + setTimeout(load, delay); + } else { + load(); + } + } + + function processVerbs(elt, nodeData, triggerSpecs) { + var explicitAction = false; + forEach(VERBS, function (verb) { + if (hasAttribute(elt,'hx-' + verb)) { + var path = getAttributeValue(elt, 'hx-' + verb); + explicitAction = true; + nodeData.path = path; + nodeData.verb = verb; + triggerSpecs.forEach(function(triggerSpec) { + addTriggerHandler(elt, triggerSpec, nodeData, function (elt, evt) { + issueAjaxRequest(verb, path, elt, evt) + }) + }); + } + }); + return explicitAction; + } + + function addTriggerHandler(elt, triggerSpec, nodeData, handler) { + if (triggerSpec.sseEvent) { + processSSETrigger(elt, handler, triggerSpec.sseEvent); + } else if (triggerSpec.trigger === "revealed") { + initScrollHandler(); + addEventListener(elt, handler, nodeData, triggerSpec); + maybeReveal(elt); + } else if (triggerSpec.trigger === "intersect") { + var observerOptions = {}; + if (triggerSpec.root) { + observerOptions.root = querySelectorExt(elt, triggerSpec.root) + } + if (triggerSpec.threshold) { + observerOptions.threshold = parseFloat(triggerSpec.threshold); + } + var observer = new IntersectionObserver(function (entries) { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + if (entry.isIntersecting) { + triggerEvent(elt, "intersect"); + break; + } + } + }, observerOptions); + observer.observe(elt); + addEventListener(elt, handler, nodeData, triggerSpec); + } else if (triggerSpec.trigger === "load") { + if (!maybeFilterEvent(triggerSpec, makeEvent("load", {elt:elt}))) { + loadImmediately(elt, handler, nodeData, triggerSpec.delay); + } + } else if (triggerSpec.pollInterval) { + nodeData.polling = true; + processPolling(elt, handler, triggerSpec); + } else { + addEventListener(elt, handler, nodeData, triggerSpec); + } + } + + function evalScript(script) { + if (script.type === "text/javascript" || script.type === "module" || script.type === "") { + var newScript = getDocument().createElement("script"); + forEach(script.attributes, function (attr) { + newScript.setAttribute(attr.name, attr.value); + }); + newScript.textContent = script.textContent; + newScript.async = false; + if (htmx.config.inlineScriptNonce) { + newScript.nonce = htmx.config.inlineScriptNonce; + } + var parent = script.parentElement; + + try { + parent.insertBefore(newScript, script); + } catch (e) { + logError(e); + } finally { + // remove old script element, but only if it is still in DOM + if (script.parentElement) { + script.parentElement.removeChild(script); + } + } + } + } + + function processScripts(elt) { + if (matches(elt, "script")) { + evalScript(elt); + } + forEach(findAll(elt, "script"), function (script) { + evalScript(script); + }); + } + + function hasChanceOfBeingBoosted() { + return document.querySelector("[hx-boost], [data-hx-boost]"); + } + + function findElementsToProcess(elt) { + if (elt.querySelectorAll) { + var boostedElts = hasChanceOfBeingBoosted() ? ", a, form" : ""; + var results = elt.querySelectorAll(VERB_SELECTOR + boostedElts + ", [hx-sse], [data-hx-sse], [hx-ws]," + + " [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]"); + return results; + } else { + return []; + } + } + + function initButtonTracking(form){ + var maybeSetLastButtonClicked = function(evt){ + var elt = closest(evt.target, "button, input[type='submit']"); + if (elt !== null) { + var internalData = getInternalData(form); + internalData.lastButtonClicked = elt; + } + }; + + // need to handle both click and focus in: + // focusin - in case someone tabs in to a button and hits the space bar + // click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724 + + form.addEventListener('click', maybeSetLastButtonClicked) + form.addEventListener('focusin', maybeSetLastButtonClicked) + form.addEventListener('focusout', function(evt){ + var internalData = getInternalData(form); + internalData.lastButtonClicked = null; + }) + } + + function countCurlies(line) { + var tokens = tokenizeString(line); + var netCurlies = 0; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (token === "{") { + netCurlies++; + } else if (token === "}") { + netCurlies--; + } + } + return netCurlies; + } + + function addHxOnEventHandler(elt, eventName, code) { + var nodeData = getInternalData(elt); + nodeData.onHandlers = []; + var func = new Function("event", code + "; return;"); + var listener = elt.addEventListener(eventName, function (e) { + return func.call(elt, e); + }); + nodeData.onHandlers.push({event:eventName, listener:listener}); + return {nodeData, code, func, listener}; + } + + function processHxOn(elt) { + var hxOnValue = getAttributeValue(elt, 'hx-on'); + if (hxOnValue) { + var handlers = {} + var lines = hxOnValue.split("\n"); + var currentEvent = null; + var curlyCount = 0; + while (lines.length > 0) { + var line = lines.shift(); + var match = line.match(/^\s*([a-zA-Z:\-]+:)(.*)/); + if (curlyCount === 0 && match) { + line.split(":") + currentEvent = match[1].slice(0, -1); // strip last colon + handlers[currentEvent] = match[2]; + } else { + handlers[currentEvent] += line; + } + curlyCount += countCurlies(line); + } + + for (var eventName in handlers) { + addHxOnEventHandler(elt, eventName, handlers[eventName]); + } + } + } + + function initNode(elt) { + if (elt.closest && elt.closest(htmx.config.disableSelector)) { + return; + } + var nodeData = getInternalData(elt); + if (nodeData.initHash !== attributeHash(elt)) { + + nodeData.initHash = attributeHash(elt); + + // clean up any previously processed info + deInitNode(elt); + + processHxOn(elt); + + triggerEvent(elt, "htmx:beforeProcessNode") + + if (elt.value) { + nodeData.lastValue = elt.value; + } + + var triggerSpecs = getTriggerSpecs(elt); + var hasExplicitHttpAction = processVerbs(elt, nodeData, triggerSpecs); + + if (!hasExplicitHttpAction) { + if (getClosestAttributeValue(elt, "hx-boost") === "true") { + boostElement(elt, nodeData, triggerSpecs); + } else if (hasAttribute(elt, 'hx-trigger')) { + triggerSpecs.forEach(function (triggerSpec) { + // For "naked" triggers, don't do anything at all + addTriggerHandler(elt, triggerSpec, nodeData, function () { + }) + }) + } + } + + if (elt.tagName === "FORM") { + initButtonTracking(elt); + } + + var sseInfo = getAttributeValue(elt, 'hx-sse'); + if (sseInfo) { + processSSEInfo(elt, nodeData, sseInfo); + } + + var wsInfo = getAttributeValue(elt, 'hx-ws'); + if (wsInfo) { + processWebSocketInfo(elt, nodeData, wsInfo); + } + triggerEvent(elt, "htmx:afterProcessNode"); + } + } + + function processNode(elt) { + elt = resolveTarget(elt); + initNode(elt); + forEach(findElementsToProcess(elt), function(child) { initNode(child) }); + } + + //==================================================================== + // Event/Log Support + //==================================================================== + + function kebabEventName(str) { + return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); + } + + function makeEvent(eventName, detail) { + var evt; + if (window.CustomEvent && typeof window.CustomEvent === 'function') { + evt = new CustomEvent(eventName, {bubbles: true, cancelable: true, detail: detail}); + } else { + evt = getDocument().createEvent('CustomEvent'); + evt.initCustomEvent(eventName, true, true, detail); + } + return evt; + } + + function triggerErrorEvent(elt, eventName, detail) { + triggerEvent(elt, eventName, mergeObjects({error:eventName}, detail)); + } + + function ignoreEventForLogging(eventName) { + return eventName === "htmx:afterProcessNode" + } + + /** + * `withExtensions` locates all active extensions for a provided element, then + * executes the provided function using each of the active extensions. It should + * be called internally at every extendable execution point in htmx. + * + * @param {HTMLElement} elt + * @param {(extension:import("./htmx").HtmxExtension) => void} toDo + * @returns void + */ + function withExtensions(elt, toDo) { + forEach(getExtensions(elt), function(extension){ + try { + toDo(extension); + } catch (e) { + logError(e); + } + }); + } + + function logError(msg) { + if(console.error) { + console.error(msg); + } else if (console.log) { + console.log("ERROR: ", msg); + } + } + + function triggerEvent(elt, eventName, detail) { + elt = resolveTarget(elt); + if (detail == null) { + detail = {}; + } + detail["elt"] = elt; + var event = makeEvent(eventName, detail); + if (htmx.logger && !ignoreEventForLogging(eventName)) { + htmx.logger(elt, eventName, detail); + } + if (detail.error) { + logError(detail.error); + triggerEvent(elt, "htmx:error", {errorInfo:detail}) + } + var eventResult = elt.dispatchEvent(event); + var kebabName = kebabEventName(eventName); + if (eventResult && kebabName !== eventName) { + var kebabedEvent = makeEvent(kebabName, event.detail); + eventResult = eventResult && elt.dispatchEvent(kebabedEvent) + } + withExtensions(elt, function (extension) { + eventResult = eventResult && (extension.onEvent(eventName, event) !== false) + }); + return eventResult; + } + + //==================================================================== + // History Support + //==================================================================== + var currentPathForHistory = location.pathname+location.search; + + function getHistoryElement() { + var historyElt = getDocument().querySelector('[hx-history-elt],[data-hx-history-elt]'); + return historyElt || getDocument().body; + } + + function saveToHistoryCache(url, content, title, scroll) { + if (!canAccessLocalStorage()) { + return; + } + + url = normalizePath(url); + + var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; + for (var i = 0; i < historyCache.length; i++) { + if (historyCache[i].url === url) { + historyCache.splice(i, 1); + break; + } + } + var newHistoryItem = {url:url, content: content, title:title, scroll:scroll}; + triggerEvent(getDocument().body, "htmx:historyItemCreated", {item:newHistoryItem, cache: historyCache}) + historyCache.push(newHistoryItem) + while (historyCache.length > htmx.config.historyCacheSize) { + historyCache.shift(); + } + while(historyCache.length > 0){ + try { + localStorage.setItem("htmx-history-cache", JSON.stringify(historyCache)); + break; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:historyCacheError", {cause:e, cache: historyCache}) + historyCache.shift(); // shrink the cache and retry + } + } + } + + function getCachedHistory(url) { + if (!canAccessLocalStorage()) { + return null; + } + + url = normalizePath(url); + + var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; + for (var i = 0; i < historyCache.length; i++) { + if (historyCache[i].url === url) { + return historyCache[i]; + } + } + return null; + } + + function cleanInnerHtmlForHistory(elt) { + var className = htmx.config.requestClass; + var clone = elt.cloneNode(true); + forEach(findAll(clone, "." + className), function(child){ + removeClassFromElement(child, className); + }); + return clone.innerHTML; + } + + function saveCurrentPageToHistory() { + var elt = getHistoryElement(); + var path = currentPathForHistory || location.pathname+location.search; + + // Allow history snapshot feature to be disabled where hx-history="false" + // is present *anywhere* in the current document we're about to save, + // so we can prevent privileged data entering the cache. + // The page will still be reachable as a history entry, but htmx will fetch it + // live from the server onpopstate rather than look in the localStorage cache + var disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]'); + if (!disableHistoryCache) { + triggerEvent(getDocument().body, "htmx:beforeHistorySave", {path: path, historyElt: elt}); + saveToHistoryCache(path, cleanInnerHtmlForHistory(elt), getDocument().title, window.scrollY); + } + + if (htmx.config.historyEnabled) history.replaceState({htmx: true}, getDocument().title, window.location.href); + } + + function pushUrlIntoHistory(path) { + // remove the cache buster parameter, if any + if (htmx.config.getCacheBusterParam) { + path = path.replace(/org\.htmx\.cache-buster=[^&]*&?/, '') + if (path.endsWith('&') || path.endsWith("?")) { + path = path.slice(0, -1); + } + } + if(htmx.config.historyEnabled) { + history.pushState({htmx:true}, "", path); + } + currentPathForHistory = path; + } + + function replaceUrlInHistory(path) { + if(htmx.config.historyEnabled) history.replaceState({htmx:true}, "", path); + currentPathForHistory = path; + } + + function settleImmediately(tasks) { + forEach(tasks, function (task) { + task.call(); + }); + } + + function loadHistoryFromServer(path) { + var request = new XMLHttpRequest(); + var details = {path: path, xhr:request}; + triggerEvent(getDocument().body, "htmx:historyCacheMiss", details); + request.open('GET', path, true); + request.setRequestHeader("HX-History-Restore-Request", "true"); + request.onload = function () { + if (this.status >= 200 && this.status < 400) { + triggerEvent(getDocument().body, "htmx:historyCacheMissLoad", details); + var fragment = makeFragment(this.response); + // @ts-ignore + fragment = fragment.querySelector('[hx-history-elt],[data-hx-history-elt]') || fragment; + var historyElement = getHistoryElement(); + var settleInfo = makeSettleInfo(historyElement); + var title = findTitle(this.response); + if (title) { + var titleElt = find("title"); + if (titleElt) { + titleElt.innerHTML = title; + } else { + window.document.title = title; + } + } + // @ts-ignore + swapInnerHTML(historyElement, fragment, settleInfo) + settleImmediately(settleInfo.tasks); + currentPathForHistory = path; + triggerEvent(getDocument().body, "htmx:historyRestore", {path: path, cacheMiss:true, serverResponse:this.response}); + } else { + triggerErrorEvent(getDocument().body, "htmx:historyCacheMissLoadError", details); + } + }; + request.send(); + } + + function restoreHistory(path) { + saveCurrentPageToHistory(); + path = path || location.pathname+location.search; + var cached = getCachedHistory(path); + if (cached) { + var fragment = makeFragment(cached.content); + var historyElement = getHistoryElement(); + var settleInfo = makeSettleInfo(historyElement); + swapInnerHTML(historyElement, fragment, settleInfo) + settleImmediately(settleInfo.tasks); + document.title = cached.title; + window.scrollTo(0, cached.scroll); + currentPathForHistory = path; + triggerEvent(getDocument().body, "htmx:historyRestore", {path:path, item:cached}); + } else { + if (htmx.config.refreshOnHistoryMiss) { + + // @ts-ignore: optional parameter in reload() function throws error + window.location.reload(true); + } else { + loadHistoryFromServer(path); + } + } + } + + function addRequestIndicatorClasses(elt) { + var indicators = findAttributeTargets(elt, 'hx-indicator'); + if (indicators == null) { + indicators = [elt]; + } + forEach(indicators, function (ic) { + var internalData = getInternalData(ic); + internalData.requestCount = (internalData.requestCount || 0) + 1; + ic.classList["add"].call(ic.classList, htmx.config.requestClass); + }); + return indicators; + } + + function removeRequestIndicatorClasses(indicators) { + forEach(indicators, function (ic) { + var internalData = getInternalData(ic); + internalData.requestCount = (internalData.requestCount || 0) - 1; + if (internalData.requestCount === 0) { + ic.classList["remove"].call(ic.classList, htmx.config.requestClass); + } + }); + } + + //==================================================================== + // Input Value Processing + //==================================================================== + + function haveSeenNode(processed, elt) { + for (var i = 0; i < processed.length; i++) { + var node = processed[i]; + if (node.isSameNode(elt)) { + return true; + } + } + return false; + } + + function shouldInclude(elt) { + if(elt.name === "" || elt.name == null || elt.disabled) { + return false; + } + // ignore "submitter" types (see jQuery src/serialize.js) + if (elt.type === "button" || elt.type === "submit" || elt.tagName === "image" || elt.tagName === "reset" || elt.tagName === "file" ) { + return false; + } + if (elt.type === "checkbox" || elt.type === "radio" ) { + return elt.checked; + } + return true; + } + + function processInputValue(processed, values, errors, elt, validate) { + if (elt == null || haveSeenNode(processed, elt)) { + return; + } else { + processed.push(elt); + } + if (shouldInclude(elt)) { + var name = getRawAttribute(elt,"name"); + var value = elt.value; + if (elt.multiple) { + value = toArray(elt.querySelectorAll("option:checked")).map(function (e) { return e.value }); + } + // include file inputs + if (elt.files) { + value = toArray(elt.files); + } + // This is a little ugly because both the current value of the named value in the form + // and the new value could be arrays, so we have to handle all four cases :/ + if (name != null && value != null) { + var current = values[name]; + if (current !== undefined) { + if (Array.isArray(current)) { + if (Array.isArray(value)) { + values[name] = current.concat(value); + } else { + current.push(value); + } + } else { + if (Array.isArray(value)) { + values[name] = [current].concat(value); + } else { + values[name] = [current, value]; + } + } + } else { + values[name] = value; + } + } + if (validate) { + validateElement(elt, errors); + } + } + if (matches(elt, 'form')) { + var inputs = elt.elements; + forEach(inputs, function(input) { + processInputValue(processed, values, errors, input, validate); + }); + } + } + + function validateElement(element, errors) { + if (element.willValidate) { + triggerEvent(element, "htmx:validation:validate") + if (!element.checkValidity()) { + errors.push({elt: element, message:element.validationMessage, validity:element.validity}); + triggerEvent(element, "htmx:validation:failed", {message:element.validationMessage, validity:element.validity}) + } + } + } + + /** + * @param {HTMLElement} elt + * @param {string} verb + */ + function getInputValues(elt, verb) { + var processed = []; + var values = {}; + var formValues = {}; + var errors = []; + var internalData = getInternalData(elt); + + // only validate when form is directly submitted and novalidate or formnovalidate are not set + // or if the element has an explicit hx-validate="true" on it + var validate = (matches(elt, 'form') && elt.noValidate !== true) || getAttributeValue(elt, "hx-validate") === "true"; + if (internalData.lastButtonClicked) { + validate = validate && internalData.lastButtonClicked.formNoValidate !== true; + } + + // for a non-GET include the closest form + if (verb !== 'get') { + processInputValue(processed, formValues, errors, closest(elt, 'form'), validate); + } + + // include the element itself + processInputValue(processed, values, errors, elt, validate); + + // if a button or submit was clicked last, include its value + if (internalData.lastButtonClicked) { + var name = getRawAttribute(internalData.lastButtonClicked,"name"); + if (name) { + values[name] = internalData.lastButtonClicked.value; + } + } + + // include any explicit includes + var includes = findAttributeTargets(elt, "hx-include"); + forEach(includes, function(node) { + processInputValue(processed, values, errors, node, validate); + // if a non-form is included, include any input values within it + if (!matches(node, 'form')) { + forEach(node.querySelectorAll(INPUT_SELECTOR), function (descendant) { + processInputValue(processed, values, errors, descendant, validate); + }) + } + }); + + // form values take precedence, overriding the regular values + values = mergeObjects(values, formValues); + + return {errors:errors, values:values}; + } + + function appendParam(returnStr, name, realValue) { + if (returnStr !== "") { + returnStr += "&"; + } + if (String(realValue) === "[object Object]") { + realValue = JSON.stringify(realValue); + } + var s = encodeURIComponent(realValue); + returnStr += encodeURIComponent(name) + "=" + s; + return returnStr; + } + + function urlEncode(values) { + var returnStr = ""; + for (var name in values) { + if (values.hasOwnProperty(name)) { + var value = values[name]; + if (Array.isArray(value)) { + forEach(value, function(v) { + returnStr = appendParam(returnStr, name, v); + }); + } else { + returnStr = appendParam(returnStr, name, value); + } + } + } + return returnStr; + } + + function makeFormData(values) { + var formData = new FormData(); + for (var name in values) { + if (values.hasOwnProperty(name)) { + var value = values[name]; + if (Array.isArray(value)) { + forEach(value, function(v) { + formData.append(name, v); + }); + } else { + formData.append(name, value); + } + } + } + return formData; + } + + //==================================================================== + // Ajax + //==================================================================== + + /** + * @param {HTMLElement} elt + * @param {HTMLElement} target + * @param {string} prompt + * @returns {Object} // TODO: Define/Improve HtmxHeaderSpecification + */ + function getHeaders(elt, target, prompt) { + var headers = { + "HX-Request" : "true", + "HX-Trigger" : getRawAttribute(elt, "id"), + "HX-Trigger-Name" : getRawAttribute(elt, "name"), + "HX-Target" : getAttributeValue(target, "id"), + "HX-Current-URL" : getDocument().location.href, + } + getValuesForElement(elt, "hx-headers", false, headers) + if (prompt !== undefined) { + headers["HX-Prompt"] = prompt; + } + if (getInternalData(elt).boosted) { + headers["HX-Boosted"] = "true"; + } + return headers; + } + + /** + * filterValues takes an object containing form input values + * and returns a new object that only contains keys that are + * specified by the closest "hx-params" attribute + * @param {Object} inputValues + * @param {HTMLElement} elt + * @returns {Object} + */ + function filterValues(inputValues, elt) { + var paramsValue = getClosestAttributeValue(elt, "hx-params"); + if (paramsValue) { + if (paramsValue === "none") { + return {}; + } else if (paramsValue === "*") { + return inputValues; + } else if(paramsValue.indexOf("not ") === 0) { + forEach(paramsValue.substr(4).split(","), function (name) { + name = name.trim(); + delete inputValues[name]; + }); + return inputValues; + } else { + var newValues = {} + forEach(paramsValue.split(","), function (name) { + name = name.trim(); + newValues[name] = inputValues[name]; + }); + return newValues; + } + } else { + return inputValues; + } + } + + function isAnchorLink(elt) { + return getRawAttribute(elt, 'href') && getRawAttribute(elt, 'href').indexOf("#") >=0 + } + + /** + * + * @param {HTMLElement} elt + * @param {string} swapInfoOverride + * @returns {import("./htmx").HtmxSwapSpecification} + */ + function getSwapSpecification(elt, swapInfoOverride) { + var swapInfo = swapInfoOverride ? swapInfoOverride : getClosestAttributeValue(elt, "hx-swap"); + var swapSpec = { + "swapStyle" : getInternalData(elt).boosted ? 'innerHTML' : htmx.config.defaultSwapStyle, + "swapDelay" : htmx.config.defaultSwapDelay, + "settleDelay" : htmx.config.defaultSettleDelay + } + if (getInternalData(elt).boosted && !isAnchorLink(elt)) { + swapSpec["show"] = "top" + } + if (swapInfo) { + var split = splitOnWhitespace(swapInfo); + if (split.length > 0) { + swapSpec["swapStyle"] = split[0]; + for (var i = 1; i < split.length; i++) { + var modifier = split[i]; + if (modifier.indexOf("swap:") === 0) { + swapSpec["swapDelay"] = parseInterval(modifier.substr(5)); + } + if (modifier.indexOf("settle:") === 0) { + swapSpec["settleDelay"] = parseInterval(modifier.substr(7)); + } + if (modifier.indexOf("transition:") === 0) { + swapSpec["transition"] = modifier.substr(11) === "true"; + } + if (modifier.indexOf("scroll:") === 0) { + var scrollSpec = modifier.substr(7); + var splitSpec = scrollSpec.split(":"); + var scrollVal = splitSpec.pop(); + var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; + swapSpec["scroll"] = scrollVal; + swapSpec["scrollTarget"] = selectorVal; + } + if (modifier.indexOf("show:") === 0) { + var showSpec = modifier.substr(5); + var splitSpec = showSpec.split(":"); + var showVal = splitSpec.pop(); + var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; + swapSpec["show"] = showVal; + swapSpec["showTarget"] = selectorVal; + } + if (modifier.indexOf("focus-scroll:") === 0) { + var focusScrollVal = modifier.substr("focus-scroll:".length); + swapSpec["focusScroll"] = focusScrollVal == "true"; + } + } + } + } + return swapSpec; + } + + function usesFormData(elt) { + return getClosestAttributeValue(elt, "hx-encoding") === "multipart/form-data" || + (matches(elt, "form") && getRawAttribute(elt, 'enctype') === "multipart/form-data"); + } + + function encodeParamsForBody(xhr, elt, filteredParameters) { + var encodedParameters = null; + withExtensions(elt, function (extension) { + if (encodedParameters == null) { + encodedParameters = extension.encodeParameters(xhr, filteredParameters, elt); + } + }); + if (encodedParameters != null) { + return encodedParameters; + } else { + if (usesFormData(elt)) { + return makeFormData(filteredParameters); + } else { + return urlEncode(filteredParameters); + } + } + } + + /** + * + * @param {Element} target + * @returns {import("./htmx").HtmxSettleInfo} + */ + function makeSettleInfo(target) { + return {tasks: [], elts: [target]}; + } + + function updateScrollState(content, swapSpec) { + var first = content[0]; + var last = content[content.length - 1]; + if (swapSpec.scroll) { + var target = null; + if (swapSpec.scrollTarget) { + target = querySelectorExt(first, swapSpec.scrollTarget); + } + if (swapSpec.scroll === "top" && (first || target)) { + target = target || first; + target.scrollTop = 0; + } + if (swapSpec.scroll === "bottom" && (last || target)) { + target = target || last; + target.scrollTop = target.scrollHeight; + } + } + if (swapSpec.show) { + var target = null; + if (swapSpec.showTarget) { + var targetStr = swapSpec.showTarget; + if (swapSpec.showTarget === "window") { + targetStr = "body"; + } + target = querySelectorExt(first, targetStr); + } + if (swapSpec.show === "top" && (first || target)) { + target = target || first; + target.scrollIntoView({block:'start', behavior: htmx.config.scrollBehavior}); + } + if (swapSpec.show === "bottom" && (last || target)) { + target = target || last; + target.scrollIntoView({block:'end', behavior: htmx.config.scrollBehavior}); + } + } + } + + /** + * @param {HTMLElement} elt + * @param {string} attr + * @param {boolean=} evalAsDefault + * @param {Object=} values + * @returns {Object} + */ + function getValuesForElement(elt, attr, evalAsDefault, values) { + if (values == null) { + values = {}; + } + if (elt == null) { + return values; + } + var attributeValue = getAttributeValue(elt, attr); + if (attributeValue) { + var str = attributeValue.trim(); + var evaluateValue = evalAsDefault; + if (str === "unset") { + return null; + } + if (str.indexOf("javascript:") === 0) { + str = str.substr(11); + evaluateValue = true; + } else if (str.indexOf("js:") === 0) { + str = str.substr(3); + evaluateValue = true; + } + if (str.indexOf('{') !== 0) { + str = "{" + str + "}"; + } + var varsValues; + if (evaluateValue) { + varsValues = maybeEval(elt,function () {return Function("return (" + str + ")")();}, {}); + } else { + varsValues = parseJSON(str); + } + for (var key in varsValues) { + if (varsValues.hasOwnProperty(key)) { + if (values[key] == null) { + values[key] = varsValues[key]; + } + } + } + } + return getValuesForElement(parentElt(elt), attr, evalAsDefault, values); + } + + function maybeEval(elt, toEval, defaultVal) { + if (htmx.config.allowEval) { + return toEval(); + } else { + triggerErrorEvent(elt, 'htmx:evalDisallowedError'); + return defaultVal; + } + } + + /** + * @param {HTMLElement} elt + * @param {*} expressionVars + * @returns + */ + function getHXVarsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vars", true, expressionVars); + } + + /** + * @param {HTMLElement} elt + * @param {*} expressionVars + * @returns + */ + function getHXValsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vals", false, expressionVars); + } + + /** + * @param {HTMLElement} elt + * @returns {Object} + */ + function getExpressionVars(elt) { + return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt)); + } + + function safelySetHeaderValue(xhr, header, headerValue) { + if (headerValue !== null) { + try { + xhr.setRequestHeader(header, headerValue); + } catch (e) { + // On an exception, try to set the header URI encoded instead + xhr.setRequestHeader(header, encodeURIComponent(headerValue)); + xhr.setRequestHeader(header + "-URI-AutoEncoded", "true"); + } + } + } + + function getPathFromResponse(xhr) { + // NB: IE11 does not support this stuff + if (xhr.responseURL && typeof(URL) !== "undefined") { + try { + var url = new URL(xhr.responseURL); + return url.pathname + url.search; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:badResponseUrl", {url: xhr.responseURL}); + } + } + } + + function hasHeader(xhr, regexp) { + return xhr.getAllResponseHeaders().match(regexp); + } + + function ajaxHelper(verb, path, context) { + verb = verb.toLowerCase(); + if (context) { + if (context instanceof Element || isType(context, 'String')) { + return issueAjaxRequest(verb, path, null, null, { + targetOverride: resolveTarget(context), + returnPromise: true + }); + } else { + return issueAjaxRequest(verb, path, resolveTarget(context.source), context.event, + { + handler : context.handler, + headers : context.headers, + values : context.values, + targetOverride: resolveTarget(context.target), + swapOverride: context.swap, + returnPromise: true + }); + } + } else { + return issueAjaxRequest(verb, path, null, null, { + returnPromise: true + }); + } + } + + function hierarchyForElt(elt) { + var arr = []; + while (elt) { + arr.push(elt); + elt = elt.parentElement; + } + return arr; + } + + function issueAjaxRequest(verb, path, elt, event, etc, confirmed) { + var resolve = null; + var reject = null; + etc = etc != null ? etc : {}; + if(etc.returnPromise && typeof Promise !== "undefined"){ + var promise = new Promise(function (_resolve, _reject) { + resolve = _resolve; + reject = _reject; + }); + } + if(elt == null) { + elt = getDocument().body; + } + var responseHandler = etc.handler || handleAjaxResponse; + + if (!bodyContains(elt)) { + return; // do not issue requests for elements removed from the DOM + } + var target = etc.targetOverride || getTarget(elt); + if (target == null || target == DUMMY_ELT) { + triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")}); + return; + } + + // allow event-based confirmation w/ a callback + if (!confirmed) { + var issueRequest = function() { + return issueAjaxRequest(verb, path, elt, event, etc, true); + } + var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest}; + if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) { + return; + } + } + + var syncElt = elt; + var eltData = getInternalData(elt); + var syncStrategy = getClosestAttributeValue(elt, "hx-sync"); + var queueStrategy = null; + var abortable = false; + if (syncStrategy) { + var syncStrings = syncStrategy.split(":"); + var selector = syncStrings[0].trim(); + if (selector === "this") { + syncElt = findThisElement(elt, 'hx-sync'); + } else { + syncElt = querySelectorExt(elt, selector); + } + // default to the drop strategy + syncStrategy = (syncStrings[1] || 'drop').trim(); + eltData = getInternalData(syncElt); + if (syncStrategy === "drop" && eltData.xhr && eltData.abortable !== true) { + return; + } else if (syncStrategy === "abort") { + if (eltData.xhr) { + return; + } else { + abortable = true; + } + } else if (syncStrategy === "replace") { + triggerEvent(syncElt, 'htmx:abort'); // abort the current request and continue + } else if (syncStrategy.indexOf("queue") === 0) { + var queueStrArray = syncStrategy.split(" "); + queueStrategy = (queueStrArray[1] || "last").trim(); + } + } + + if (eltData.xhr) { + if (eltData.abortable) { + triggerEvent(syncElt, 'htmx:abort'); // abort the current request and continue + } else { + if(queueStrategy == null){ + if (event) { + var eventData = getInternalData(event); + if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) { + queueStrategy = eventData.triggerSpec.queue; + } + } + if (queueStrategy == null) { + queueStrategy = "last"; + } + } + if (eltData.queuedRequests == null) { + eltData.queuedRequests = []; + } + if (queueStrategy === "first" && eltData.queuedRequests.length === 0) { + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } else if (queueStrategy === "all") { + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } else if (queueStrategy === "last") { + eltData.queuedRequests = []; // dump existing queue + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } + return; + } + } + + var xhr = new XMLHttpRequest(); + eltData.xhr = xhr; + eltData.abortable = abortable; + var endRequestLock = function(){ + eltData.xhr = null; + eltData.abortable = false; + if (eltData.queuedRequests != null && + eltData.queuedRequests.length > 0) { + var queuedRequest = eltData.queuedRequests.shift(); + queuedRequest(); + } + } + var promptQuestion = getClosestAttributeValue(elt, "hx-prompt"); + if (promptQuestion) { + var promptResponse = prompt(promptQuestion); + // prompt returns null if cancelled and empty string if accepted with no entry + if (promptResponse === null || + !triggerEvent(elt, 'htmx:prompt', {prompt: promptResponse, target:target})) { + maybeCall(resolve); + endRequestLock(); + return promise; + } + } + + var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); + if (confirmQuestion) { + if(!confirm(confirmQuestion)) { + maybeCall(resolve); + endRequestLock() + return promise; + } + } + + + var headers = getHeaders(elt, target, promptResponse); + if (etc.headers) { + headers = mergeObjects(headers, etc.headers); + } + var results = getInputValues(elt, verb); + var errors = results.errors; + var rawParameters = results.values; + if (etc.values) { + rawParameters = mergeObjects(rawParameters, etc.values); + } + var expressionVars = getExpressionVars(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); + + if (verb !== 'get' && !usesFormData(elt)) { + headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + if (htmx.config.getCacheBusterParam && verb === 'get') { + filteredParameters['org.htmx.cache-buster'] = getRawAttribute(target, "id") || "true"; + } + + // behavior of anchors w/ empty href is to use the current URL + if (path == null || path === "") { + path = getDocument().location.href; + } + + + var requestAttrValues = getValuesForElement(elt, 'hx-request'); + + var eltIsBoosted = getInternalData(elt).boosted; + var requestConfig = { + boosted: eltIsBoosted, + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers:headers, + target:target, + verb:verb, + errors:errors, + withCredentials: etc.credentials || requestAttrValues.credentials || htmx.config.withCredentials, + timeout: etc.timeout || requestAttrValues.timeout || htmx.config.timeout, + path:path, + triggeringEvent:event + }; + + if(!triggerEvent(elt, 'htmx:configRequest', requestConfig)){ + maybeCall(resolve); + endRequestLock(); + return promise; + } + + // copy out in case the object was overwritten + path = requestConfig.path; + verb = requestConfig.verb; + headers = requestConfig.headers; + filteredParameters = requestConfig.parameters; + errors = requestConfig.errors; + + if(errors && errors.length > 0){ + triggerEvent(elt, 'htmx:validation:halted', requestConfig) + maybeCall(resolve); + endRequestLock(); + return promise; + } + + var splitPath = path.split("#"); + var pathNoAnchor = splitPath[0]; + var anchor = splitPath[1]; + var finalPathForGet = null; + if (verb === 'get') { + finalPathForGet = pathNoAnchor; + var values = Object.keys(filteredParameters).length !== 0; + if (values) { + if (finalPathForGet.indexOf("?") < 0) { + finalPathForGet += "?"; + } else { + finalPathForGet += "&"; + } + finalPathForGet += urlEncode(filteredParameters); + if (anchor) { + finalPathForGet += "#" + anchor; + } + } + xhr.open('GET', finalPathForGet, true); + } else { + xhr.open(verb.toUpperCase(), path, true); + } + + xhr.overrideMimeType("text/html"); + xhr.withCredentials = requestConfig.withCredentials; + xhr.timeout = requestConfig.timeout; + + // request headers + if (requestAttrValues.noHeaders) { + // ignore all headers + } else { + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + safelySetHeaderValue(xhr, header, headerValue); + } + } + } + + var responseInfo = { + xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, + pathInfo: { + requestPath: path, + finalRequestPath: finalPathForGet || path, + anchor: anchor + } + }; + + xhr.onload = function () { + try { + var hierarchy = hierarchyForElt(elt); + responseInfo.pathInfo.responsePath = getPathFromResponse(xhr); + responseHandler(elt, responseInfo); + removeRequestIndicatorClasses(indicators); + triggerEvent(elt, 'htmx:afterRequest', responseInfo); + triggerEvent(elt, 'htmx:afterOnLoad', responseInfo); + // if the body no longer contains the element, trigger the event on the closest parent + // remaining in the DOM + if (!bodyContains(elt)) { + var secondaryTriggerElt = null; + while (hierarchy.length > 0 && secondaryTriggerElt == null) { + var parentEltInHierarchy = hierarchy.shift(); + if (bodyContains(parentEltInHierarchy)) { + secondaryTriggerElt = parentEltInHierarchy; + } + } + if (secondaryTriggerElt) { + triggerEvent(secondaryTriggerElt, 'htmx:afterRequest', responseInfo); + triggerEvent(secondaryTriggerElt, 'htmx:afterOnLoad', responseInfo); + } + } + maybeCall(resolve); + endRequestLock(); + } catch (e) { + triggerErrorEvent(elt, 'htmx:onLoadError', mergeObjects({error:e}, responseInfo)); + throw e; + } + } + xhr.onerror = function () { + removeRequestIndicatorClasses(indicators); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:sendError', responseInfo); + maybeCall(reject); + endRequestLock(); + } + xhr.onabort = function() { + removeRequestIndicatorClasses(indicators); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo); + maybeCall(reject); + endRequestLock(); + } + xhr.ontimeout = function() { + removeRequestIndicatorClasses(indicators); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:timeout', responseInfo); + maybeCall(reject); + endRequestLock(); + } + if(!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)){ + maybeCall(resolve); + endRequestLock() + return promise + } + var indicators = addRequestIndicatorClasses(elt); + + forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) { + forEach([xhr, xhr.upload], function (target) { + target.addEventListener(eventName, function(event){ + triggerEvent(elt, "htmx:xhr:" + eventName, { + lengthComputable:event.lengthComputable, + loaded:event.loaded, + total:event.total + }); + }) + }); + }); + triggerEvent(elt, 'htmx:beforeSend', responseInfo); + xhr.send(verb === 'get' ? null : encodeParamsForBody(xhr, elt, filteredParameters)); + return promise; + } + + function determineHistoryUpdates(elt, responseInfo) { + + var xhr = responseInfo.xhr; + + //=========================================== + // First consult response headers + //=========================================== + var pathFromHeaders = null; + var typeFromHeaders = null; + if (hasHeader(xhr,/HX-Push:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Push"); + typeFromHeaders = "push"; + } else if (hasHeader(xhr,/HX-Push-Url:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Push-Url"); + typeFromHeaders = "push"; + } else if (hasHeader(xhr,/HX-Replace-Url:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Replace-Url"); + typeFromHeaders = "replace"; + } + + // if there was a response header, that has priority + if (pathFromHeaders) { + if (pathFromHeaders === "false") { + return {} + } else { + return { + type: typeFromHeaders, + path : pathFromHeaders + } + } + } + + //=========================================== + // Next resolve via DOM values + //=========================================== + var requestPath = responseInfo.pathInfo.finalRequestPath; + var responsePath = responseInfo.pathInfo.responsePath; + + var pushUrl = getClosestAttributeValue(elt, "hx-push-url"); + var replaceUrl = getClosestAttributeValue(elt, "hx-replace-url"); + var elementIsBoosted = getInternalData(elt).boosted; + + var saveType = null; + var path = null; + + if (pushUrl) { + saveType = "push"; + path = pushUrl; + } else if (replaceUrl) { + saveType = "replace"; + path = replaceUrl; + } else if (elementIsBoosted) { + saveType = "push"; + path = responsePath || requestPath; // if there is no response path, go with the original request path + } + + if (path) { + // false indicates no push, return empty object + if (path === "false") { + return {}; + } + + // true indicates we want to follow wherever the server ended up sending us + if (path === "true") { + path = responsePath || requestPath; // if there is no response path, go with the original request path + } + + // restore any anchor associated with the request + if (responseInfo.pathInfo.anchor && + path.indexOf("#") === -1) { + path = path + "#" + responseInfo.pathInfo.anchor; + } + + return { + type:saveType, + path: path + } + } else { + return {}; + } + } + + function handleAjaxResponse(elt, responseInfo) { + var xhr = responseInfo.xhr; + var target = responseInfo.target; + var etc = responseInfo.etc; + + if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return; + + if (hasHeader(xhr, /HX-Trigger:/i)) { + handleTrigger(xhr, "HX-Trigger", elt); + } + + if (hasHeader(xhr, /HX-Location:/i)) { + saveCurrentPageToHistory(); + var redirectPath = xhr.getResponseHeader("HX-Location"); + var swapSpec; + if (redirectPath.indexOf("{") === 0) { + swapSpec = parseJSON(redirectPath); + // what's the best way to throw an error if the user didn't include this + redirectPath = swapSpec['path']; + delete swapSpec['path']; + } + ajaxHelper('GET', redirectPath, swapSpec).then(function(){ + pushUrlIntoHistory(redirectPath); + }); + return; + } + + if (hasHeader(xhr, /HX-Redirect:/i)) { + location.href = xhr.getResponseHeader("HX-Redirect"); + return; + } + + if (hasHeader(xhr,/HX-Refresh:/i)) { + if ("true" === xhr.getResponseHeader("HX-Refresh")) { + location.reload(); + return; + } + } + + if (hasHeader(xhr,/HX-Retarget:/i)) { + responseInfo.target = getDocument().querySelector(xhr.getResponseHeader("HX-Retarget")); + } + + var historyUpdate = determineHistoryUpdates(elt, responseInfo); + + // by default htmx only swaps on 200 return codes and does not swap + // on 204 'No Content' + // this can be ovverriden by responding to the htmx:beforeSwap event and + // overriding the detail.shouldSwap property + var shouldSwap = xhr.status >= 200 && xhr.status < 400 && xhr.status !== 204; + var serverResponse = xhr.response; + var isError = xhr.status >= 400; + var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError}, responseInfo); + if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return; + + target = beforeSwapDetails.target; // allow re-targeting + serverResponse = beforeSwapDetails.serverResponse; // allow updating content + isError = beforeSwapDetails.isError; // allow updating error + + responseInfo.target = target; // Make updated target available to response events + responseInfo.failed = isError; // Make failed property available to response events + responseInfo.successful = !isError; // Make successful property available to response events + + if (beforeSwapDetails.shouldSwap) { + if (xhr.status === 286) { + cancelPolling(elt); + } + + withExtensions(elt, function (extension) { + serverResponse = extension.transformResponse(serverResponse, xhr, elt); + }); + + // Save current page if there will be a history update + if (historyUpdate.type) { + saveCurrentPageToHistory(); + } + + var swapOverride = etc.swapOverride; + if (hasHeader(xhr,/HX-Reswap:/i)) { + swapOverride = xhr.getResponseHeader("HX-Reswap"); + } + var swapSpec = getSwapSpecification(elt, swapOverride); + + target.classList.add(htmx.config.swappingClass); + + // optional transition API promise callbacks + var settleResolve = null; + var settleReject = null; + + var doSwap = function () { + try { + var activeElt = document.activeElement; + var selectionInfo = {}; + try { + selectionInfo = { + elt: activeElt, + // @ts-ignore + start: activeElt ? activeElt.selectionStart : null, + // @ts-ignore + end: activeElt ? activeElt.selectionEnd : null + }; + } catch (e) { + // safari issue - see https://github.com/microsoft/playwright/issues/5894 + } + + var settleInfo = makeSettleInfo(target); + selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo); + + if (selectionInfo.elt && + !bodyContains(selectionInfo.elt) && + selectionInfo.elt.id) { + var newActiveElt = document.getElementById(selectionInfo.elt.id); + var focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll }; + if (newActiveElt) { + // @ts-ignore + if (selectionInfo.start && newActiveElt.setSelectionRange) { + // @ts-ignore + try { + newActiveElt.setSelectionRange(selectionInfo.start, selectionInfo.end); + } catch (e) { + // the setSelectionRange method is present on fields that don't support it, so just let this fail + } + } + newActiveElt.focus(focusOptions); + } + } + + target.classList.remove(htmx.config.swappingClass); + forEach(settleInfo.elts, function (elt) { + if (elt.classList) { + elt.classList.add(htmx.config.settlingClass); + } + triggerEvent(elt, 'htmx:afterSwap', responseInfo); + }); + + if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) { + var finalElt = elt; + if (!bodyContains(elt)) { + finalElt = getDocument().body; + } + handleTrigger(xhr, "HX-Trigger-After-Swap", finalElt); + } + + var doSettle = function () { + forEach(settleInfo.tasks, function (task) { + task.call(); + }); + forEach(settleInfo.elts, function (elt) { + if (elt.classList) { + elt.classList.remove(htmx.config.settlingClass); + } + triggerEvent(elt, 'htmx:afterSettle', responseInfo); + }); + + // if we need to save history, do so + if (historyUpdate.type) { + if (historyUpdate.type === "push") { + pushUrlIntoHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); + } else { + replaceUrlInHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); + } + } + if (responseInfo.pathInfo.anchor) { + var anchorTarget = find("#" + responseInfo.pathInfo.anchor); + if(anchorTarget) { + anchorTarget.scrollIntoView({block:'start', behavior: "auto"}); + } + } + + if(settleInfo.title) { + var titleElt = find("title"); + if(titleElt) { + titleElt.innerHTML = settleInfo.title; + } else { + window.document.title = settleInfo.title; + } + } + + updateScrollState(settleInfo.elts, swapSpec); + + if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) { + var finalElt = elt; + if (!bodyContains(elt)) { + finalElt = getDocument().body; + } + handleTrigger(xhr, "HX-Trigger-After-Settle", finalElt); + } + maybeCall(settleResolve); + } + + if (swapSpec.settleDelay > 0) { + setTimeout(doSettle, swapSpec.settleDelay) + } else { + doSettle(); + } + } catch (e) { + triggerErrorEvent(elt, 'htmx:swapError', responseInfo); + maybeCall(settleReject); + throw e; + } + }; + + var shouldTransition = htmx.config.globalViewTransitions + if(swapSpec.hasOwnProperty('transition')){ + shouldTransition = swapSpec.transition; + } + + if(shouldTransition && + triggerEvent(elt, 'htmx:beforeTransition', responseInfo) && + typeof Promise !== "undefined" && document.startViewTransition){ + var settlePromise = new Promise(function (_resolve, _reject) { + settleResolve = _resolve; + settleReject = _reject; + }); + // wrap the original doSwap() in a call to startViewTransition() + var innerDoSwap = doSwap; + doSwap = function() { + document.startViewTransition(function () { + innerDoSwap(); + return settlePromise; + }); + } + } + + + if (swapSpec.swapDelay > 0) { + setTimeout(doSwap, swapSpec.swapDelay) + } else { + doSwap(); + } + } + if (isError) { + triggerErrorEvent(elt, 'htmx:responseError', mergeObjects({error: "Response Status Error Code " + xhr.status + " from " + responseInfo.pathInfo.requestPath}, responseInfo)); + } + } + + //==================================================================== + // Extensions API + //==================================================================== + + /** @type {Object} */ + var extensions = {}; + + /** + * extensionBase defines the default functions for all extensions. + * @returns {import("./htmx").HtmxExtension} + */ + function extensionBase() { + return { + init: function(api) {return null;}, + onEvent : function(name, evt) {return true;}, + transformResponse : function(text, xhr, elt) {return text;}, + isInlineSwap : function(swapStyle) {return false;}, + handleSwap : function(swapStyle, target, fragment, settleInfo) {return false;}, + encodeParameters : function(xhr, parameters, elt) {return null;} + } + } + + /** + * defineExtension initializes the extension and adds it to the htmx registry + * + * @param {string} name + * @param {import("./htmx").HtmxExtension} extension + */ + function defineExtension(name, extension) { + if(extension.init) { + extension.init(internalAPI) + } + extensions[name] = mergeObjects(extensionBase(), extension); + } + + /** + * removeExtension removes an extension from the htmx registry + * + * @param {string} name + */ + function removeExtension(name) { + delete extensions[name]; + } + + /** + * getExtensions searches up the DOM tree to return all extensions that can be applied to a given element + * + * @param {HTMLElement} elt + * @param {import("./htmx").HtmxExtension[]=} extensionsToReturn + * @param {import("./htmx").HtmxExtension[]=} extensionsToIgnore + */ + function getExtensions(elt, extensionsToReturn, extensionsToIgnore) { + + if (elt == undefined) { + return extensionsToReturn; + } + if (extensionsToReturn == undefined) { + extensionsToReturn = []; + } + if (extensionsToIgnore == undefined) { + extensionsToIgnore = []; + } + var extensionsForElement = getAttributeValue(elt, "hx-ext"); + if (extensionsForElement) { + forEach(extensionsForElement.split(","), function(extensionName){ + extensionName = extensionName.replace(/ /g, ''); + if (extensionName.slice(0, 7) == "ignore:") { + extensionsToIgnore.push(extensionName.slice(7)); + return; + } + if (extensionsToIgnore.indexOf(extensionName) < 0) { + var extension = extensions[extensionName]; + if (extension && extensionsToReturn.indexOf(extension) < 0) { + extensionsToReturn.push(extension); + } + } + }); + } + return getExtensions(parentElt(elt), extensionsToReturn, extensionsToIgnore); + } + + //==================================================================== + // Initialization + //==================================================================== + + function ready(fn) { + if (getDocument().readyState !== 'loading') { + fn(); + } else { + getDocument().addEventListener('DOMContentLoaded', fn); + } + } + + function insertIndicatorStyles() { + if (htmx.config.includeIndicatorStyles !== false) { + getDocument().head.insertAdjacentHTML("beforeend", + ""); + } + } + + function getMetaConfig() { + var element = getDocument().querySelector('meta[name="htmx-config"]'); + if (element) { + // @ts-ignore + return parseJSON(element.content); + } else { + return null; + } + } + + function mergeMetaConfig() { + var metaConfig = getMetaConfig(); + if (metaConfig) { + htmx.config = mergeObjects(htmx.config , metaConfig) + } + } + + // initialize the document + ready(function () { + mergeMetaConfig(); + insertIndicatorStyles(); + var body = getDocument().body; + processNode(body); + var restoredElts = getDocument().querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']" + ); + body.addEventListener("htmx:abort", function (evt) { + var target = evt.target; + var internalData = getInternalData(target); + if (internalData && internalData.xhr) { + internalData.xhr.abort(); + } + }); + var originalPopstate = window.onpopstate; + window.onpopstate = function (event) { + if (event.state && event.state.htmx) { + restoreHistory(); + forEach(restoredElts, function(elt){ + triggerEvent(elt, 'htmx:restored', { + 'document': getDocument(), + 'triggerEvent': triggerEvent + }); + }); + } else { + if (originalPopstate) { + originalPopstate(event); + } + } + }; + setTimeout(function () { + triggerEvent(body, 'htmx:load', {}); // give ready handlers a chance to load up before firing this event + body = null; // kill reference for gc + }, 0); + }) + + return htmx; + } +)() +})); diff --git a/www/static/test/1.9.2/src/htmx.test.ts b/www/static/test/1.9.2/src/htmx.test.ts new file mode 100644 index 000000000..71ed2d2b3 --- /dev/null +++ b/www/static/test/1.9.2/src/htmx.test.ts @@ -0,0 +1,96 @@ +import htmx from "./htmx"; + +// add the class 'myClass' to the element with the id 'demo' +htmx.addClass(htmx.find("#demo"), "myClass"); + +// issue a GET to /example and put the response HTML into #myDiv +htmx.ajax("GET", "/example", "#myDiv"); + +// find the closest enclosing div of the element with the id 'demo' +htmx.closest(htmx.find("#demo"), "div"); + +// update the history cache size to 30 +htmx.config.historyCacheSize = 30; + +// override SSE event sources to not use credentials +htmx.createEventSource = function (url) { + return new EventSource(url, { withCredentials: false }); +}; + +// override WebSocket to use a specific protocol +htmx.createWebSocket = function (url) { + return new WebSocket(url, ["wss"]); +}; + +// defines a silly extension that just logs the name of all events triggered +htmx.defineExtension("silly", { + onEvent: function (name, evt) { + console.log("Event " + name + " was triggered!"); + } +}); + +// find div with id my-div +var div = htmx.find("#my-div"); + +// find div with id another-div within that div +var anotherDiv = htmx.find(div, "#another-div"); + +// find all divs +var allDivs = htmx.findAll("div"); + +// find all paragraphs within a given div +var allParagraphsInMyDiv = htmx.findAll(htmx.find("#my-div"), "p"); + +htmx.logAll(); + +// remove this click listener from the body +htmx.off("click", myEventListener); + +// remove this click listener from the given div +htmx.off("#my-div", "click", myEventListener); + +// add a click listener to the body +var myEventListener = htmx.on("click", function (evt) { + console.log(evt); +}); + +// add a click listener to the given div +var myEventListener = htmx.on("#my-div", "click", function (evt) { + console.log(evt); +}); + +const MyLibrary: any = null; + +htmx.onLoad(function (elt) { + MyLibrary.init(elt); +}); + +// returns 3000 +var milliseconds = htmx.parseInterval("3s"); + +// returns 3 - Caution +var milliseconds = htmx.parseInterval("3m"); + +document.body.innerHTML = "
    Get it!
    "; +// process the newly added content +htmx.process(document.body); + +// removes my-div from the DOM +htmx.remove(htmx.find("#my-div")); + +// removes .myClass from my-div +htmx.removeClass(htmx.find("#my-div"), "myClass"); + +htmx.removeExtension("my-extension"); + +// takes the selected class from tab2"s siblings +htmx.takeClass(htmx.find("#tab2"), "selected"); + +// toggles the selected class on tab2 +htmx.toggleClass(htmx.find("#tab2"), "selected"); + +// triggers the myEvent event on #tab2 with the answer 42 +htmx.trigger(htmx.find("#tab2"), "myEvent", { answer: 42 }); + +// gets the values associated with this form +var values = htmx.values(htmx.find("#myForm")); diff --git a/www/static/test/1.9.2/test/attributes/hx-boost.js b/www/static/test/1.9.2/test/attributes/hx-boost.js new file mode 100644 index 000000000..96000f28e --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-boost.js @@ -0,0 +1,102 @@ +describe("hx-boost attribute", function() { + + htmx.logAll(); + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('handles basic anchor properly', function () { + this.server.respondWith("GET", "/test", "Boosted"); + var div = make(''); + var a = byId('a1'); + a.click(); + this.server.respond(); + div.innerHTML.should.equal("Boosted"); + }) + + + it('handles basic form post properly', function () { + this.server.respondWith("POST", "/test", "Boosted"); + var div = make('
    '); + var btn = byId('b1'); + btn.click(); + this.server.respond(); + div.innerHTML.should.equal("Boosted"); + }) + + it('handles basic form post properly w/ explicit action', function () { + this.server.respondWith("POST", "/test", "Boosted"); + var div = make('
    '); + var form = byId('f1'); + form.click(); + this.server.respond(); + div.innerHTML.should.equal("Boosted"); + }) + + it('handles basic form get properly', function () { + this.server.respondWith("GET", "/test", "Boosted"); + var div = make('
    '); + var btn = byId('b1'); + btn.click(); + this.server.respond(); + div.innerHTML.should.equal("Boosted"); + }) + + it('handles basic form with no explicit method property', function () { + this.server.respondWith("GET", "/test", "Boosted"); + var div = make('
    '); + var btn = byId('b1'); + btn.click(); + this.server.respond(); + div.innerHTML.should.equal("Boosted"); + }) + + it('handles basic anchor properly w/ data-* prefix', function () { + this.server.respondWith("GET", "/test", "Boosted"); + var div = make(''); + var a = byId('a1'); + a.click(); + this.server.respond(); + div.innerHTML.should.equal("Boosted"); + }) + + + it('overriding default swap style does not effect boosting', function () { + htmx.config.defaultSwapStyle = "afterend"; + try { + this.server.respondWith("GET", "/test", "Boosted"); + var a = make('Foo'); + a.click(); + this.server.respond(); + a.innerHTML.should.equal("Boosted"); + } finally { + htmx.config.defaultSwapStyle = "innerHTML"; + } + }) + + it('anchors w/ explicit targets are not boosted', function () { + var a = make('Foo'); + var internalData = htmx._("getInternalData")(a); + should.equal(undefined, internalData.boosted); + }) + + it('includes an HX-Boosted Header', function() + { + this.server.respondWith("GET", "/test", function(xhr){ + should.equal(xhr.requestHeaders['HX-Boosted'], "true"); + xhr.respond(200, {}, "Boosted!"); + }); + + var btn = make('Click Me!') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Boosted!"); + }); + +}); + diff --git a/www/static/test/1.9.2/test/attributes/hx-delete.js b/www/static/test/1.9.2/test/attributes/hx-delete.js new file mode 100644 index 000000000..22b0f7607 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-delete.js @@ -0,0 +1,34 @@ +describe("hx-delete attribute", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('issues a DELETE request', function() + { + this.server.respondWith("DELETE", "/test", function(xhr){ + xhr.respond(200, {}, "Deleted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Deleted!"); + }); + + it('issues a DELETE request w/ data-* prefix', function() + { + this.server.respondWith("DELETE", "/test", function(xhr){ + xhr.respond(200, {}, "Deleted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Deleted!"); + }); +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-disinherit.js b/www/static/test/1.9.2/test/attributes/hx-disinherit.js new file mode 100644 index 000000000..f069a8335 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-disinherit.js @@ -0,0 +1,143 @@ +describe("hx-disinherit attribute", function() { + + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic inheritance sanity-check', function () { + var response_inner = '
    Hello world
    ' + var response = '
    ' + response_inner + '
    ' + this.server.respondWith("GET", "/test", response); + + var div = make('
    ') + var btn = byId("bx1"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal(response_inner); + }) + + + it('disinherit exclude single attribute', function () { + var response_inner = '
    Hello world
    ' + var response = '
    ' + response_inner + '
    ' + this.server.respondWith("GET", "/test", response); + + var div = make('
    ') + var btn = byId("bx1"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal(response + 'Click Me!'); + }); + + it('disinherit exclude multiple attributes', function () { + var response_inner = '
    Hello world
    ' + var response = '
    ' + response_inner + '
    ' + this.server.respondWith("GET", "/test", response); + + var div = make('
    ' + + ' ' + + '
    ') + var btn = byId("bx1"); + btn.click(); + this.server.respond(); + console.log(btn.innerHTML); + console.log(response); + btn.innerHTML.should.equal('' + response + ''); + }); + + it('disinherit exclude all attributes', function () { + var response_inner = '
    Hello world
    ' + var response = '
    ' + response_inner + '
    ' + this.server.respondWith("GET", "/test", response); + var div = make('
    ' + + ' ' + + '
    ') + var btn = byId("bx1"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal(response); + }); + + it('same-element inheritance disable', function () { + var response_inner = '
    Hello world
    ' + var response = '
    ' + response_inner + '
    ' + this.server.respondWith("GET", "/test", response); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal(response_inner); + }); + + it('same-element inheritance disable with child nodes', function () { + var response_inner = '
    Hello world
    ' + var response = '
    ' + response_inner + '
    ' + this.server.respondWith("GET", "/test", response); + this.server.respondWith("GET", "/test2", 'unique-snowflake'); + + var div = make('
    ') + var btn = byId("bx1"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal('
    unique-snowflake
    '); + var count = (div.parentElement.innerHTML.match(/snowflake/g) || []).length; + count.should.equal(2); // hx-select of parent div and newly loaded inner content + }); + + it('boosted element hx-disinherit sanity check', function () { + try { + var request; + var handler = htmx.on("htmx:beforeRequest", function (evt) { + request = evt; + }); + var div = make(''); + var link = byId("a1"); + link.click(); + // should match the fully resolved href of the boosted element + should.equal(request.detail.requestConfig.path, request.detail.elt.href); + should.equal(request.detail.elt["htmx-internal-data"].boosted, true); + } finally { + htmx.off("htmx:beforeRequest", handler); + } + }); + + it('boosted element inheritance manual unset', function () { + try { + var request; + var handler = htmx.on("htmx:beforeRequest", function (evt) { + request = evt; + }); + var div = make(''); + var link = byId("a1"); + should.equal(link["htmx-internal-data"].boosted, undefined); + } finally { + htmx.off("htmx:beforeRequest", handler); + } + }); + + it('nested htmx-node with boosting parent', function () { + try { + var request; + var handler = htmx.on("htmx:beforeRequest", function (evt) { + request = evt; + }); + var div = make(''); + var link = byId("a1"); + link.click(); + should.equal(request.detail.requestConfig.path, '/test2'); + should.equal(request.detail.elt["htmx-internal-data"].boosted, undefined); + should.equal(request.detail.target.id, "a1"); + } finally { + htmx.off("htmx:beforeRequest", handler); + } + }); + +}); + diff --git a/www/static/test/1.9.2/test/attributes/hx-ext.js b/www/static/test/1.9.2/test/attributes/hx-ext.js new file mode 100644 index 000000000..740b9bd8b --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-ext.js @@ -0,0 +1,138 @@ +describe("hx-ext attribute", function() { + + var ext1Calls, ext2Calls, ext3Calls, ext4Calls; + + beforeEach(function () { + ext1Calls = ext2Calls = ext3Calls = ext4Calls = 0; + this.server = makeServer(); + clearWorkArea(); + htmx.defineExtension("ext-1", { + onEvent : function(name, evt) { + if(name === "htmx:afterRequest"){ + ext1Calls++; + } + } + }); + htmx.defineExtension("ext-2", { + onEvent : function(name, evt) { + if(name === "htmx:afterRequest"){ + ext2Calls++; + } + } + }); + htmx.defineExtension("ext-3", { + onEvent : function(name, evt) { + if(name === "htmx:afterRequest"){ + ext3Calls++; + } + } + }); + htmx.defineExtension("ext-4", { + onEvent : function(name, evt) { + if(name === "namespace:example"){ + ext4Calls++; + } + } + }); + }); + + afterEach(function () { + this.server.restore(); + clearWorkArea(); + htmx.removeExtension("ext-1"); + htmx.removeExtension("ext-2"); + htmx.removeExtension("ext-3"); + }); + + it('A simple extension is invoked properly', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make('') + btn.click(); + this.server.respond(); + ext1Calls.should.equal(1); + ext2Calls.should.equal(0); + ext3Calls.should.equal(0); + }); + + it('Extensions are merged properly', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + make('
    ' + + '
    ') + var btn1 = byId("btn-1"); + var btn2 = byId("btn-2"); + + btn1.click(); + this.server.respond(); + ext1Calls.should.equal(1); + ext2Calls.should.equal(1); + ext3Calls.should.equal(0); + + btn2.click(); + this.server.respond(); + ext1Calls.should.equal(2); + ext2Calls.should.equal(1); + ext3Calls.should.equal(1); + }); + + it('supports comma separated lists', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + make('
    ') + var btn1 = byId("btn-1"); + var btn2 = byId("btn-2"); + + btn1.click(); + this.server.respond(); + ext1Calls.should.equal(1); + ext2Calls.should.equal(1); + ext3Calls.should.equal(1); + }); + + it('A simple extension is invoked properly w/ data-* prefix', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make('') + btn.click(); + this.server.respond(); + ext1Calls.should.equal(1); + ext2Calls.should.equal(0); + ext3Calls.should.equal(0); + }); + + it('A simple extension is invoked properly when an HX-Trigger event w/ a namespace fires', function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger":"namespace:example"}, ""]); + var btn = make('') + btn.click(); + this.server.respond(); + ext1Calls.should.equal(0); + ext2Calls.should.equal(0); + ext3Calls.should.equal(0); + ext4Calls.should.equal(1); + + }); + + it('Extensions are ignored properly', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + make('
    ' + + '
    ') + + var btn1 = byId("btn-AA"); + var btn2 = byId("btn-BB"); + + btn1.click(); + this.server.respond(); + ext1Calls.should.equal(1); + ext2Calls.should.equal(1); + ext3Calls.should.equal(0); + + btn2.click(); + this.server.respond(); + ext1Calls.should.equal(1); + ext2Calls.should.equal(2); + ext3Calls.should.equal(0); + }) + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/attributes/hx-get.js b/www/static/test/1.9.2/test/attributes/hx-get.js new file mode 100644 index 000000000..8b0a6db9a --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-get.js @@ -0,0 +1,129 @@ +describe("hx-get attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('issues a GET request on click and swaps content', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('GET does not include surrounding data by default', function () { + this.server.respondWith("GET", "/test", function (xhr) { + should.equal(getParameters(xhr)["i1"], undefined); + xhr.respond(200, {}, "Clicked!"); + }); + make('
    ') + var btn = byId("b1"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('GET on form includes its own data by default', function () { + this.server.respondWith("GET", /\/test.*/, function (xhr) { + getParameters(xhr)["i1"].should.equal("value"); + xhr.respond(200, {}, "Clicked!"); + }); + var form = make('
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('GET on form with existing parameters works properly', function () { + this.server.respondWith("GET", /\/test.*/, function (xhr) { + getParameters(xhr)["foo"].should.equal("bar"); + getParameters(xhr)["i1"].should.equal("value"); + xhr.respond(200, {}, "Clicked!"); + }); + var form = make('
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('GET on form with anchor works properly', function () { + this.server.respondWith("GET", /\/test.*/, function (xhr) { + getParameters(xhr)["foo"].should.equal("bar"); + getParameters(xhr)["i1"].should.equal("value"); + xhr.respond(200, {}, "Clicked!"); + }); + var form = make('
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + + it('issues a GET request on click and swaps content w/ data-* prefix', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('does not include a cache-busting parameter when not enabled', function () { + + this.server.respondWith("GET", /\/test.*/, function (xhr) { + should.not.exist(getParameters(xhr)["org.htmx.cache-buster"]); + xhr.respond(200, {}, "Clicked!"); + }); + + try { + htmx.config.getCacheBusterParam = false; + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + } finally { + htmx.config.getCacheBusterParam = false; + } + }); + + it('includes a cache-busting parameter when enabled w/ value "true" if no id on target', function () { + + this.server.respondWith("GET", /\/test.*/, function (xhr) { + getParameters(xhr)["org.htmx.cache-buster"].should.equal("true"); + xhr.respond(200, {}, "Clicked!"); + }); + + try { + htmx.config.getCacheBusterParam = true; + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + } finally { + htmx.config.getCacheBusterParam = false; + } + }); + + it('includes a cache-busting parameter when enabled w/ the id of the target if there is one', function () { + this.server.respondWith("GET", /\/test.*/, function (xhr) { + getParameters(xhr)["org.htmx.cache-buster"].should.equal("foo"); + xhr.respond(200, {}, "Clicked!"); + }); + + try { + htmx.config.getCacheBusterParam = true; + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + } finally { + htmx.config.getCacheBusterParam = false; + } + }); +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/attributes/hx-headers.js b/www/static/test/1.9.2/test/attributes/hx-headers.js new file mode 100644 index 000000000..0333533ca --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-headers.js @@ -0,0 +1,164 @@ +describe("hx-headers attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic hx-headers works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-headers works with braces', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-headers works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['v1'].should.equal("test"); + xhr.requestHeaders['v2'].should.equal("42"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers can be on parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make("
    "); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers can override parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + make("
    "); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers overrides inputs', function () { + this.server.respondWith("POST", "/include", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-headers javascript: works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers works with braces', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-headers works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['v1'].should.equal("test"); + xhr.requestHeaders['v2'].should.equal("42"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers can be on parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ') + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers can override parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ') + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-headers overrides inputs', function () { + this.server.respondWith("POST", "/include", function (xhr) { + + xhr.requestHeaders['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/attributes/hx-history.js b/www/static/test/1.9.2/test/attributes/hx-history.js new file mode 100644 index 000000000..cb076ba8f --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-history.js @@ -0,0 +1,46 @@ +describe("hx-history attribute", function() { + + var HTMX_HISTORY_CACHE_NAME = "htmx-history-cache"; + + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); + }); + + it("history cache should not contain embargoed content", function () { + this.server.respondWith("GET", "/test1", '
    test1
    '); + this.server.respondWith("GET", "/test2", '
    test2
    '); + this.server.respondWith("GET", "/test3", '
    test3
    '); + + make('
    init
    '); + + byId("d1").click(); + this.server.respond(); + var workArea = getWorkArea(); + workArea.textContent.should.equal("test1"); + + byId("d2").click(); + this.server.respond(); + workArea.textContent.should.equal("test2"); + + byId("d3").click(); + this.server.respond(); + workArea.textContent.should.equal("test3"); + + // embargoed content should NOT be in the localStorage cache + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(2); + + // on history navigation, embargoed content is retrieved from server + htmx._('restoreHistory')("/test2"); + this.server.respond(); + getWorkArea().textContent.should.equal("test2"); + }); + +}); diff --git a/www/static/test/1.9.2/test/attributes/hx-include.js b/www/static/test/1.9.2/test/attributes/hx-include.js new file mode 100644 index 000000000..0a7d10525 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-include.js @@ -0,0 +1,228 @@ +describe("hx-include attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('By default an input includes itself', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('non-GET includes closest form', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("d1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('non-GET includes closest form and overrides values included that exist outside the form', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ' + + '' + + '
    ' + + '') + var input = byId("d1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('GET does not include closest form by default', function () { + this.server.respondWith("GET", "/include", function (xhr) { + var params = getParameters(xhr); + should.equal(params['i1'], undefined); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("d1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('Single input not included twice when in form', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('Two inputs are included twice when they have the same name', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.deep.equal(["test", "test2"]); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ' + + '' + + '' + + '
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('Two inputs are included twice when in form when they have the same name', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.deep.equal(["test", "test2"]); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ' + + '' + + '' + + '
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('Input not included twice when it explicitly refers to parent form', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ' + + '' + + '
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('Input can be referred to externally', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make(''); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('Two inputs can be referred to externally', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + params['i2'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make(''); + make(''); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('A form can be referred to externally', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + params['i2'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ' + + '' + + '' + + '
    '); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('By default an input includes itself w/ data-* prefix', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('If the element is not includeable, its descendant inputs are included', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + params['i2'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    '); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }) + + it('The `closest` modifier can be used in the hx-include selector', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + params['i2'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    '+ + '
    '); + var btn = byId('btn') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }) + + it('The `this` modifier can be used in the hx-include selector', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + params['i2'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    '+ + '
    '); + var btn = byId('btn') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }) + +}); diff --git a/www/static/test/1.9.2/test/attributes/hx-indicator.js b/www/static/test/1.9.2/test/attributes/hx-indicator.js new file mode 100644 index 000000000..94156f74f --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-indicator.js @@ -0,0 +1,137 @@ +describe("hx-indicator attribute", function(){ + beforeEach(function() { + this.server = sinon.fakeServer.create(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('Indicator classes are properly put on element with no explicit indicator', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + btn.click(); + btn.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + btn.classList.contains("htmx-request").should.equal(false); + }); + + it('Indicator classes are properly put on element with explicit indicator', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var a1 = make('') + var a2 = make('') + btn.click(); + btn.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(true); + a2.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + btn.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(false); + a2.classList.contains("htmx-request").should.equal(false); + }); + + it('Indicator classes are properly put on element with relative indicator', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var a1 = make('') + btn.click(); + btn.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + btn.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(false); + }); + + it('Indicator classes are properly put on element with explicit indicator w/ data-* prefix', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var a1 = make('') + var a2 = make('') + btn.click(); + btn.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(true); + a2.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + btn.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(false); + a2.classList.contains("htmx-request").should.equal(false); + }); + + it('allows closest syntax in hx-indicator', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div = make('
    ') + var btn = byId("b1"); + btn.click(); + btn.classList.contains("htmx-request").should.equal(false); + div.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + btn.classList.contains("htmx-request").should.equal(false); + div.classList.contains("htmx-request").should.equal(false); + }); + + it('is removed when initiating element is removed from the DOM', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var indicator = make('
    Indicator
    ') + var div = make('
    ') + var btn = byId("b1"); + btn.click(); + indicator.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + indicator.classList.contains("htmx-request").should.equal(false); + }); + + it('allows this syntax in hx-indicator', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div = make('
    ') + var btn = byId("b1"); + btn.click(); + btn.classList.contains("htmx-request").should.equal(false); + div.classList.contains("htmx-request").should.equal(true); + this.server.respond(); + btn.classList.contains("htmx-request").should.equal(false); + div.classList.contains("htmx-request").should.equal(false); + }); + + it('multiple requests with same indicator are handled properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var b1 = make('') + var b2 = make('') + var a1 = make('') + + b1.click(); + b1.classList.contains("htmx-request").should.equal(false); + b2.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(true); + + b2.click(); + b1.classList.contains("htmx-request").should.equal(false); + b2.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(true); + + // hack to make sinon process only one response + this.server.processRequest(this.server.queue.shift()); + + b1.classList.contains("htmx-request").should.equal(false); + b2.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(true); + + this.server.respond(); + + b1.classList.contains("htmx-request").should.equal(false); + b2.classList.contains("htmx-request").should.equal(false); + a1.classList.contains("htmx-request").should.equal(false); + + }); + + +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-on.js b/www/static/test/1.9.2/test/attributes/hx-on.js new file mode 100644 index 000000000..9a2005b11 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-on.js @@ -0,0 +1,122 @@ +describe("hx-on attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it("can handle basic events w/ no other attributes", function () { + var btn = make(""); + btn.click(); + window.foo.should.equal(true); + delete window.foo; + }); + + it("can modify a parameter via htmx:configRequest", function () { + this.server.respondWith("POST", "/test", function (xhr) { + var params = parseParams(xhr.requestBody); + xhr.respond(200, {}, params.foo); + }); + var btn = make(""); + btn.click(); + this.server.respond(); + btn.innerText.should.equal("bar"); + }); + + it("can cancel an event via preventDefault for htmx:configRequest", function () { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var btn = make(""); + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Foo"); + }); + + it("can respond to kebab-case events", function () { + this.server.respondWith("POST", "/test", function (xhr) { + var params = parseParams(xhr.requestBody); + xhr.respond(200, {}, params.foo); + }); + var btn = make(""); + btn.click(); + this.server.respond(); + btn.innerText.should.equal("bar"); + }); + + it("has the this symbol set to the element", function () { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "foo"); + }); + var btn = make(""); + btn.click(); + this.server.respond(); + btn.innerText.should.equal("foo"); + btn.should.equal(window.elt); + delete window.elt; + }); + + it("can handle multi-line JSON", function () { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "foo"); + }); + var btn = make(""); + btn.click(); + this.server.respond(); + btn.innerText.should.equal("foo"); + var obj = {foo: true, bar: false}; + obj.should.deep.equal(window.elt); + delete window.elt; + }); + + it("can handle multiple event handlers in the presence of multi-line JSON", function () { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "foo"); + }); + var btn = make(""); + btn.click(); + this.server.respond(); + btn.innerText.should.equal("foo"); + + var obj = {foo: true, bar: false}; + obj.should.deep.equal(window.elt); + delete window.elt; + + window.foo.should.equal(true); + delete window.foo; + }); + + it("de-initializes hx-on content properly", function () { + window.tempCount = 0; + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make("
    Foo
    "); + + // get response + div.click(); + this.server.respond(); + + // click button + byId('foo').click(); + window.tempCount.should.equal(1); + + // get second response + div.click(); + this.server.respond(); + + // click button again + byId('foo').click(); + window.tempCount.should.equal(2); + + delete window.tempCount; + }); + +}); diff --git a/www/static/test/1.9.2/test/attributes/hx-params.js b/www/static/test/1.9.2/test/attributes/hx-params.js new file mode 100644 index 000000000..b2b19ca25 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-params.js @@ -0,0 +1,101 @@ +describe("hx-params attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('none excludes all params', function () { + this.server.respondWith("POST", "/params", function (xhr) { + var params = getParameters(xhr); + should.equal(params['i1'], undefined); + should.equal(params['i2'], undefined); + should.equal(params['i3'], undefined); + xhr.respond(200, {}, "Clicked!") + }); + var form = make('
    ' + + '' + + '' + + '' + + '
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('"*" includes all params', function () { + this.server.respondWith("POST", "/params", function (xhr) { + var params = getParameters(xhr); + should.equal(params['i1'], "test"); + should.equal(params['i2'], "test"); + should.equal(params['i3'], "test"); + xhr.respond(200, {}, "Clicked!") + }); + var form = make('
    ' + + '' + + '' + + '' + + '
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('named includes works', function () { + this.server.respondWith("POST", "/params", function (xhr) { + var params = getParameters(xhr); + should.equal(params['i1'], "test"); + should.equal(params['i2'], undefined); + should.equal(params['i3'], "test"); + xhr.respond(200, {}, "Clicked!") + }); + var form = make('
    ' + + '' + + '' + + '' + + '
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('named exclude works', function () { + this.server.respondWith("POST", "/params", function (xhr) { + var params = getParameters(xhr); + should.equal(params['i1'], undefined); + should.equal(params['i2'], "test"); + should.equal(params['i3'], undefined); + xhr.respond(200, {}, "Clicked!") + }); + var form = make('
    ' + + '' + + '' + + '' + + '
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('named exclude works w/ data-* prefix', function () { + this.server.respondWith("POST", "/params", function (xhr) { + var params = getParameters(xhr); + should.equal(params['i1'], undefined); + should.equal(params['i2'], "test"); + should.equal(params['i3'], undefined); + xhr.respond(200, {}, "Clicked!") + }); + var form = make('
    ' + + '' + + '' + + '' + + '
    '); + form.click(); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/attributes/hx-patch.js b/www/static/test/1.9.2/test/attributes/hx-patch.js new file mode 100644 index 000000000..a3c519847 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-patch.js @@ -0,0 +1,34 @@ +describe("hx-patch attribute", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('issues a PATCH request', function() + { + this.server.respondWith("PATCH", "/test", function(xhr){ + xhr.respond(200, {}, "Patched!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Patched!"); + }); + + it('issues a PATCH request w/ data-* prefix', function() + { + this.server.respondWith("PATCH", "/test", function(xhr){ + xhr.respond(200, {}, "Patched!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Patched!"); + }); +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-post.js b/www/static/test/1.9.2/test/attributes/hx-post.js new file mode 100644 index 000000000..6734e30d2 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-post.js @@ -0,0 +1,36 @@ +describe("hx-post attribute", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('issues a POST request with proper headers', function() + { + this.server.respondWith("POST", "/test", function(xhr){ + should.equal(xhr.requestHeaders['X-HTTP-Method-Override'], undefined); + xhr.respond(200, {}, "Posted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Posted!"); + }); + + it('issues a POST request with proper headers w/ data-* prefix', function() + { + this.server.respondWith("POST", "/test", function(xhr){ + should.equal(xhr.requestHeaders['X-HTTP-Method-Override'], undefined); + xhr.respond(200, {}, "Posted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Posted!"); + }); +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-preserve.js b/www/static/test/1.9.2/test/attributes/hx-preserve.js new file mode 100644 index 000000000..1e1c2368a --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-preserve.js @@ -0,0 +1,39 @@ +describe("hx-preserve attribute", function () { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('handles basic response properly', function () { + this.server.respondWith("GET", "/test", "
    New Content
    New Content
    "); + var div = make("
    Old Content
    Old Content
    "); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("Old Content"); + byId("d2").innerHTML.should.equal("New Content"); + }) + + it('handles preserved element that might not be existing', function () { + this.server.respondWith("GET", "/test", "
    New Content
    New Content
    "); + var div = make("
    Old Content
    "); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("New Content"); + byId("d2").innerHTML.should.equal("New Content"); + }) + + it('preserved element should not be swapped if it lies outside of hx-select', function () { + this.server.respondWith("GET", "/test", "
    New Content
    New Content
    "); + var div = make("
    Old Content
    Old Content
    "); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("Old Content"); + byId("d2").innerHTML.should.equal("New Content"); + }) + +}); + diff --git a/www/static/test/1.9.2/test/attributes/hx-push-url.js b/www/static/test/1.9.2/test/attributes/hx-push-url.js new file mode 100644 index 000000000..50b88d806 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-push-url.js @@ -0,0 +1,223 @@ +describe("hx-push-url attribute", function() { + + var HTMX_HISTORY_CACHE_NAME = "htmx-history-cache"; + + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); + }); + + it("navigation should push an element into the cache when true", function () { + this.server.respondWith("GET", "/test", "second"); + getWorkArea().innerHTML.should.be.equal(""); + var div = make('
    first
    '); + div.click(); + this.server.respond(); + div.click(); + this.server.respond(); + getWorkArea().textContent.should.equal("second") + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + console.log(cache); + cache[cache.length - 1].url.should.equal("/test"); + }); + + it("navigation should push an element into the cache when string", function () { + this.server.respondWith("GET", "/test", "second"); + getWorkArea().innerHTML.should.be.equal(""); + var div = make('
    first
    '); + div.click(); + this.server.respond(); + div.click(); + this.server.respond(); + getWorkArea().textContent.should.equal("second") + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(2); + cache[1].url.should.equal("/abc123"); + }); + + it("restore should return old value", function () { + this.server.respondWith("GET", "/test1", '
    test1
    '); + this.server.respondWith("GET", "/test2", '
    test2
    '); + + make('
    init
    '); + + byId("d1").click(); + this.server.respond(); + var workArea = getWorkArea(); + workArea.textContent.should.equal("test1") + + byId("d2").click(); + this.server.respond(); + workArea.textContent.should.equal("test2") + + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + + cache.length.should.equal(2); + htmx._('restoreHistory')("/test1") + getWorkArea().textContent.should.equal("test1") + }); + + it("history restore should not have htmx support classes in content", function () { + this.server.respondWith("GET", "/test1", '
    test1
    '); + this.server.respondWith("GET", "/test2", '
    test2
    '); + + make('
    init
    '); + + byId("d1").click(); + this.server.respond(); + var workArea = getWorkArea(); + workArea.textContent.should.equal("test1") + + byId("d2").click(); + this.server.respond(); + workArea.textContent.should.equal("test2") + + htmx._('restoreHistory')("/test1") + getWorkArea().getElementsByClassName("htmx-request").length.should.equal(0); + }); + + it("cache should only store 10 entries", function () { + var x = 0; + this.server.respondWith("GET", /test.*/, function(xhr){ + x++; + xhr.respond(200, {}, '
    ') + }); + getWorkArea().innerHTML.should.be.equal(""); + make('
    '); + for (var i = 0; i < 20; i++) { // issue 20 requests + byId("d1").click(); + this.server.respond(); + } + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(10); // should only be 10 elements + }); + + it("cache miss should issue another GET", function () { + this.server.respondWith("GET", "/test1", '
    test1
    '); + this.server.respondWith("GET", "/test2", '
    test2
    '); + + make('
    init
    '); + + byId("d1").click(); + this.server.respond(); + var workArea = getWorkArea(); + workArea.textContent.should.equal("test1") + + byId("d2").click(); + this.server.respond(); + workArea.textContent.should.equal("test2") + + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + + cache.length.should.equal(2); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); // clear cache + htmx._('restoreHistory')("/test1") + this.server.respond(); + getWorkArea().textContent.should.equal("test1") + }); + + it("navigation should push an element into the cache w/ data-* prefix", function () { + this.server.respondWith("GET", "/test", "second"); + getWorkArea().innerHTML.should.be.equal(""); + var div = make('
    first
    '); + div.click(); + this.server.respond(); + getWorkArea().textContent.should.equal("second") + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(1); + }); + + it("deals with malformed JSON in history cache when getting", function () { + localStorage.setItem(HTMX_HISTORY_CACHE_NAME, "Invalid JSON"); + var history = htmx._('getCachedHistory')('url'); + should.equal(history, null); + }); + + it("deals with malformed JSON in history cache when saving", function () { + localStorage.setItem(HTMX_HISTORY_CACHE_NAME, "Invalid JSON"); + htmx._('saveToHistoryCache')('url', 'content', 'title', 'scroll'); + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(1); + }); + + it("does not blow out cache when saving a URL twice", function () { + htmx._('saveToHistoryCache')('url1', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url3', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(3); + }); + + it("history cache is LRU", function () { + htmx._('saveToHistoryCache')('url1', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url3', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); + htmx._('saveToHistoryCache')('url1', 'content', 'title', 'scroll'); + var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); + cache.length.should.equal(3); + cache[0].url.should.equal("url3"); + cache[1].url.should.equal("url2"); + cache[2].url.should.equal("url1"); + }); + + it("htmx:afterSettle is called when replacing outerHTML", function () { + var called = false; + var handler = htmx.on("htmx:afterSettle", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterSettle", handler); + } + }); + + it("should include parameters on a get", function () { + var path = ""; + var handler = htmx.on("htmx:pushedIntoHistory", function (evt) { + path = evt.detail.path; + }); + try { + this.server.respondWith("GET", /test.*/, function (xhr) { + xhr.respond(200, {}, "second") + }); + var form = make('
    first
    '); + form.click(); + this.server.respond(); + form.textContent.should.equal("second") + path.should.equal("/test?foo=bar") + } finally { + htmx.off("htmx:pushedIntoHistory", handler); + } + }); + + it("saveToHistoryCache should not throw", function () { + var bigContent = "Dummy"; + for (var i = 0; i < 20; i++) { + bigContent += bigContent; + } + try { + localStorage.removeItem("htmx-history-cache"); + htmx._("saveToHistoryCache")("/dummy", bigContent, "Foo", 0); + should.equal(localStorage.getItem("htmx-history-cache"), null); + } finally { + // clear history cache afterwards + localStorage.removeItem("htmx-history-cache"); + } + }); + +}); diff --git a/www/static/test/1.9.2/test/attributes/hx-put.js b/www/static/test/1.9.2/test/attributes/hx-put.js new file mode 100644 index 000000000..589ec199d --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-put.js @@ -0,0 +1,34 @@ +describe("hx-put attribute", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('issues a PUT request', function() + { + this.server.respondWith("PUT", "/test", function(xhr){ + xhr.respond(200, {}, "Putted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Putted!"); + }); + + it('issues a PUT request w/ data-* prefix', function() + { + this.server.respondWith("PUT", "/test", function(xhr){ + xhr.respond(200, {}, "Putted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Putted!"); + }); +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-request.js b/www/static/test/1.9.2/test/attributes/hx-request.js new file mode 100644 index 000000000..e64f6481f --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-request.js @@ -0,0 +1,39 @@ +describe("hx-request attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic hx-request timeout works', function (done) { + var timedOut = false; + this.server.respondWith("GET", "/test", "Clicked!"); + var div = make("
    ") + htmx.on(div, 'htmx:timeout', function(){ + timedOut = true; + }) + div.click(); + setTimeout(function(){ + div.innerHTML.should.equal(""); + // unfortunately it looks like sinon.js doesn't implement the timeout functionality + // timedOut.should.equal(true); + done(); + }, 400) + }); + + it('hx-request header works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + should.equal(xhr.requestHeaders['HX-Request'], undefined); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/attributes/hx-select-oob.js b/www/static/test/1.9.2/test/attributes/hx-select-oob.js new file mode 100644 index 000000000..570811e85 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-select-oob.js @@ -0,0 +1,54 @@ +describe("hx-select-oob attribute", function () { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic hx-select-oob works', function() + { + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + var div2 = byId('d2'); + div2.innerHTML.should.equal("bar"); + }); + + it('multiple hx-select-oobs works', function() + { + this.server.respondWith("GET", "/test", "
    foo
    bar
    bar
    "); + var div = make('
    '); + make('
    '); + make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + + var div2 = byId('d2'); + div2.innerHTML.should.equal("bar"); + + var div3 = byId('d2'); + div3.innerHTML.should.equal("bar"); + }); + + it('basic hx-select-oob ignores bad selector', function() + { + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + var div2 = byId('d2'); + div2.innerHTML.should.equal(""); + }); + + +}); + diff --git a/www/static/test/1.9.2/test/attributes/hx-select.js b/www/static/test/1.9.2/test/attributes/hx-select.js new file mode 100644 index 000000000..c58684308 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-select.js @@ -0,0 +1,40 @@ +describe("BOOTSTRAP - htmx AJAX Tests", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('properly handles a partial of HTML', function() + { + var i = 1; + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + }); + + it('properly handles a full HTML document', function() + { + var i = 1; + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + }); + + it('properly handles a full HTML document w/ data-* prefix', function() + { + var i = 1; + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + }); +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-sse.js b/www/static/test/1.9.2/test/attributes/hx-sse.js new file mode 100644 index 000000000..138734e55 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-sse.js @@ -0,0 +1,140 @@ +describe("hx-sse attribute", function() { + + function mockEventSource() { + var listeners = {}; + var wasClosed = false; + var mockEventSource = { + removeEventListener: function(name) { + delete listeners[name]; + }, + addEventListener: function (message, l) { + listeners[message] = l; + }, + sendEvent: function (eventName, data) { + var listener = listeners[eventName]; + if (listener) { + var event = htmx._("makeEvent")(eventName); + event.data = data; + listener(event); + } + }, + close: function () { + wasClosed = true; + }, + wasClosed: function () { + return wasClosed; + } + }; + return mockEventSource; + } + + beforeEach(function () { + this.server = makeServer(); + var eventSource = mockEventSource(); + this.eventSource = eventSource; + clearWorkArea(); + htmx.createEventSource = function(){ return eventSource }; + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('handles basic sse triggering', function () { + + this.server.respondWith("GET", "/d1", "div1 updated"); + this.server.respondWith("GET", "/d2", "div2 updated"); + + var div = make('
    ' + + '
    div1
    ' + + '
    div2
    ' + + '
    '); + + this.eventSource.sendEvent("e1"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1 updated"); + byId("d2").innerHTML.should.equal("div2"); + + this.eventSource.sendEvent("e2"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1 updated"); + byId("d2").innerHTML.should.equal("div2 updated"); + }) + + it('does not trigger events that arent named', function () { + + this.server.respondWith("GET", "/d1", "div1 updated"); + + var div = make('
    ' + + '
    div1
    ' + + '
    '); + + this.eventSource.sendEvent("foo"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1"); + + this.eventSource.sendEvent("e2"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1"); + + this.eventSource.sendEvent("e1"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1 updated"); + }) + + it('does not trigger events not on decendents', function () { + + this.server.respondWith("GET", "/d1", "div1 updated"); + + var div = make('
    ' + + '
    div1
    '); + + this.eventSource.sendEvent("foo"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1"); + + this.eventSource.sendEvent("e2"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1"); + + this.eventSource.sendEvent("e1"); + this.server.respond(); + byId("d1").innerHTML.should.equal("div1"); + }) + + it('is closed after removal', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var div = make('
    ' + + '
    div1
    ' + + '
    '); + div.click(); + this.server.respond(); + this.eventSource.wasClosed().should.equal(true) + }) + + it('is closed after removal with no close and activity', function () { + var div = make('
    ' + + '
    div1
    ' + + '
    '); + div.parentElement.removeChild(div); + this.eventSource.sendEvent("e1") + this.eventSource.wasClosed().should.equal(true) + }) + + it('swaps content properly on SSE swap', function () { + var div = make('
    \n' + + '
    \n' + + '
    \n' + + '
    \n'); + byId("d1").innerText.should.equal("") + byId("d2").innerText.should.equal("") + this.eventSource.sendEvent("e1", "Event 1") + byId("d1").innerText.should.equal("Event 1") + byId("d2").innerText.should.equal("") + this.eventSource.sendEvent("e2", "Event 2") + byId("d1").innerText.should.equal("Event 1") + byId("d2").innerText.should.equal("Event 2") + }) + +}); + diff --git a/www/static/test/1.9.2/test/attributes/hx-swap-oob.js b/www/static/test/1.9.2/test/attributes/hx-swap-oob.js new file mode 100644 index 000000000..e69c43e68 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-swap-oob.js @@ -0,0 +1,132 @@ +describe("hx-swap-oob attribute", function () { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('handles basic response properly', function () { + this.server.respondWith("GET", "/test", "Clicked
    Swapped0
    "); + var div = make('
    click me
    '); + make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked"); + byId("d1").innerHTML.should.equal("Swapped0"); + }) + + it('handles more than one oob swap properly', function () { + this.server.respondWith("GET", "/test", "Clicked
    Swapped1
    Swapped2
    "); + var div = make('
    click me
    '); + make('
    '); + make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked"); + byId("d1").innerHTML.should.equal("Swapped1"); + byId("d2").innerHTML.should.equal("Swapped2"); + }) + + it('handles no id match properly', function () { + this.server.respondWith("GET", "/test", "Clicked
    Swapped2
    "); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + div.innerText.should.equal("Clicked"); + }) + + it('handles basic response properly w/ data-* prefix', function () { + this.server.respondWith("GET", "/test", "Clicked
    Swapped3
    "); + var div = make('
    click me
    '); + make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked"); + byId("d1").innerHTML.should.equal("Swapped3"); + }) + + it('handles outerHTML response properly', function () { + this.server.respondWith("GET", "/test", "Clicked
    Swapped4
    "); + var div = make('
    click me
    '); + make('
    '); + div.click(); + this.server.respond(); + byId("d1").getAttribute("foo").should.equal("bar"); + div.innerHTML.should.equal("Clicked"); + byId("d1").innerHTML.should.equal("Swapped4"); + }) + + it('handles innerHTML response properly', function () { + this.server.respondWith("GET", "/test", "Clicked
    Swapped5
    "); + var div = make('
    click me
    '); + make('
    '); + div.click(); + this.server.respond(); + should.equal(byId("d1").getAttribute("foo"), null); + div.innerHTML.should.equal("Clicked"); + byId("d1").innerHTML.should.equal("Swapped5"); + }) + + it('oob swaps can be nested in content', function () { + this.server.respondWith("GET", "/test", "
    Clicked
    Swapped6
    "); + var div = make('
    click me
    '); + make('
    '); + div.click(); + this.server.respond(); + should.equal(byId("d1").getAttribute("foo"), null); + div.innerHTML.should.equal("
    Clicked
    "); + byId("d1").innerHTML.should.equal("Swapped6"); + }) + + it('oob swaps can use selectors to match up', function () { + this.server.respondWith("GET", "/test", "
    Clicked
    Swapped7
    "); + var div = make('
    click me
    '); + make('
    '); + div.click(); + this.server.respond(); + should.equal(byId("d1").getAttribute("oob-foo"), "bar"); + div.innerHTML.should.equal("
    Clicked
    "); + byId("d1").innerHTML.should.equal("Swapped7"); + }) + + it('swaps into all targets that match the selector (innerHTML)', function () { + this.server.respondWith("GET", "/test", "
    Clicked
    Swapped8
    "); + var div = make('
    click me
    '); + make('
    No swap
    '); + make('
    Not swapped
    '); + make('
    Not swapped
    '); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("No swap"); + byId("d2").innerHTML.should.equal("Swapped8"); + byId("d3").innerHTML.should.equal("Swapped8"); + }) + + it('swaps into all targets that match the selector (outerHTML)', function () { + var oobSwapContent = '
    Swapped9
    '; + this.server.respondWith("GET", "/test", "
    Clicked
    " + oobSwapContent); + var div = make('
    click me
    '); + make('
    No swap
    '); + make('
    Not swapped
    '); + make('
    Not swapped
    '); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("
    No swap
    "); + byId("d2").innerHTML.should.equal(oobSwapContent); + byId("d3").innerHTML.should.equal(oobSwapContent); + }) + + it('oob swap delete works properly', function() + { + this.server.respondWith("GET", "/test", '
    '); + + var div = make('
    Foo
    ') + div.click(); + this.server.respond(); + should.equal(byId("d1"), null); + }); +}); + diff --git a/www/static/test/1.9.2/test/attributes/hx-swap.js b/www/static/test/1.9.2/test/attributes/hx-swap.js new file mode 100644 index 000000000..744f73cf4 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-swap.js @@ -0,0 +1,301 @@ +describe("hx-swap attribute", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('swap innerHTML properly', function() + { + this.server.respondWith("GET", "/test", 'Click Me'); + this.server.respondWith("GET", "/test2", "Clicked!"); + + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal('Click Me'); + var a = div.querySelector('a'); + a.click(); + this.server.respond(); + a.innerHTML.should.equal('Clicked!'); + }); + + it('swap outerHTML properly', function() + { + this.server.respondWith("GET", "/test", 'Click Me'); + this.server.respondWith("GET", "/test2", "Clicked!"); + + var div = make('
    ') + div.click(); + should.equal(byId("d1"), div); + this.server.respond(); + should.equal(byId("d1"), null); + byId("a1").click(); + this.server.respond(); + byId("a1").innerHTML.should.equal('Clicked!'); + }); + + it('swap beforebegin properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, '' + i + ''); + }); + this.server.respondWith("GET", "/test2", "*"); + + var div = make('
    *
    ') + var parent = div.parentElement; + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("1*"); + + byId("a1").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("**"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("*2*"); + + byId("a2").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("***"); + }); + + it('swap afterbegin properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    *
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("1*"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("21*"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("321*"); + }); + + it('swap afterbegin properly with no initial content', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("1"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("21"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("321"); + }); + + it('swap afterend properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, '' + i + ''); + }); + this.server.respondWith("GET", "/test2", "*"); + + var div = make('
    *
    ') + var parent = div.parentElement; + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("*1"); + + byId("a1").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("**"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("*2*"); + + byId("a2").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("***"); + }); + + it('handles beforeend properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    *
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("*1"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*12"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*123"); + }); + + it('handles beforeend properly with no initial content', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("1"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("12"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("123"); + }); + + it('properly parses various swap specifications', function(){ + var swapSpec = htmx._("getSwapSpecification"); // internal function for swap spec + swapSpec(make("
    ")).swapStyle.should.equal("innerHTML") + swapSpec(make("
    ")).swapStyle.should.equal("innerHTML") + swapSpec(make("
    ")).swapDelay.should.equal(0) + swapSpec(make("
    ")).settleDelay.should.equal(0) // set to 0 in tests + swapSpec(make("
    ")).swapDelay.should.equal(10) + swapSpec(make("
    ")).settleDelay.should.equal(10) + swapSpec(make("
    ")).swapDelay.should.equal(10) + swapSpec(make("
    ")).settleDelay.should.equal(11) + swapSpec(make("
    ")).swapDelay.should.equal(10) + swapSpec(make("
    ")).settleDelay.should.equal(11) + swapSpec(make("
    ")).settleDelay.should.equal(11) + swapSpec(make("
    ")).settleDelay.should.equal(11) + }) + + it('works with a swap delay', function(done) { + this.server.respondWith("GET", "/test", "Clicked!"); + var div = make("
    "); + div.click(); + this.server.respond(); + div.innerText.should.equal(""); + setTimeout(function () { + div.innerText.should.equal("Clicked!"); + done(); + }, 30); + }); + + it('works with a settle delay', function(done) { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + div.classList.contains('foo').should.equal(false); + setTimeout(function () { + byId('d1').classList.contains('foo').should.equal(true); + done(); + }, 30); + }); + + it('swap outerHTML properly w/ data-* prefix', function() + { + this.server.respondWith("GET", "/test", 'Click Me'); + this.server.respondWith("GET", "/test2", "Clicked!"); + + var div = make('
    ') + div.click(); + should.equal(byId("d1"), div); + this.server.respond(); + should.equal(byId("d1"), null); + byId("a1").click(); + this.server.respond(); + byId("a1").innerHTML.should.equal('Clicked!'); + }); + + it('swap none works properly', function() + { + this.server.respondWith("GET", "/test", 'Ooops, swapped'); + + var div = make('
    Foo
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal('Foo'); + }); + + + it('swap outerHTML does not trigger htmx:afterSwap on original element', function() + { + this.server.respondWith("GET", "/test", 'Clicked!'); + var div = make('
    ') + div.addEventListener("htmx:afterSwap", function(){ + count++; + }) + div.click(); + var count = 0; + should.equal(byId("d1"), div); + this.server.respond(); + should.equal(byId("d1"), null); + count.should.equal(0); + }); + it('swap delete works properly', function() + { + this.server.respondWith("GET", "/test", 'Oops, deleted!'); + + var div = make('
    Foo
    ') + div.click(); + this.server.respond(); + should.equal(byId("d1"), null); + }); + + it('in presence of bad swap spec, it uses the default swap strategy', function() + { + var initialSwapStyle = htmx.config.defaultSwapStyle; + htmx.config.defaultSwapStyle = "outerHTML"; + try { + this.server.respondWith("GET", "/test", "Clicked!"); + + var div = make('
    ') + var b1 = byId("b1"); + b1.click(); + this.server.respond(); + div.innerHTML.should.equal('Clicked!'); + } finally { + htmx.config.defaultSwapStyle = initialSwapStyle; + } + }); + + +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-sync.js b/www/static/test/1.9.2/test/attributes/hx-sync.js new file mode 100644 index 000000000..6f4d0d10d --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-sync.js @@ -0,0 +1,224 @@ +describe("hx-sync attribute", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('can use drop strategy', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + '
    ') + var b1 = byId("b1"); + var b2 = byId("b2"); + b1.click(); + b2.click(); + this.server.respond(); + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + }); + + it('defaults to the drop strategy', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + '
    ') + var b1 = byId("b1"); + var b2 = byId("b2"); + b1.click(); + b2.click(); + this.server.respond(); + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + }); + + it('can use replace strategy', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + '
    ') + var b1 = byId("b1"); + var b2 = byId("b2"); + b1.click(); + b2.click(); + this.server.respond(); + this.server.respond(); + b1.innerHTML.should.equal('Initial'); + b2.innerHTML.should.equal('Click 0'); + }); + + it('can use queue all strategy', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + ' ' + + '
    ') + var b1 = byId("b1"); + b1.click(); + + var b2 = byId("b2"); + b2.click(); + + var b3 = byId("b3"); + b3.click(); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + b3.innerHTML.should.equal('Initial'); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Click 1'); + b3.innerHTML.should.equal('Initial'); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Click 1'); + b3.innerHTML.should.equal('Click 2'); + }); + + it('can use queue last strategy', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + ' ' + + '
    ') + var b1 = byId("b1"); + b1.click(); + + var b2 = byId("b2"); + b2.click(); + + var b3 = byId("b3"); + b3.click(); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + b3.innerHTML.should.equal('Initial'); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + b3.innerHTML.should.equal('Click 1'); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + b3.innerHTML.should.equal('Click 1'); + }); + + it('can use queue first strategy', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + ' ' + + '
    ') + var b1 = byId("b1"); + b1.click(); + + var b2 = byId("b2"); + b2.click(); + + var b3 = byId("b3"); + b3.click(); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Initial'); + b3.innerHTML.should.equal('Initial'); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Click 1'); + b3.innerHTML.should.equal('Initial'); + + this.server.respond(); + b1.innerHTML.should.equal('Click 0'); + b2.innerHTML.should.equal('Click 1'); + b3.innerHTML.should.equal('Initial'); + }); + + it('can use abort strategy to end existing abortable request', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + '
    ') + var b1 = byId("b1"); + var b2 = byId("b2"); + b1.click(); + b2.click(); + this.server.respond(); + this.server.respond(); + b1.innerHTML.should.equal('Initial'); + b2.innerHTML.should.equal('Click 0'); + }); + + it('can use abort strategy to drop abortable request when one is in flight', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + '
    ') + var b1 = byId("b1"); + var b2 = byId("b2"); + b2.click(); + b1.click(); + this.server.respond(); + this.server.respond(); + b1.innerHTML.should.equal('Initial'); + b2.innerHTML.should.equal('Click 0'); + }); + + it('can abort a request programmatically', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "Click " + count++); + }); + make('
    ' + + '
    ') + var b1 = byId("b1"); + var b2 = byId("b2"); + b1.click(); + b2.click(); + + htmx.trigger(b1, "htmx:abort"); + + this.server.respond(); + this.server.respond(); + b1.innerHTML.should.equal('Initial'); + b2.innerHTML.should.equal('Click 0'); + }); + +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-target.js b/www/static/test/1.9.2/test/attributes/hx-target.js new file mode 100644 index 000000000..2d4cd0b63 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-target.js @@ -0,0 +1,205 @@ +describe("hx-target attribute", function(){ + beforeEach(function() { + this.server = sinon.fakeServer.create(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('targets an adjacent element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var div1 = make('
    ') + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets a parent element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div1 = make('
    ') + var btn = byId("b1") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets a `this` element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div1 = make('
    ') + var btn = byId("b1") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets a `closest` element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div1 = make('

    ') + var btn = byId("b1") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets a `closest` element properly w/ hyperscript syntax', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div1 = make('

    ') + var btn = byId("b1") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets a `find` element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div1 = make('
    Click Me!
    ') + div1.click(); + this.server.respond(); + var span1 = byId("s1") + var span2 = byId("s2") + span1.innerHTML.should.equal("Clicked!"); + span2.innerHTML.should.equal(""); + }); + + it('targets a `find` element properly w/ hyperscript syntax', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var div1 = make('
    Click Me!
    ') + div1.click(); + this.server.respond(); + var span1 = byId("s1") + var span2 = byId("s2") + span1.innerHTML.should.equal("Clicked!"); + span2.innerHTML.should.equal(""); + }); + + it('targets an inner element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var div1 = byId("d1") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets an inner element properly w/ hyperscript syntax', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var div1 = byId("d1") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('handles bad target gracefully', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Click Me!"); + }); + + + it('targets an adjacent element properly w/ data-* prefix', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + var div1 = make('
    ') + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + }); + + it('targets a `next` element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + make('
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ') + var btn = byId("b1") + var div1 = byId("d1") + var div2 = byId("d2") + var div3 = byId("d3") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + div2.innerHTML.should.equal(""); + div3.innerHTML.should.equal(""); + }); + + it('targets a `next` element properly w/ hyperscript syntax', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + make('
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ') + var btn = byId("b1") + var div1 = byId("d1") + var div2 = byId("d2") + var div3 = byId("d3") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked!"); + div2.innerHTML.should.equal(""); + div3.innerHTML.should.equal(""); + }); + + it('targets a `previous` element properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + make('
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ') + var btn = byId("b1") + var div1 = byId("d1") + var div2 = byId("d2") + var div3 = byId("d3") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal(""); + div2.innerHTML.should.equal(""); + div3.innerHTML.should.equal("Clicked!"); + }); + + it('targets a `previous` element properly w/ hyperscript syntax', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + make('
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ') + var btn = byId("b1") + var div1 = byId("d1") + var div2 = byId("d2") + var div3 = byId("d3") + btn.click(); + this.server.respond(); + div1.innerHTML.should.equal(""); + div2.innerHTML.should.equal(""); + div3.innerHTML.should.equal("Clicked!"); + }); + +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-trigger.js b/www/static/test/1.9.2/test/attributes/hx-trigger.js new file mode 100644 index 000000000..72086a178 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-trigger.js @@ -0,0 +1,787 @@ +describe("hx-trigger attribute", function(){ + beforeEach(function() { + this.server = sinon.fakeServer.create(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('non-default value works', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var form = make('
    Click Me!
    '); + form.click(); + form.innerHTML.should.equal("Click Me!"); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('changed modifier works', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var input = make(''); + var div = make('
    '); + input.click(); + this.server.respond(); + div.innerHTML.should.equal(""); + input.click(); + this.server.respond(); + div.innerHTML.should.equal(""); + input.value = "bar"; + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + }); + + it('once modifier works', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var input = make(''); + var div = make('
    '); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.value = "bar"; + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + }); + + it('once modifier works with multiple triggers', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var input = make(''); + var div = make('
    '); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.value = "bar"; + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + htmx.trigger(input, "foo"); + this.server.respond(); + div.innerHTML.should.equal("Requests: 2"); + }); + + it('polling works', function(complete) + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + if (requests > 5) { + complete(); + // cancel polling with a + xhr.respond(286, {}, "Requests: " + requests); + } else { + xhr.respond(200, {}, "Requests: " + requests); + } + }); + this.server.autoRespond = true; + this.server.autoRespondAfter = 0; + make('
    '); + }); + + + it('non-default value works w/ data-* prefix', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + var form = make('
    Click Me!
    '); + form.click(); + form.innerHTML.should.equal("Click Me!"); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('works with multiple events', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div = make('
    Requests: 0
    '); + div.innerHTML.should.equal("Requests: 0"); + this.server.respond(); + div.innerHTML.should.equal("Requests: 1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Requests: 2"); + }); + + it("parses spec strings", function() + { + var specExamples = { + "": [{trigger: 'click'}], + "every 1s": [{trigger: 'every', pollInterval: 1000}], + "click": [{trigger: 'click'}], + "customEvent": [{trigger: 'customEvent'}], + "event changed": [{trigger: 'event', changed: true}], + "event once": [{trigger: 'event', once: true}], + "event delay:1s": [{trigger: 'event', delay: 1000}], + "event throttle:1s": [{trigger: 'event', throttle: 1000}], + "event delay:1s, foo": [{trigger: 'event', delay: 1000}, {trigger: 'foo'}], + "event throttle:1s, foo": [{trigger: 'event', throttle: 1000}, {trigger: 'foo'}], + "event changed once delay:1s": [{trigger: 'event', changed: true, once: true, delay: 1000}], + "event1,event2": [{trigger: 'event1'}, {trigger: 'event2'}], + "event1, event2": [{trigger: 'event1'}, {trigger: 'event2'}], + "event1 once, event2 changed": [{trigger: 'event1', once: true}, {trigger: 'event2', changed: true}], + "event1,": [{trigger: 'event1'}], + " ": [{trigger: 'click'}], + } + + for (var specString in specExamples) { + var div = make("
    "); + var spec = htmx._('getTriggerSpecs')(div); + spec.should.deep.equal(specExamples[specString], "Found : " + JSON.stringify(spec) + ", expected : " + JSON.stringify(specExamples[specString]) + " for spec: " + specString); + } + }); + + it('sets default trigger for forms', function() + { + var form = make('
    '); + var spec = htmx._('getTriggerSpecs')(form); + spec.should.deep.equal([{trigger: 'submit'}]); + }) + + it('sets default trigger for form elements', function() + { + var form = make(''); + var spec = htmx._('getTriggerSpecs')(form); + spec.should.deep.equal([{trigger: 'change'}]); + }) + + it('filters properly with false filter spec', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var form = make('
    Not Called
    '); + form.click(); + form.innerHTML.should.equal("Not Called"); + var event = htmx._("makeEvent")('evt'); + form.dispatchEvent(event); + this.server.respond(); + form.innerHTML.should.equal("Not Called"); + }) + + it('filters properly with true filter spec', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var form = make('
    Not Called
    '); + form.click(); + form.innerHTML.should.equal("Not Called"); + var event = htmx._("makeEvent")('evt'); + event.foo = true; + form.dispatchEvent(event); + this.server.respond(); + form.innerHTML.should.equal("Called!"); + }) + + it('filters properly compound filter spec', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var event = htmx._("makeEvent")('evt'); + event.foo = true; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + event.bar = true; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + }) + + it('can refer to target element in condition', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var event = htmx._("makeEvent")('evt'); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + div.classList.add("doIt"); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + }) + + it('can refer to target element in condition w/ equality', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var event = htmx._("makeEvent")('evt'); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + div.id = "foo"; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + }) + + it('negative condition', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + div.classList.add("disabled"); + var event = htmx._("makeEvent")('evt'); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + div.classList.remove("disabled"); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + }) + + it('global function call works', function(){ + window.globalFun = function(evt) { + return evt.bar; + } + try { + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var event = htmx._("makeEvent")('evt'); + event.bar = false; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + event.bar = true; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + } finally { + delete window.globalFun; + } + }) + + it('global property event filter works', function(){ + window.foo = { + bar:false + } + try { + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var event = htmx._("makeEvent")('evt'); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + foo.bar = true; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + } finally { + delete window.foo; + } + }) + + it('global variable filter works', function(){ + try { + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var event = htmx._("makeEvent")('evt'); + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Not Called"); + foo = true; + div.dispatchEvent(event); + this.server.respond(); + div.innerHTML.should.equal("Called!"); + } finally { + delete window.foo; + } + }) + + it('can filter polling', function(complete){ + this.server.respondWith("GET", "/test", "Called!"); + window.foo = false; + var div = make('
    Not Called
    '); + var div2 = make('
    Not Called
    '); + this.server.autoRespond = true; + this.server.autoRespondAfter = 0; + setTimeout(function () { + div.innerHTML.should.equal("Not Called"); + div2.innerHTML.should.equal("Called!"); + delete window.foo; + complete(); + }, 100); + }) + + it('bad condition issues error', function(){ + this.server.respondWith("GET", "/test", "Called!"); + var div = make('
    Not Called
    '); + var errorEvent = null; + var handler = htmx.on("htmx:eventFilter:error", function (event) { + errorEvent = event; + }); + try { + var event = htmx._("makeEvent")('evt'); + div.dispatchEvent(event); + should.not.equal(null, errorEvent); + should.not.equal(null, errorEvent.detail.source); + console.log(errorEvent.detail.source); + } finally { + htmx.off("htmx:eventFilter:error", handler); + } + }) + + it('from clause works', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div2 = make('
    '); + var div1 = make('
    Requests: 0
    '); + div1.innerHTML.should.equal("Requests: 0"); + div1.click(); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 0"); + div2.click(); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 1"); + }); + + it('from clause works with body selector', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div1 = make('
    Requests: 0
    '); + div1.innerHTML.should.equal("Requests: 0"); + document.body.click(); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 1"); + }); + + it('from clause works with document selector', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div1 = make('
    Requests: 0
    '); + div1.innerHTML.should.equal("Requests: 0"); + htmx.trigger(document, 'foo'); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 1"); + }); + + it('from clause works with window selector', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div1 = make('
    Requests: 0
    '); + div1.innerHTML.should.equal("Requests: 0"); + htmx.trigger(window, 'foo'); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 1"); + }); + + it('from clause works with closest clause', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div1 = make(''); + var a1 = byId('a1'); + a1.innerHTML.should.equal("Requests: 0"); + div1.click(); + this.server.respond(); + a1.innerHTML.should.equal("Requests: 1"); + }); + + it('from clause works with find clause', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div1 = make(''); + var a1 = byId('a1'); + a1.innerHTML.should.equal("Requests: 0"); + a1.click(); + this.server.respond(); + a1.innerHTML.should.equal("Requests: 1"); + }); + + it('event listeners on other elements are removed when an element is swapped out', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + this.server.respondWith("GET", "/test2", "Clicked"); + + var div1 = make('
    ' + + '
    Requests: 0
    ' + + '
    '); + var div2 = byId("d2"); + + div2.innerHTML.should.equal("Requests: 0"); + document.body.click(); + this.server.respond(); + requests.should.equal(1); + + requests.should.equal(1); + + div1.click(); + this.server.respond(); + div1.innerHTML.should.equal("Clicked"); + + requests.should.equal(2); + + document.body.click(); + this.server.respond(); + + requests.should.equal(2); + }); + + it('multiple triggers with from clauses mixed in work', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + var div2 = make('
    '); + var div1 = make('
    Requests: 0
    '); + div1.innerHTML.should.equal("Requests: 0"); + div1.click(); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 1"); + div2.click(); + this.server.respond(); + div1.innerHTML.should.equal("Requests: 2"); + }); + + it('event listeners can filter on target', function() + { + var requests = 0; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + + var div1 = make('
    ' + + '
    Requests: 0
    ' + + '
    ' + + '
    ' + + '
    '); + var div1 = byId("d1"); + var div2 = byId("d2"); + var div3 = byId("d3"); + + div1.innerHTML.should.equal("Requests: 0"); + document.body.click(); + this.server.respond(); + requests.should.equal(0); + + div1.click(); + this.server.respond(); + requests.should.equal(0); + + div2.click(); + this.server.respond(); + requests.should.equal(0); + + div3.click(); + this.server.respond(); + requests.should.equal(1); + + }); + + it('consume prevents event propogation', function() + { + this.server.respondWith("GET", "/foo", "foo"); + this.server.respondWith("GET", "/bar", "bar"); + var div = make("
    " + + "
    " + + "
    "); + + byId("d1").click(); + this.server.respond(); + + // should not have been replaced by click + byId("d1").parentElement.should.equal(div); + byId("d1").innerText.should.equal("bar"); + }); + + it('throttle prevents multiple requests from happening', function(done) + { + var requests = 0; + var server = this.server; + server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + server.respondWith("GET", "/bar", "bar"); + var div = make("
    "); + + div.click(); + server.respond(); + + div.click(); + server.respond(); + + div.click(); + server.respond(); + + div.click(); + server.respond(); + + // should not have been replaced by click + div.innerText.should.equal("Requests: 1"); + + setTimeout(function () { + div.click(); + server.respond(); + div.innerText.should.equal("Requests: 2"); + + div.click(); + server.respond(); + div.innerText.should.equal("Requests: 2"); + + done(); + }, 50); + }); + + it('delay delays the request', function(done) + { + var requests = 0; + var server = this.server; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + this.server.respondWith("GET", "/bar", "bar"); + var div = make("
    "); + + div.click(); + this.server.respond(); + + div.click(); + this.server.respond(); + + div.click(); + this.server.respond(); + + div.click(); + this.server.respond(); + div.innerText.should.equal(""); + + setTimeout(function () { + server.respond(); + div.innerText.should.equal("Requests: 1"); + + div.click(); + server.respond(); + div.innerText.should.equal("Requests: 1"); + + done(); + }, 50); + }); + + it('requests are queued with last one winning by default', function() + { + var requests = 0; + var server = this.server; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + this.server.respondWith("GET", "/bar", "bar"); + var div = make("
    "); + + div.click(); + div.click(); + div.click(); + this.server.respond(); + div.innerText.should.equal("Requests: 1"); + + this.server.respond(); + div.innerText.should.equal("Requests: 2"); + + this.server.respond(); + div.innerText.should.equal("Requests: 2"); + }); + + it('queue:all queues all requests', function() + { + var requests = 0; + var server = this.server; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + this.server.respondWith("GET", "/bar", "bar"); + var div = make("
    "); + + div.click(); + div.click(); + div.click(); + this.server.respond(); + div.innerText.should.equal("Requests: 1"); + + this.server.respond(); + div.innerText.should.equal("Requests: 2"); + + this.server.respond(); + div.innerText.should.equal("Requests: 3"); + }); + + + it('queue:first queues first request', function() + { + var requests = 0; + var server = this.server; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + this.server.respondWith("GET", "/bar", "bar"); + var div = make("
    "); + + div.click(); + div.click(); + div.click(); + this.server.respond(); + div.innerText.should.equal("Requests: 1"); + + this.server.respond(); + div.innerText.should.equal("Requests: 2"); + + this.server.respond(); + div.innerText.should.equal("Requests: 2"); + }); + + it('queue:none queues no requests', function() + { + var requests = 0; + var server = this.server; + this.server.respondWith("GET", "/test", function (xhr) { + requests++; + xhr.respond(200, {}, "Requests: " + requests); + }); + this.server.respondWith("GET", "/bar", "bar"); + var div = make("
    "); + + div.click(); + div.click(); + div.click(); + this.server.respond(); + div.innerText.should.equal("Requests: 1"); + + this.server.respond(); + div.innerText.should.equal("Requests: 1"); + + this.server.respond(); + div.innerText.should.equal("Requests: 1"); + }); + + it('load event works w/ positive filters', function() + { + this.server.respondWith("GET", "/test", "Loaded!"); + var div = make('
    Load Me!
    '); + div.innerHTML.should.equal("Load Me!"); + this.server.respond(); + div.innerHTML.should.equal("Loaded!"); + }); + + it('load event works w/ negative filters', function() + { + this.server.respondWith("GET", "/test", "Loaded!"); + var div = make('
    Load Me!
    '); + div.innerHTML.should.equal("Load Me!"); + this.server.respond(); + div.innerHTML.should.equal("Load Me!"); + }); + + it('reveal event works on two elements', function() + { + this.server.respondWith("GET", "/test1", "test 1"); + this.server.respondWith("GET", "/test2", "test 2"); + var div = make('
    '); + var div2 = make('
    '); + div.innerHTML.should.equal(""); + div2.innerHTML.should.equal(""); + htmx.trigger(div, 'revealed') + htmx.trigger(div2, 'revealed') + this.server.respondAll(); + div.innerHTML.should.equal("test 1"); + div2.innerHTML.should.equal("test 2"); + }); + + it('reveal event works when triggered by window', function() + { + this.server.respondWith("GET", "/test1", "test 1"); + var div = make('
    foo
    '); + div.innerHTML.should.equal("foo"); + this.server.respondAll(); + div.innerHTML.should.equal("test 1"); + }); + + it("fires the htmx:trigger event when an AJAX attribute is specified", function () { + var param = "foo" + var handler = htmx.on("htmx:trigger", function (evt) { + param = "bar" + }); + try { + this.server.respondWith("GET", "/test1", "test 1"); + var div = make(''); + div.click(); + should.equal(param, "bar"); + } finally { + htmx.off("htmx:trigger", handler); + } + }); + + it("fires the htmx:trigger event when no AJAX attribute is specified", function () { + var param = "foo" + var handler = htmx.on("htmx:trigger", function (evt) { + param = "bar" + }); + try { + var div = make(''); + div.click(); + should.equal(param, "bar"); + } finally { + htmx.off("htmx:trigger", handler); + } + }); + +}) diff --git a/www/static/test/1.9.2/test/attributes/hx-vals.js b/www/static/test/1.9.2/test/attributes/hx-vals.js new file mode 100644 index 000000000..e2728e2c4 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-vals.js @@ -0,0 +1,255 @@ +describe("hx-vals attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic hx-vals works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-vals works with braces', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-vals works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['v1'].should.equal("test"); + params['v2'].should.equal("42"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals can be on parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make("
    "); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals can override parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + make("
    "); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals overrides inputs', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals overrides hx-vars', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-vals javascript: works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals works with braces', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-vals works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['v1'].should.equal("test"); + params['v2'].should.equal("42"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals can be on parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ') + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals can override parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ') + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals overrides inputs', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals treats objects as JSON', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("{\"i2\":\"test\"}"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    ") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-vals can be unset', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params.should.be.empty; + xhr.respond(200, {}, "Clicked!") + }); + make( + "
    \ +
    \ +
    " + ); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-vals with braces can be unset', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params.should.be.empty; + xhr.respond(200, {}, "Clicked!") + }); + make( + "
    \ +
    \ +
    " + ); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-vals can be unset', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params.should.be.empty; + xhr.respond(200, {}, "Clicked!") + }); + make( + "
    \ +
    \ +
    " + ); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('unsetting hx-vals maintains input values', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make( + "
    \ + \ +
    " + ) + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + +}); diff --git a/www/static/test/1.9.2/test/attributes/hx-vars.js b/www/static/test/1.9.2/test/attributes/hx-vars.js new file mode 100644 index 000000000..be20caf43 --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-vars.js @@ -0,0 +1,155 @@ +describe("hx-vars attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic hx-vars works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vars works with braces', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-vars works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['v1'].should.equal("test"); + params['v2'].should.equal("42"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vars can be on parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ') + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vars can override parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + make('
    ') + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vars overrides inputs', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make('
    ') + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-vars can be unset', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params.should.be.empty; + xhr.respond(200, {}, "Clicked!") + }); + make( + "
    \ +
    \ +
    " + ); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('basic hx-vars with braces can be unset', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params.should.be.empty; + xhr.respond(200, {}, "Clicked!") + }); + make( + "
    \ +
    \ +
    " + ); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-vars can be unset', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params.should.be.empty; + xhr.respond(200, {}, "Clicked!") + }); + make( + "
    \ +
    \ +
    " + ); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('unsetting hx-vars maintains input values', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make( + "
    \ + \ +
    " + ) + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + +}); diff --git a/www/static/test/1.9.2/test/attributes/hx-ws.js b/www/static/test/1.9.2/test/attributes/hx-ws.js new file mode 100644 index 000000000..4cd9651af --- /dev/null +++ b/www/static/test/1.9.2/test/attributes/hx-ws.js @@ -0,0 +1,77 @@ +describe("hx-ws attribute", function() { + + function mockWebsocket() { + var listener; + var lastSent; + var wasClosed = false; + var mockSocket = { + addEventListener : function(message, l) { + listener = l; + }, + write : function(content) { + return listener({data:content}); + }, + send : function(data) { + lastSent = data; + }, + getLastSent : function() { + return lastSent; + }, + close : function() { + wasClosed = true; + }, + wasClosed : function () { + return wasClosed; + } + }; + return mockSocket; + } + + beforeEach(function () { + this.server = makeServer(); + var socket = mockWebsocket(); + this.socket = socket; + clearWorkArea(); + this.oldCreateWebSocket = htmx.createWebSocket; + htmx.createWebSocket = function(){ + return socket + }; + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + htmx.createWebSocket = this.oldCreateWebSocket; + }); + + it('handles a basic call back', function () { + var div = make('
    div1
    div2
    '); + this.socket.write("
    replaced
    ") + byId("d1").innerHTML.should.equal("replaced"); + byId("d2").innerHTML.should.equal("div2"); + }) + + it('handles a basic send', function () { + var div = make('
    div1
    '); + byId("d1").click(); + var lastSent = this.socket.getLastSent(); + var data = JSON.parse(lastSent); + data.HEADERS["HX-Request"].should.equal("true"); + }) + + it('is closed after removal', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var div = make('
    '); + div.click(); + this.server.respond(); + this.socket.wasClosed().should.equal(true) + }) + + it('is closed after removal with no close and activity', function () { + var div = make('
    '); + div.parentElement.removeChild(div); + this.socket.write("
    replaced
    ") + this.socket.wasClosed().should.equal(true) + }) + +}); + diff --git a/www/static/test/1.9.2/test/core/ajax.js b/www/static/test/1.9.2/test/core/ajax.js new file mode 100644 index 000000000..b6ea11238 --- /dev/null +++ b/www/static/test/1.9.2/test/core/ajax.js @@ -0,0 +1,992 @@ +describe("Core htmx AJAX Tests", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + // bootstrap test + it('issues a GET request on click and swaps content', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('processes inner content properly', function() + { + this.server.respondWith("GET", "/test", 'Click Me'); + this.server.respondWith("GET", "/test2", "Clicked!"); + + var div = make('
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal('Click Me'); + var a = div.querySelector('a'); + a.click(); + this.server.respond(); + a.innerHTML.should.equal('Clicked!'); + }); + + it('handles swap outerHTML properly', function() + { + this.server.respondWith("GET", "/test", 'Click Me'); + this.server.respondWith("GET", "/test2", "Clicked!"); + + var div = make('
    ') + div.click(); + should.equal(byId("d1"), div); + this.server.respond(); + should.equal(byId("d1"), null); + byId("a1").click(); + this.server.respond(); + byId("a1").innerHTML.should.equal('Clicked!'); + }); + + it('handles beforebegin properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, '' + i + ''); + }); + this.server.respondWith("GET", "/test2", "*"); + + var div = make('
    *
    ') + var parent = div.parentElement; + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("1*"); + + byId("a1").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("**"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("*2*"); + + byId("a2").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("***"); + }); + + it('handles afterbegin properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    *
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("1*"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("21*"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("321*"); + }); + + it('handles afterbegin properly with no initial content', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("1"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("21"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("321"); + }); + + it('handles afterend properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, '' + i + ''); + }); + this.server.respondWith("GET", "/test2", "*"); + + var div = make('
    *
    ') + var parent = div.parentElement; + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("*1"); + + byId("a1").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("**"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*"); + removeWhiteSpace(parent.innerText).should.equal("*2*"); + + byId("a2").click(); + this.server.respond(); + removeWhiteSpace(parent.innerText).should.equal("***"); + }); + + it('handles beforeend properly', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    *
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("*1"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*12"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("*123"); + }); + + it('handles beforeend properly with no initial content', function() + { + var i = 0; + this.server.respondWith("GET", "/test", function(xhr){ + i++; + xhr.respond(200, {}, "" + i); + }); + + var div = make('
    ') + + div.click(); + this.server.respond(); + div.innerText.should.equal("1"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("12"); + + div.click(); + this.server.respond(); + div.innerText.should.equal("123"); + }); + + it('handles hx-target properly', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make(''); + var target = make('Initial'); + btn.click(); + target.innerHTML.should.equal("Initial"); + this.server.respond(); + target.innerHTML.should.equal("Clicked!"); + }); + + it('handles 204 NO CONTENT responses properly', function() + { + this.server.respondWith("GET", "/test", [204, {}, "No Content!"]); + + var btn = make(''); + btn.click(); + btn.innerHTML.should.equal("Click Me!"); + this.server.respond(); + btn.innerHTML.should.equal("Click Me!"); + }); + + it('handles 304 NOT MODIFIED responses properly', function() + { + this.server.respondWith("GET", "/test-1", [200, {}, "Content for Tab 1"]); + this.server.respondWith("GET", "/test-2", [200, {}, "Content for Tab 2"]); + + var target = make('
    ') + var btn1 = make(''); + var btn2 = make(''); + + btn1.click(); + target.innerHTML.should.equal(""); + this.server.respond(); + target.innerHTML.should.equal("Content for Tab 1"); + + btn2.click(); + this.server.respond(); + target.innerHTML.should.equal("Content for Tab 2"); + + this.server.respondWith("GET", "/test-1", [304, {}, "Content for Tab 1"]); + this.server.respondWith("GET", "/test-2", [304, {}, "Content for Tab 2"]); + + btn1.click(); + this.server.respond(); + target.innerHTML.should.equal("Content for Tab 1"); + + btn2.click(); + this.server.respond(); + target.innerHTML.should.equal("Content for Tab 2"); + }); + + it('handles hx-trigger with non-default value', function() + { + this.server.respondWith("GET", "/test", "Clicked!"); + + var form = make('
    Click Me!
    '); + form.click(); + form.innerHTML.should.equal("Click Me!"); + this.server.respond(); + form.innerHTML.should.equal("Clicked!"); + }); + + it('handles hx-trigger with load event', function() + { + this.server.respondWith("GET", "/test", "Loaded!"); + var div = make('
    Load Me!
    '); + div.innerHTML.should.equal("Load Me!"); + this.server.respond(); + div.innerHTML.should.equal("Loaded!"); + }); + + it('sets the content type of the request properly', function (done) { + this.server.respondWith("GET", "/test", function(xhr){ + xhr.respond(200, {}, "done"); + xhr.overriddenMimeType.should.equal("text/html"); + done(); + }); + var div = make('
    Click Me!
    '); + div.click(); + this.server.respond(); + }); + + it('issues two requests when clicked twice before response', function() + { + var i = 1; + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, "click " + i); + i++ + }); + var div = make('
    '); + div.click(); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("click 1"); + this.server.respond(); + div.innerHTML.should.equal("click 2"); + }); + + it('issues two requests when clicked three times before response', function() + { + var i = 1; + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, "click " + i); + i++ + }); + var div = make('
    '); + div.click(); + div.click(); + div.click(); + this.server.respondAll(); + div.innerHTML.should.equal("click 2"); + }); + + it('properly handles hx-select for basic situation', function() + { + var i = 1; + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + }); + + it('properly handles hx-select for full html document situation', function() + { + this.server.respondWith("GET", "/test", "
    foo
    bar
    "); + var div = make('
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("
    foo
    "); + }); + + it('properly settles attributes on interior elements', function(done) + { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + should.equal(byId("d1").getAttribute("width"), null); + setTimeout(function () { + should.equal(byId("d1").getAttribute("width"), "bar"); + done(); + }, 20); + }); + + it('properly settles attributes elements with single quotes in id', function(done) + { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + should.equal(byId("d1'").getAttribute("width"), null); + setTimeout(function () { + should.equal(byId("d1'").getAttribute("width"), "bar"); + done(); + }, 20); + }); + + it('properly settles attributes elements with double quotes in id', function(done) + { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + should.equal(byId("d1\"").getAttribute("width"), null); + setTimeout(function () { + should.equal(byId("d1\"").getAttribute("width"), "bar"); + done(); + }, 20); + }); + + it('properly handles multiple select input', function() + { + var values; + this.server.respondWith("Post", "/test", function (xhr) { + values = getParameters(xhr); + xhr.respond(204, {}, ""); + }); + + var form = make('
    ' + + ''+ + '
    '); + + form.click(); + this.server.respond(); + values.should.deep.equal({}); + + byId("m1").selected = true; + form.click(); + this.server.respond(); + values.should.deep.equal({multiSelect:"m1"}); + + byId("m1").selected = true; + byId("m3").selected = true; + form.click(); + this.server.respond(); + values.should.deep.equal({multiSelect:["m1", "m3"]}); + }); + + it('properly handles multiple select input when "multiple" attribute is empty string', function() + { + var values; + this.server.respondWith("Post", "/test", function (xhr) { + values = getParameters(xhr); + xhr.respond(204, {}, ""); + }); + + var form = make('
    ' + + '' + + '
    '); + + form.click(); + this.server.respond(); + values.should.deep.equal({}); + + byId("m1").selected = true; + form.click(); + this.server.respond(); + values.should.deep.equal({multiSelect:"m1"}); + + byId("m1").selected = true; + byId("m3").selected = true; + form.click(); + this.server.respond(); + values.should.deep.equal({multiSelect:["m1", "m3"]}); + }); + + it('properly handles two multiple select inputs w/ same name', function() + { + var values; + this.server.respondWith("Post", "/test", function (xhr) { + values = getParameters(xhr); + xhr.respond(204, {}, ""); + }); + + var form = make('
    ' + + ''+ + ''+ + '
    '); + + form.click(); + this.server.respond(); + values.should.deep.equal({}); + + byId("m1").selected = true; + form.click(); + this.server.respond(); + values.should.deep.equal({multiSelect:"m1"}); + + byId("m1").selected = true; + byId("m3").selected = true; + byId("m7").selected = true; + byId("m8").selected = true; + form.click(); + this.server.respond(); + values.should.deep.equal({multiSelect:["m1", "m3", "m7", "m8"]}); + }); + + it('properly handles checkbox inputs', function() + { + var values; + this.server.respondWith("Post", "/test", function (xhr) { + values = getParameters(xhr); + xhr.respond(204, {}, ""); + }); + + var form = make('
    ' + + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '); + + form.click(); + this.server.respond(); + values.should.deep.equal({}); + + byId("cb1").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:"cb1"}); + + byId("cb1").checked = true; + byId("cb2").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:["cb1", "cb2"]}); + + byId("cb1").checked = true; + byId("cb2").checked = true; + byId("cb3").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:["cb1", "cb2", "cb3"]}); + + byId("cb1").checked = true; + byId("cb2").checked = true; + byId("cb3").checked = true; + byId("cb4").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:["cb1", "cb2", "cb3"], c2:"cb4"}); + + byId("cb1").checked = true; + byId("cb2").checked = true; + byId("cb3").checked = true; + byId("cb4").checked = true; + byId("cb5").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:["cb1", "cb2", "cb3"], c2:["cb4", "cb5"]}); + + byId("cb1").checked = true; + byId("cb2").checked = true; + byId("cb3").checked = true; + byId("cb4").checked = true; + byId("cb5").checked = true; + byId("cb6").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:["cb1", "cb2", "cb3"], c2:["cb4", "cb5"], c3:"cb6"}); + + byId("cb1").checked = true; + byId("cb2").checked = false; + byId("cb3").checked = true; + byId("cb4").checked = false; + byId("cb5").checked = true; + byId("cb6").checked = true; + form.click(); + this.server.respond(); + values.should.deep.equal({c1:["cb1", "cb3"], c2:"cb5", c3:"cb6"}); + + }); + + it('text nodes dont screw up settling via variable capture', function() + { + this.server.respondWith("GET", "/test", "
    fooo"); + this.server.respondWith("GET", "/test2", "clicked"); + var div = make("
    "); + div.click(); + this.server.respond(); + byId("d1").click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("clicked"); + }); + + it('script nodes evaluate', function() + { + var globalWasCalled = false; + window.callGlobal = function() { + globalWasCalled = true; + } + try { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + globalWasCalled.should.equal(true); + } finally { + delete window.callGlobal; + } + }); + + it('stand alone script nodes evaluate', function() + { + var globalWasCalled = false; + window.callGlobal = function() { + globalWasCalled = true; + } + try { + this.server.respondWith("GET", "/test", ""); + var div = make("
    "); + div.click(); + this.server.respond(); + globalWasCalled.should.equal(true); + } finally { + delete window.callGlobal; + } + }); + + it('script nodes can define global functions', function() + { + try { + window.foo = {} + this.server.respondWith("GET", "/test", ""); + var div = make("
    "); + div.click(); + this.server.respond(); + foo.bar().should.equal(42); + } finally { + delete foo; + } + }); + + it('child script nodes evaluate when children', function() + { + var globalWasCalled = false; + window.callGlobal = function() { + globalWasCalled = true; + } + try { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + globalWasCalled.should.equal(true); + } finally { + delete window.callGlobal; + } + }); + + it('child script nodes evaluate when first child', function() + { + var globalWasCalled = false; + window.callGlobal = function() { + globalWasCalled = true; + } + try { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + globalWasCalled.should.equal(true); + } finally { + delete window.callGlobal; + } + }); + + it('child script nodes evaluate when not explicitly marked javascript', function() + { + var globalWasCalled = false; + window.callGlobal = function() { + globalWasCalled = true; + } + try { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + globalWasCalled.should.equal(true); + } finally { + delete window.callGlobal; + } + }); + + it('script nodes do not evaluate when explicity marked as something other than javascript', function() + { + var globalWasCalled = false; + window.callGlobal = function() { + globalWasCalled = true; + } + try { + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + globalWasCalled.should.equal(false); + } finally { + delete window.callGlobal; + } + }); + + it('script nodes evaluate after swap', function() + { + window.callGlobal = function() { + console.log("Here..."); + window.tempVal = byId("d1").innerText + } + try { + this.server.respondWith("GET", "/test", "
    After settle...
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + window.tempVal.should.equal("After settle..."); + } finally { + delete window.callGlobal; + delete window.tempVal; + } + }); + + it('script node exceptions do not break rendering', function() + { + this.skip("Rendering does not break, but the exception bubbles up and mocha reports it"); + this.server.respondWith("GET", "/test", "clicked"); + var div = make("
    "); + div.click(); + this.server.respond(); + div.innerText.should.equal("clicked"); + console.log(div.innerText); + console.log("here"); + }); + + it('allows empty verb values', function() + { + var path = null; + var div = make("
    "); + htmx.on(div, "htmx:configRequest", function (evt) { + path = evt.detail.path; + return false; + }); + div.click(); + this.server.respond(); + path.should.not.be.null; + }); + + it('allows blank verb values', function() + { + var path = null; + var div = make("
    "); + htmx.on(div, "htmx:configRequest", function (evt) { + path = evt.detail.path; + return false; + }); + div.click(); + this.server.respond(); + path.should.not.be.null; + }); + + it('input values are not settle swapped (causes flicker)', function() + { + this.server.respondWith("GET", "/test", ""); + var input = make(""); + input.click(); + this.server.respond(); + input = byId('i1'); + input.value.should.equal('bar'); + }); + + it('autofocus attribute works properly', function() + { + this.server.respondWith("GET", "/test", ""); + var input = make(""); + input.focus(); + input.click(); + document.activeElement.should.equal(input); + this.server.respond(); + var input2 = byId('i2'); + document.activeElement.should.equal(input2); + }); + + it('autofocus attribute works properly w/ child', function() + { + this.server.respondWith("GET", "/test", "
    "); + var input = make(""); + input.focus(); + input.click(); + document.activeElement.should.equal(input); + this.server.respond(); + var input2 = byId('i2'); + document.activeElement.should.equal(input2); + }); + + it('autofocus attribute works properly w/ true value', function() + { + this.server.respondWith("GET", "/test", "
    "); + var input = make(""); + input.focus(); + input.click(); + document.activeElement.should.equal(input); + this.server.respond(); + var input2 = byId('i2'); + document.activeElement.should.equal(input2); + }); + + it('multipart/form-data encoding works', function() + { + this.server.respondWith("POST", "/test", function(xhr){ + should.equal(xhr.requestHeaders['Content-Type'], undefined); + if (xhr.requestBody.get) { //IE 11 does not support + xhr.requestBody.get("i1").should.equal('foo'); + } + xhr.respond(200, {}, "body: " + xhr.requestBody); + }); + var form = make("
    " + + "" + + "
    "); + form.focus(); + form.click(); + this.server.respond(); + }); + + it('removed elements do not issue requests', function() + { + var count = 0; + this.server.respondWith("GET", "/test", function (xhr) { + count++; + xhr.respond(200, {}, ""); + }); + var btn = make('') + htmx.remove(btn); + btn.click(); + this.server.respond(); + count.should.equal(0); + }); + + it('title tags update title', function() + { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, "htmx rocks!Clicked!"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Clicked!"); + window.document.title.should.equal("htmx rocks!"); + }); + + it('svg title tags do not update title', function() + { + var originalTitle = window.document.title + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, "" + originalTitle + "UPDATE" + "Clicked!"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Clicked!"); + window.document.title.should.equal(originalTitle); + }); + + it('first title tag outside svg title tags updates title', function() + { + var originalTitle = window.document.title + var newTitle = originalTitle + "!!!"; + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, "" + newTitle + "fooClicked!x"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Clicked!"); + window.document.title.should.equal(newTitle); + }); + + it('title update does not URL escape', function() + { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, "</> htmx rocks!Clicked!"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Clicked!"); + window.document.title.should.equal(" htmx rocks!"); + }); + + it('by default 400 content is not swapped', function() + { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(400, {}, "Clicked!"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Click Me!"); + }); + + it('400 content can be swapped if configured to do so', function() + { + var handler = htmx.on("htmx:beforeSwap", function (event) { + if (event.detail.xhr.status === 400) { + event.detail.shouldSwap = true; + } + }); + + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(400, {}, "Clicked!"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Clicked!"); + htmx.off("htmx:beforeSwap", handler); + }); + + it('400 content can be retargeted if configured to do so', function() + { + var handler = htmx.on("htmx:beforeSwap", function (event) { + if (event.detail.xhr.status === 400) { + event.detail.shouldSwap = true; + event.detail.target = byId('d1') + } + }); + + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(400, {}, "Clicked!"); + }); + var btn = make('') + var div = make('
    ') + btn.click(); + this.server.respond(); + div.innerText.should.equal("Clicked!"); + htmx.off("htmx:beforeSwap", handler); + }); + + it('errors are triggered only on 400+', function() + { + var errors = 0; + var handler = htmx.on("htmx:responseError", function(){ + errors++; + }) + this.server.respondWith("GET", "/test1", function (xhr) { + xhr.respond(204, {}, "Clicked!"); + }); + this.server.respondWith("GET", "/test2", function (xhr) { + xhr.respond(400, {}, "Clicked!"); + }); + var btn1 = make('') + var btn2 = make('') + btn1.click(); + btn2.click(); + this.server.respond(); + this.server.respond(); + errors.should.equal(1); + htmx.off("htmx:responseError", handler); + }); + + + it('content can be modified if configured to do so', function() + { + var handler = htmx.on("htmx:beforeSwap", function (event) { + if (event.detail.xhr.status === 400) { + event.detail.shouldSwap = true; + event.detail.serverResponse = event.detail.serverResponse + "!!"; + } + }); + + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(400, {}, "Clicked!"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerText.should.equal("Clicked!!!"); + htmx.off("htmx:beforeSwap", handler); + }); + + it('scripts w/ src attribute are properly loaded', function(done) + { + try { + this.server.respondWith("GET", "/test", ""); + var div = make("
    "); + div.click(); + this.server.respond(); + setTimeout(function () { + window.globalWasCalled.should.equal(true); + delete window.globalWasCalled; + done(); + }, 400); + } finally { + delete window.globalWasCalled; + } + }); + + it('should load tags with colon in their names', function() { + this.server.respondWith('GET', '/test', 'Foobar'); + + var btn = make(''); + btn.click(); + this.server.respond(); + + btn.innerHTML.should.equal('Foobar'); + }); + +}) diff --git a/www/static/test/1.9.2/test/core/api.js b/www/static/test/1.9.2/test/core/api.js new file mode 100644 index 000000000..aea3fa247 --- /dev/null +++ b/www/static/test/1.9.2/test/core/api.js @@ -0,0 +1,343 @@ +describe("Core htmx API test", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('onLoad is called... onLoad', function(done){ + // also tests on/off + this.server.respondWith("GET", "/test", "
    ") + var helper = htmx.onLoad(function (elt) { + elt.setAttribute("foo", "bar"); + }); + var server = this.server; + setTimeout(function() { + try { + var div = make("
    "); + div.click(); + server.respond(); + byId("d1").getAttribute("foo").should.equal("bar"); + done(); + } finally { + htmx.off("htmx:load", helper); + } + }, 10) + }); + + it('triggers properly', function () { + var div = make("
    "); + var myEventCalled = false; + var detailStr = ""; + htmx.on("myEvent", function(evt){ + myEventCalled = true; + detailStr = evt.detail.str; + }) + htmx.trigger(div, "myEvent", {str:"foo"}) + + myEventCalled.should.equal(true); + detailStr.should.equal("foo"); + }); + + it('triggers properly w/ selector', function () { + var div = make("
    "); + var myEventCalled = false; + var detailStr = ""; + htmx.on("myEvent", function(evt){ + myEventCalled = true; + detailStr = evt.detail.str; + }) + htmx.trigger("#div1", "myEvent", {str:"foo"}) + + myEventCalled.should.equal(true); + detailStr.should.equal("foo"); + }); + + it('triggers with no details properly', function () { + var div = make("
    "); + var myEventCalled = false; + htmx.on("myEvent", function(evt){ + myEventCalled = true; + }) + htmx.trigger(div, "myEvent") + myEventCalled.should.equal(true); + }); + + it('should find properly', function(){ + var div = make("
    "); + div.should.equal(htmx.find("#d1")); + div.should.equal(htmx.find(".c1")); + div.should.equal(htmx.find(".c2")); + div.should.equal(htmx.find(".c1.c2")); + }); + + it('should find properly from elt', function(){ + var div = make("
    "); + htmx.find(div, "a").id.should.equal('a1'); + }); + + it('should find all properly', function(){ + var div = make("
    "); + htmx.findAll(".c1").length.should.equal(3); + htmx.findAll(".c2").length.should.equal(2); + htmx.findAll(".c3").length.should.equal(1); + }); + + it('should find all properly from elt', function(){ + var div = make("
    "); + htmx.findAll(div, ".c1").length.should.equal(3); + htmx.findAll(div, ".c2").length.should.equal(2); + htmx.findAll(div,".c3").length.should.equal(1); + }); + + it('should find closest element properly', function () { + var div = make("
    "); + var a = htmx.find(div, "a"); + htmx.closest(a, "div").should.equal(div); + }); + + it('should remove element properly', function () { + var div = make("
    "); + var a = htmx.find(div, "a"); + htmx.remove(a); + div.innerHTML.should.equal(""); + }); + + it('should remove element properly w/ selector', function () { + var div = make("
    "); + var a = htmx.find(div, "a"); + htmx.remove("#a1"); + div.innerHTML.should.equal(""); + }); + + it('should add class properly', function () { + var div = make("
    "); + div.classList.contains("foo").should.equal(false); + htmx.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + }); + + + it('should add class properly w/ selector', function () { + var div = make("
    "); + div.classList.contains("foo").should.equal(false); + htmx.addClass("#div1", "foo"); + div.classList.contains("foo").should.equal(true); + }); + + it('should add class properly after delay', function (done) { + var div = make("
    "); + div.classList.contains("foo").should.equal(false); + htmx.addClass(div, "foo", 10); + div.classList.contains("foo").should.equal(false); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + done(); + }, 20); + }); + + it('should remove class properly', function () { + var div = make("
    "); + htmx.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + htmx.removeClass(div, "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should remove class properly w/ selector', function () { + var div = make("
    "); + htmx.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + htmx.removeClass("#div1", "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should add class properly after delay', function (done) { + var div = make("
    "); + htmx.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + htmx.removeClass(div, "foo", 10); + div.classList.contains("foo").should.equal(true); + setTimeout(function () { + div.classList.contains("foo").should.equal(false); + done(); + }, 20); + }); + + it('should toggle class properly', function () { + var div = make("
    "); + div.classList.contains("foo").should.equal(false); + htmx.toggleClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + htmx.toggleClass(div, "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should toggle class properly w/ selector', function () { + var div = make("
    "); + div.classList.contains("foo").should.equal(false); + htmx.toggleClass("#div1", "foo"); + div.classList.contains("foo").should.equal(true); + htmx.toggleClass("#div1", "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should take class properly', function () { + var div1 = make("
    "); + var div2 = make("
    "); + var div3 = make("
    "); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + htmx.takeClass(div1, "foo"); + + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + htmx.takeClass(div2, "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(true); + div3.classList.contains("foo").should.equal(false); + + htmx.takeClass(div3, "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(true); + }); + + it('should take class properly w/ selector', function () { + var div1 = make("
    "); + var div2 = make("
    "); + var div3 = make("
    "); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + htmx.takeClass("#div1", "foo"); + + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + htmx.takeClass("#div2", "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(true); + div3.classList.contains("foo").should.equal(false); + + htmx.takeClass("#div3", "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(true); + }); + + it('logAll works', function () { + var initialLogger = htmx.config.logger + try { + htmx.logAll(); + } finally { + htmx.config.logger = initialLogger; + } + }); + + it('eval can be suppressed', function () { + var calledEvent = false; + var handler = htmx.on("htmx:evalDisallowedError", function(){ + calledEvent = true; + }); + try { + htmx.config.allowEval = false; + should.equal(htmx._("tokenizeString"), undefined); + } finally { + htmx.config.allowEval = true; + htmx.off("htmx:evalDisallowedError", handler); + } + calledEvent.should.equal(true); + }); + + it('ajax api works', function() + { + this.server.respondWith("GET", "/test", "foo!"); + var div = make("
    "); + htmx.ajax("GET", "/test", div) + this.server.respond(); + div.innerHTML.should.equal("foo!"); + }); + + it('ajax api works by ID', function() + { + this.server.respondWith("GET", "/test", "foo!"); + var div = make("
    "); + htmx.ajax("GET", "/test", "#d1") + this.server.respond(); + div.innerHTML.should.equal("foo!"); + }); + + it('ajax api works with swapSpec', function() + { + this.server.respondWith("GET", "/test", "

    foo!

    "); + var div = make("
    "); + htmx.ajax("GET", "/test", {target: "#target", swap:"outerHTML"}); + this.server.respond(); + div.innerHTML.should.equal('

    foo!

    '); + }); + + it('ajax returns a promise', function(done) + { + // in IE we do not return a promise + if (typeof Promise !== "undefined") { + this.server.respondWith("GET", "/test", "foo!"); + var div = make("
    "); + var promise = htmx.ajax("GET", "/test", "#d1"); + this.server.respond(); + div.innerHTML.should.equal("foo!"); + promise.then(function(){ + done(); + }) + } else { + done(); + } + }); + + it('ajax api can pass parameters', function() + { + this.server.respondWith("POST", "/test", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("
    "); + htmx.ajax("POST", "/test", {target:"#d1", values:{i1: 'test'}}) + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('can re-init with new attributes', function () { + this.server.respondWith("PATCH", "/test", "patch"); + this.server.respondWith("DELETE", "/test", "delete"); + + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("patch"); + + div.removeAttribute("hx-patch"); + div.setAttribute("hx-delete", "/test"); + htmx.process(div); + + div.click(); + this.server.respond(); + div.innerHTML.should.equal("delete"); + }) + +}) diff --git a/www/static/test/1.9.2/test/core/events.js b/www/static/test/1.9.2/test/core/events.js new file mode 100644 index 000000000..e9c04256d --- /dev/null +++ b/www/static/test/1.9.2/test/core/events.js @@ -0,0 +1,657 @@ +describe("Core htmx Events", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it("htmx:load fires properly", function () { + var called = false; + var handler = htmx.on("htmx:load", function (evt) { + called = true; + }); + try { + this.server.respondWith("GET", "/test", ""); + this.server.respondWith("GET", "/test", "
    "); + var div = make("
    "); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:load", handler); + } + }); + + it("htmx:configRequest allows attribute addition", function () { + var handler = htmx.on("htmx:configRequest", function (evt) { + evt.detail.parameters['param'] = "true"; + }); + try { + var param = null; + this.server.respondWith("POST", "/test", function (xhr) { + param = getParameters(xhr)['param']; + xhr.respond(200, {}, ""); + }); + var div = make("
    "); + div.click(); + this.server.respond(); + param.should.equal("true"); + } finally { + htmx.off("htmx:configRequest", handler); + } + }); + + it("htmx:configRequest is also dispatched in kebab-case", function () { + var handler = htmx.on("htmx:config-request", function (evt) { + evt.detail.parameters['param'] = "true"; + }); + try { + var param = null; + this.server.respondWith("POST", "/test", function (xhr) { + param = getParameters(xhr)['param']; + xhr.respond(200, {}, ""); + }); + var div = make("
    "); + div.click(); + this.server.respond(); + param.should.equal("true"); + } finally { + htmx.off("htmx:config-request", handler); + } + }); + + it("events are only dispatched once if kebab and camel case match", function () { + var invoked = 0; + var handler = htmx.on("custom", function () { + invoked = invoked + 1 + }); + try { + var div = make("
    "); + htmx.trigger(div, "custom"); + invoked.should.equal(1); + } finally { + htmx.off("custom", handler); + } + }); + + it("htmx:configRequest allows attribute removal", function () { + var param = "foo"; + var handler = htmx.on("htmx:configRequest", function (evt) { + delete evt.detail.parameters['param']; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + param = getParameters(xhr)['param']; + xhr.respond(200, {}, ""); + }); + var div = make("
    "); + div.click(); + this.server.respond(); + should.equal(param, undefined); + } finally { + htmx.off("htmx:configRequest", handler); + } + }); + + it("htmx:configRequest allows header tweaking", function () { + var header = "foo"; + var handler = htmx.on("htmx:configRequest", function (evt) { + evt.detail.headers['X-My-Header'] = "bar"; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + header = xhr.requestHeaders['X-My-Header']; + xhr.respond(200, {}, ""); + }); + var div = make("
    "); + div.click(); + this.server.respond(); + should.equal(header, "bar"); + } finally { + htmx.off("htmx:configRequest", handler); + } + }); + + it("htmx:configRequest on form gives access to submit event", function () { + var submitterId; + var handler = htmx.on("htmx:configRequest", function (evt) { + evt.detail.headers['X-Submitter-Id'] = evt.detail.triggeringEvent.submitter.id; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + submitterId = xhr.requestHeaders['X-Submitter-Id'] + xhr.respond(200, {}, ""); + }); + make('
    '); + var btn = byId('b1'); + btn.click(); + this.server.respond(); + should.equal(submitterId, "b1") + } finally { + htmx.off("htmx:configRequest", handler); + } + }); + + it("htmx:afterSwap is called when replacing outerHTML", function () { + var called = false; + var handler = htmx.on("htmx:afterSwap", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterSwap", handler); + } + }); + + it("htmx:oobBeforeSwap is called before swap", function () { + var called = false; + var handler = htmx.on("htmx:oobBeforeSwap", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "
    Baz
    "); + }); + var oob = make('
    Blip
    '); + var div = make(""); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("Baz"); + should.equal(called, true); + } finally { + htmx.off("htmx:oobBeforeSwap", handler); + } + }); + + it("htmx:oobBeforeSwap can abort a swap", function () { + var called = false; + var handler = htmx.on("htmx:oobBeforeSwap", function (evt) { + called = true; + evt.preventDefault(); + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "
    Baz
    "); + }); + var oob = make('
    Blip
    '); + var div = make(""); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("Blip"); + should.equal(called, true); + } finally { + htmx.off("htmx:oobBeforeSwap", handler); + } + }); + + + it("htmx:oobBeforeSwap is not called on an oob miss", function () { + var called = false; + var handler = htmx.on("htmx:oobBeforeSwap", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "
    Baz
    "); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, false); + } finally { + htmx.off("htmx:oobBeforeSwap", handler); + } + }); + + it("htmx:oobAfterSwap is called after swap", function () { + var called = false; + var handler = htmx.on("htmx:oobAfterSwap", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "
    Baz
    "); + }); + var oob = make('
    Blip
    '); + var div = make(""); + div.click(); + this.server.respond(); + byId("d1").innerHTML.should.equal("Baz"); + should.equal(called, true); + } finally { + htmx.off("htmx:oobAfterSwap", handler); + } + }); + + it("htmx:oobAfterSwap is not called on an oob miss", function () { + var called = false; + var handler = htmx.on("htmx:oobAfterSwap", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "
    Baz
    "); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, false); + } finally { + htmx.off("htmx:oobAfterSwap", handler); + } + }); + + it("htmx:afterSettle is called once when replacing outerHTML", function () { + var called = 0; + var handler = htmx.on("htmx:afterSettle", function (evt) { + called++; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, 1); + } finally { + htmx.off("htmx:afterSettle", handler); + } + }); + + it("htmx:afterSettle is called once when replacing outerHTML with whitespace", function () { + var called = 0; + var handler = htmx.on("htmx:afterSettle", function (evt) { + called++; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "\n"); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, 1); + } finally { + htmx.off("htmx:afterSettle", handler); + } + }); + + it("htmx:afterSettle is called twice when replacing outerHTML with whitespace separated elements", function () { + var called = 0; + var handler = htmx.on("htmx:afterSettle", function (evt) { + called++; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, "\n Foo"); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, 2); + } finally { + htmx.off("htmx:afterSettle", handler); + } + }); + + it("htmx:afterRequest is called after a successful request", function () { + var called = false; + var handler = htmx.on("htmx:afterRequest", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterRequest", handler); + } + }); + + it("htmx:afterOnLoad is called after a successful request", function () { + var called = false; + var handler = htmx.on("htmx:afterOnLoad", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterOnLoad", handler); + } + }); + + it("htmx:afterRequest is called after a failed request", function () { + var called = false; + var handler = htmx.on("htmx:afterRequest", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(500, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterRequest", handler); + } + }); + + it("htmx:sendError is called after a failed request", function (done) { + var called = false; + var handler = htmx.on("htmx:sendError", function (evt) { + called = true; + }); + this.server.restore(); // turn off server mock so connection doesn't work + var div = make(""); + div.click(); + setTimeout(function () { + htmx.off("htmx:sendError", handler); + should.equal(called, true); + done(); + }, 30); + }); + + it("htmx:afterRequest is called when replacing outerHTML", function () { + var called = false; + var handler = htmx.on("htmx:afterRequest", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterRequest", handler); + } + }); + + it("htmx:afterOnLoad is called when replacing outerHTML", function () { + var called = false; + var handler = htmx.on("htmx:afterOnLoad", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterOnLoad", handler); + } + }); + + it("htmx:beforeProcessNode is called when replacing outerHTML", function () { + var called = false; + var handler = htmx.on("htmx:beforeProcessNode", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:beforeProcessNode", handler); + } + }); + + it("htmx:beforeProcessNode allows htmx attribute tweaking", function () { + var called = false; + var handler = htmx.on("htmx:beforeProcessNode", function (evt) { + evt.target.setAttribute("hx-post", "/success") + called = true; + }); + try { + this.server.respondWith("POST", "/success", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:beforeProcessNode", handler); + } + }); + + it("htmx:afterProcessNode is called after replacing outerHTML", function () { + var called = false; + var handler = htmx.on("htmx:afterProcessNode", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterProcessNode", handler); + } + }); + + it("htmx:afterRequest is called when targeting a parent div", function () { + var called = false; + var handler = htmx.on("htmx:afterRequest", function (evt) { + called = true; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make("
    "); + var button = byId('b1'); + button.click(); + this.server.respond(); + should.equal(called, true); + } finally { + htmx.off("htmx:afterRequest", handler); + } + }); + + it("adding an error in htmx:configRequest stops the request", function () { + try { + var handler = htmx.on("htmx:configRequest", function (evt) { + evt.detail.errors.push("An error"); + }); + var request = false; + this.server.respondWith("POST", "/test", function (xhr) { + request = true; + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(request, false); + } finally { + htmx.off("htmx:configRequest", handler); + } + }); + + it("preventDefault() in htmx:configRequest stops the request", function () { + try { + var handler = htmx.on("htmx:configRequest", function (evt) { + evt.preventDefault(); + }); + var request = false; + this.server.respondWith("POST", "/test", function (xhr) { + request = true; + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(request, false); + } finally { + htmx.off("htmx:configRequest", handler); + } + }); + + it("preventDefault() in the htmx:beforeRequest event cancels the request", function () { + try { + var handler = htmx.on("htmx:beforeRequest", function (evt) { + evt.preventDefault(); + }); + var request = false; + this.server.respondWith("POST", "/test", function (xhr) { + request = true; + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(request, false); + } finally { + htmx.off("htmx:beforeRequest", handler); + } + }); + + it("preventDefault() in the htmx:beforeOnLoad event cancels the swap", function () { + try { + var handler = htmx.on("htmx:beforeOnLoad", function (evt) { + evt.preventDefault(); + }); + var request = false; + this.server.respondWith("POST", "/test", function (xhr) { + request = true; + xhr.respond(200, {}, "Bar"); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(request, true); + div.innerText.should.equal("Foo"); + } finally { + htmx.off("htmx:beforeOnLoad", handler); + } + }); + + it("htmx:afterRequest event contains 'successful' and 'failed' properties indicating success after successful request", function () { + var successful = false; + var failed = true; + var handler = htmx.on("htmx:afterRequest", function (evt) { + successful = evt.detail.successful; + failed = evt.detail.failed; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(200, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(successful, true); + should.equal(failed, false); + } finally { + htmx.off("htmx:afterRequest", handler); + } + }); + + it("htmx:afterRequest event contains 'successful' and 'failed' properties indicating failure after failed request", function () { + var successful = true; + var failed = false; + var handler = htmx.on("htmx:afterRequest", function (evt) { + successful = evt.detail.successful; + failed = evt.detail.failed; + }); + try { + this.server.respondWith("POST", "/test", function (xhr) { + xhr.respond(500, {}, ""); + }); + var div = make(""); + div.click(); + this.server.respond(); + should.equal(successful, false); + should.equal(failed, true); + } finally { + htmx.off("htmx:afterRequest", handler); + } + }); + + + it("htmx:confirm can cancel request", function () { + var allow = false; + var handler = htmx.on("htmx:confirm", function (evt) { + evt.preventDefault(); + if (allow) { + evt.detail.issueRequest(); + } + }); + + try { + this.server.respondWith("GET", "/test", "updated"); + var div = make("
    "); + div.click(); + this.server.respond(); + div.innerHTML.should.equal(""); + allow = true; + div.click(); + this.server.respond(); + div.innerHTML.should.equal("updated"); + } finally { + htmx.off("htmx:load", handler); + } + }); + + it("has updated target available when target set via htmx:beforeSwap", function () { + + var targetWasUpdatedInAfterSwapHandler = false; + + var beforeSwapHandler = htmx.on("htmx:beforeSwap", function (evt) { + console.log("beforeSwap", evt.detail.target, byId('d2')); + evt.detail.target = byId('d2'); + }); + var afterSwapHandler = htmx.on("htmx:afterSwap", function (evt) { + console.log("afterSwap", evt.detail.target, byId('d2')); + targetWasUpdatedInAfterSwapHandler = evt.detail.target === byId('d2'); + }); + + try { + this.server.respondWith("GET", "/test", "updated"); + make("
    "); + var div = byId('d0'); + div.click(); + this.server.respond(); + targetWasUpdatedInAfterSwapHandler.should.equal(true); + } finally { + htmx.off("htmx:beforeSwap", beforeSwapHandler); + htmx.off("htmx:afterSwap", afterSwapHandler); + } + }); + +}); diff --git a/www/static/test/1.9.2/test/core/headers.js b/www/static/test/1.9.2/test/core/headers.js new file mode 100644 index 000000000..e7d1ec258 --- /dev/null +++ b/www/static/test/1.9.2/test/core/headers.js @@ -0,0 +1,229 @@ +describe("Core htmx AJAX headers", function () { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it("should include the HX-Request header", function () { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.requestHeaders['HX-Request'].should.be.equal('true'); + xhr.respond(200, {}, ""); + }); + var div = make('
    '); + div.click(); + this.server.respond(); + }) + + it("should include the HX-Trigger header", function () { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.requestHeaders['HX-Trigger'].should.equal('d1'); + xhr.respond(200, {}, ""); + }); + var div = make('
    '); + div.click(); + this.server.respond(); + }) + + it("should include the HX-Trigger-Name header", function () { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.requestHeaders['HX-Trigger-Name'].should.equal('n1'); + xhr.respond(200, {}, ""); + }); + var div = make(''); + div.click(); + this.server.respond(); + }) + + it("should include the HX-Target header", function () { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.requestHeaders['HX-Target'].should.equal('d1'); + xhr.respond(200, {}, ""); + }); + var div = make('
    '); + div.click(); + this.server.respond(); + }) + + it("should handle simple string HX-Trigger response header properly", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "foo"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("foo", function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should handle dot path HX-Trigger response header properly", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "foo.bar"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("foo.bar", function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should handle simple string HX-Trigger response header in different case properly", function () { + this.server.respondWith("GET", "/test", [200, {"hx-trigger": "foo"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("foo", function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should handle a namespaced HX-Trigger response header properly", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "namespace:foo"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("namespace:foo", function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should handle basic JSON HX-Trigger response header properly", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "{\"foo\":null}"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("foo", function (evt) { + invokedEvent = true; + should.equal(null, evt.detail.value); + evt.detail.elt.should.equal(div); + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should handle JSON with array arg HX-Trigger response header properly", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "{\"foo\":[1, 2, 3]}"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("foo", function (evt) { + invokedEvent = true; + evt.detail.elt.should.equal(div); + evt.detail.value.should.deep.equal([1, 2, 3]); + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should handle JSON with array arg HX-Trigger response header properly", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "{\"foo\":{\"a\":1, \"b\":2}}"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + div.addEventListener("foo", function (evt) { + invokedEvent = true; + evt.detail.elt.should.equal(div); + evt.detail.a.should.equal(1); + evt.detail.b.should.equal(2); + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + }) + + it("should survive malformed JSON in HX-Trigger response header", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "{not: valid}"}, ""]); + + var div = make('
    '); + div.click(); + this.server.respond(); + }) + + it("should handle simple string HX-Trigger response header properly w/ outerHTML swap", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger": "foo"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + var handler = htmx.on('foo', function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + htmx.off('foo', handler); + }) + + it("should handle HX-Retarget", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Retarget": "#d2"}, "Result"]); + + var div1 = make('
    '); + var div2 = make('
    '); + div1.click(); + this.server.respond(); + div1.innerHTML.should.equal(""); + div2.innerHTML.should.equal("Result"); + }) + + it("should handle HX-Reswap", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Reswap": "innerHTML"}, "Result"]); + + var div1 = make('
    '); + div1.click(); + this.server.respond(); + div1.innerHTML.should.equal("Result"); + }) + + it("should handle simple string HX-Trigger-After-Swap response header properly w/ outerHTML swap", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger-After-Swap": "foo"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + var handler = htmx.on('foo', function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + htmx.off('foo', handler); + }) + + it("should handle simple string HX-Trigger-After-Settle response header properly w/ outerHTML swap", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Trigger-After-Settle": "foo"}, ""]); + + var div = make('
    '); + var invokedEvent = false; + var handler = htmx.on('foo', function (evt) { + invokedEvent = true; + }); + div.click(); + this.server.respond(); + invokedEvent.should.equal(true); + htmx.off('foo', handler); + }) + + + it("should change body content on HX-Location", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Location": '{"path":"/test2", "target":"#testdiv"}'}, ""]); + this.server.respondWith("GET", "/test2", [200, {}, "
    Yay! Welcome
    "]); + var div = make('
    '); + div.click(); + this.server.respond(); + this.server.respond(); + div.innerHTML.should.equal('
    Yay! Welcome
    '); + }) +}); diff --git a/www/static/test/1.9.2/test/core/internals.js b/www/static/test/1.9.2/test/core/internals.js new file mode 100644 index 000000000..2da08457d --- /dev/null +++ b/www/static/test/1.9.2/test/core/internals.js @@ -0,0 +1,135 @@ +describe("Core htmx internals Tests", function() { + + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it("makeFragment works with janky stuff", function(){ + htmx._("makeFragment")("").tagName.should.equal("BODY"); + htmx._("makeFragment")("").tagName.should.equal("BODY"); + + //NB - the tag name should be the *parent* element hosting the HTML since we use the fragment children + // for the swap + htmx._("makeFragment")("").tagName.should.equal("TR"); + htmx._("makeFragment")("").tagName.should.equal("TABLE"); + htmx._("makeFragment")("").tagName.should.equal("COLGROUP"); + htmx._("makeFragment")("").tagName.should.equal("TBODY"); + }) + + it("makeFragment works with template wrapping", function(){ + htmx.config.useTemplateFragments = true; + try { + htmx._("makeFragment")("").children.length.should.equal(0); + htmx._("makeFragment")("").children.length.should.equal(0); + + var fragment = htmx._("makeFragment")(""); + fragment.firstElementChild.tagName.should.equal("TD"); + + fragment = htmx._("makeFragment")(""); + fragment.firstElementChild.tagName.should.equal("THEAD"); + + fragment = htmx._("makeFragment")(""); + fragment.firstElementChild.tagName.should.equal("COL"); + + fragment = htmx._("makeFragment")(""); + fragment.firstElementChild.tagName.should.equal("TR"); + + } finally { + htmx.config.useTemplateFragments = false; + } + }) + + + it("makeFragment works with template wrapping and funky combos", function(){ + htmx.config.useTemplateFragments = true; + try { + var fragment = htmx._("makeFragment")("
    "); + fragment.children[0].tagName.should.equal("TD"); + fragment.children[1].tagName.should.equal("DIV"); + } finally { + htmx.config.useTemplateFragments = false; + } + }) + + it("set header works with non-ASCII values", function(){ + var xhr = new XMLHttpRequest(); + xhr.open("GET", "/dummy"); + htmx._("safelySetHeaderValue")(xhr, "Example", "привет"); + // unfortunately I can't test the value :/ + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest + }) + + it("handles parseInterval correctly", function() { + chai.expect(htmx.parseInterval("1ms")).to.be.equal(1); + chai.expect(htmx.parseInterval("300ms")).to.be.equal(300); + chai.expect(htmx.parseInterval("1s")).to.be.equal(1000) + chai.expect(htmx.parseInterval("1.5s")).to.be.equal(1500) + chai.expect(htmx.parseInterval("2s")).to.be.equal(2000) + + chai.expect(htmx.parseInterval(null)).to.be.undefined + chai.expect(htmx.parseInterval("")).to.be.undefined + chai.expect(htmx.parseInterval("undefined")).to.be.undefined + chai.expect(htmx.parseInterval("true")).to.be.undefined + chai.expect(htmx.parseInterval("false")).to.be.undefined + }) + + it("tokenizes correctly", function() { + chai.expect(htmx._("tokenizeString")("a,")).to.be.deep.equal(['a', ',']); + chai.expect(htmx._("tokenizeString")("aa,")).to.be.deep.equal(['aa', ',']); + chai.expect(htmx._("tokenizeString")("aa,aa")).to.be.deep.equal(['aa', ',', 'aa']); + chai.expect(htmx._("tokenizeString")("aa.aa")).to.be.deep.equal(['aa', '.', 'aa']); + }) + + it("tags respond correctly to shouldCancel", function() { + var anchorThatShouldCancel = make(""); + htmx._("shouldCancel")({type:'click'}, anchorThatShouldCancel).should.equal(true); + + var anchorThatShouldCancel = make(""); + htmx._("shouldCancel")({type:'click'}, anchorThatShouldCancel).should.equal(true); + + var anchorThatShouldNotCancel = make(""); + htmx._("shouldCancel")({type:'click'}, anchorThatShouldNotCancel).should.equal(false); + + var form = make("
    "); + htmx._("shouldCancel")({type:'submit'}, form).should.equal(true); + + var form = make("
    "); + var input = byId("i1"); + htmx._("shouldCancel")({type:'click'}, input).should.equal(true); + + var form = make("
    '); + var input = byId('i1'); + var button = byId('b1'); + button.focus(); + var vals = htmx._('getInputValues')(form).values; + vals['foo'].should.equal('bar'); + vals['do'].should.equal('rey'); + vals['btn'].should.equal('bar'); + }) + + it('form includes last focused submit', function () { + var form = make('
    '); + var input = byId('i1'); + var button = byId('s1'); + button.focus(); + var vals = htmx._('getInputValues')(form).values; + vals['foo'].should.equal('bar'); + vals['do'].should.equal('rey'); + vals['s1'].should.equal('bar'); + }) + + it('form does not include button when focus is lost', function () { + var form = make('
    '); + var input = byId('i1'); + var button = byId('s1'); + button.focus(); + input.focus(); + var vals = htmx._('getInputValues')(form).values; + vals['foo'].should.equal('bar'); + vals['do'].should.equal('rey'); + should.equal(vals['s1'], undefined); + }) + + it('form does not include button when focus is lost outside of form', function () { + var form = make('
    '); + var anchor = make(''); + var button = byId('s1'); + button.focus(); + anchor.focus(); + var vals = htmx._('getInputValues')(form).values; + vals['foo'].should.equal('bar'); + vals['do'].should.equal('rey'); + should.equal(vals['s1'], undefined); + }) + + it('form includes button name and value if button has nested elements when clicked', function () { + var form = make('
    '); + var nestedElt = byId('span1'); + nestedElt.click(); + var vals = htmx._('getInputValues')(form).values; + vals['do'].should.equal('rey'); + }) + +}); + diff --git a/www/static/test/1.9.2/test/core/perf.js b/www/static/test/1.9.2/test/core/perf.js new file mode 100644 index 000000000..c461aee17 --- /dev/null +++ b/www/static/test/1.9.2/test/core/perf.js @@ -0,0 +1,64 @@ +describe("Core htmx perf Tests", function() { + + var HTMX_HISTORY_CACHE_NAME = "htmx-history-cache"; + + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); + }); + + function stringRepeat(str, num) { + num = Number(num); + + var result = ''; + while (true) { + if (num & 1) { // (1) + result += str; + } + num >>>= 1; // (2) + if (num <= 0) break; + str += str; + } + + return result; + } + + + it("history implementation should be fast", function(){ + // create an entry with a large content string (256k) and see how fast we can write and read it + // to local storage as a single entry + var entry = {url: stringRepeat("x", 32), content:stringRepeat("x", 256*1024)} + var array = []; + for (var i = 0; i < 10; i++) { + array.push(entry); + } + var start = performance.now(); + var string = JSON.stringify(array); + localStorage.setItem(HTMX_HISTORY_CACHE_NAME, string); + var reReadString = localStorage.getItem(HTMX_HISTORY_CACHE_NAME); + var finalJson = JSON.parse(reReadString); + var end = performance.now(); + var timeInMs = end - start; + chai.assert(timeInMs < 300, "Should take less than 300ms on most platforms"); + }) + + it("history snapshot cleaning should be fast", function(){ + // + var workArea = getWorkArea(); + var html = "
    Yay, really large HTML documents are fun!
    \n"; + html = stringRepeat(html, 5 * 1024); // ~350K in size, about the size of CNN's body tag :p + workArea.insertAdjacentHTML("beforeend", html) + var start = performance.now(); + htmx._("cleanInnerHtmlForHistory")(workArea); + var end = performance.now(); + var timeInMs = end - start; + chai.assert(timeInMs < 50, "Should take less than 50ms on most platforms"); + }) + +}) \ No newline at end of file diff --git a/www/static/test/1.9.2/test/core/regressions.js b/www/static/test/1.9.2/test/core/regressions.js new file mode 100644 index 000000000..5a4785576 --- /dev/null +++ b/www/static/test/1.9.2/test/core/regressions.js @@ -0,0 +1,211 @@ +describe("Core htmx Regression Tests", function(){ + + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('SVGs process properly in IE11', function() + { + var btn = make('\n' + + '\n' + + '\n' + + '\n' + + '') + }); + + it ('Handles https://github.com/bigskysoftware/htmx/issues/4 properly', function() { + this.server.respondWith("GET", "/index2a.php", + "
    I came from message oob swap I should be second
    " + + "
    I came from a message2 oob swap I should be third but I am in the wrong spot
    " + + "I'm page2 content (non-swap) I should be first") + + var h1 = make("" + + "
    " + + "
    " + + "
    " + + "

    Kutty CLICK ME

    ") + h1.click(); + this.server.respond(); + htmx.find("#page2").innerHTML.should.equal("I'm page2 content (non-swap) I should be first") + htmx.find("#message").innerHTML.should.equal("I came from message oob swap I should be second") + htmx.find("#message2").innerHTML.should.equal("I came from a message2 oob swap I should be third but I am in the wrong spot") + }); + + it ('Handles https://github.com/bigskysoftware/htmx/issues/33 "empty values" properly', function() { + this.server.respondWith("POST", "/htmx.php", function (xhr) { + xhr.respond(200, {}, xhr.requestBody); + }); + + var form = make('
    \n' + + '\n' + + '\n' + + '
    ') + form.click(); + this.server.respond(); + form.innerHTML.should.equal("variable=") + }); + + it ('name=id doesnt cause an error', function(){ + this.server.respondWith("GET", "/test", "Foo
    ") + var div = make('
    Get It
    ') + div.click(); + this.server.respond(); + div.innerText.should.contain("Foo") + }); + + it ('empty id doesnt cause an error', function(){ + this.server.respondWith("GET", "/test", "Foo\n
    ") + var div = make('
    Get It
    ') + div.click(); + this.server.respond(); + div.innerText.should.contain("Foo") + }); + + it ('id with dot in value doesnt cause an error', function(){ + this.server.respondWith("GET", "/test", "Foo
    "); + var div = make('
    Get It
    '); + div.click(); + this.server.respond(); + div.innerText.should.contain("Foo"); + }); + + it ('@ symbol in attributes does not break requests', function(){ + this.server.respondWith("GET", "/test", "
    Foo
    "); + var div = make('
    Get It
    '); + div.click(); + this.server.respond(); + byId("d1").getAttribute('@foo').should.equal('bar'); + }); + + it ('@ symbol in attributes does not break attribute settling requests', function(){ + this.server.respondWith("GET", "/test", "
    Foo
    "); + var div = make('
    Foo
    '); + div.click(); + this.server.respond(); + byId("d1").getAttribute('@foo').should.equal('bar'); + }); + + it ('selected element with ID does not cause NPE when it disappears', function(){ + this.server.respondWith("GET", "/test", "
    Replaced
    "); + var input = make(''); + input.focus(); + input.click(); + this.server.respond(); + byId("d1").innerText.should.equal('Replaced'); + }); + + it('does not submit with a false condition on a form', function() { + this.server.respondWith("POST", "/test", "Submitted"); + var defaultPrevented = false; + htmx.on("click", function(evt) { + defaultPrevented = evt.defaultPrevented; + }) + var form = make('
    '); + form.click() + this.server.respond(); + defaultPrevented.should.equal(true); + }) + + it('two elements can listen for the same event on another element', function() { + this.server.respondWith("GET", "/test", "triggered"); + + make('
    ' + + '
    '); + + + var div1 = byId("d1"); + var div2 = byId("d2"); + + document.body.click(); + this.server.respond(); + + div2.innerHTML.should.equal("triggered"); + div1.innerHTML.should.equal("triggered"); + }) + + it('a form can reset based on the htmx:afterRequest event', function() { + this.server.respondWith("POST", "/test", "posted"); + //htmx.logAll(); + + var form = make('
    ' + + ' ' + + ' ' + + '
    '); + htmx.trigger(form, "htmx:load"); // have to manually trigger the load event for non-AJAX dynamic content + + var div1 = byId("d1"); + var input = byId("i1"); + input.value = "foo"; + var submit = byId("s1"); + + input.value.should.equal("foo"); + submit.click(); + this.server.respond(); + + div1.innerHTML.should.equal("posted"); + input.value.should.equal(""); // form should be reset + }) + + it('supports image maps', function() { + this.server.respondWith("GET", "/test", "triggered"); + + make('
    ' + + '
    ' + + ' ' + + '' + + ' ' + + ' Computer' + + ' ' + + '
    '); + + var div1 = byId("d1"); + var area = document.getElementsByTagName('area')[0]; + + area.click(); + this.server.respond(); + + div1.innerHTML.should.equal("triggered"); + }) + + it("supports unset on hx-select", function(){ + this.server.respondWith("GET", "/test", "FooBar"); + htmx.logAll(); + make('
    \n' + + ' \n' + + '
    ') + var btn = byId("b1"); + btn.click() + this.server.respond(); + + btn.innerText.should.equal("FooBar"); + }) + + + it("can trigger swaps from fields that don't support setSelectionRange", function(){ + const template = '
    \n' + + '\n' + + '
    '; + + const response = '
    \n' + + '\n' + + '
    '; + this.server.respondWith("GET", "/test", response); + make(template); + var input = byId("id_email"); + // HTMX only attempts to restore the selection on inputs that have a current selection and are active. + // additionally we can't set the selection on email inputs (that's the whole bug) so start as a text input where you can set selection + // and replace with an email + input.focus(); + input.selectionStart = 3; + input.selectionEnd = 3; + input.click(); + this.server.respond(); + var input = byId("id_email"); + input.value.should.equal("supertest@test.com"); + }); +}); diff --git a/www/static/test/1.9.2/test/core/security.js b/www/static/test/1.9.2/test/core/security.js new file mode 100644 index 000000000..d4be72162 --- /dev/null +++ b/www/static/test/1.9.2/test/core/security.js @@ -0,0 +1,32 @@ +describe("security options", function() { + + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it("can disable a single elt", function(){ + this.server.respondWith("GET", "/test", "Clicked!"); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Initial"); + }) + + it("can disable a parent elt", function(){ + this.server.respondWith("GET", "/test", "Clicked!"); + + var div = make('
    ') + var btn = byId("b1"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Initial"); + }) + + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/core/tokenizer.js b/www/static/test/1.9.2/test/core/tokenizer.js new file mode 100644 index 000000000..3071ad9b1 --- /dev/null +++ b/www/static/test/1.9.2/test/core/tokenizer.js @@ -0,0 +1,48 @@ +describe("Core htmx tokenizer tests", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + function tokenize(str) { + return htmx._("tokenizeString")(str); + } + + function tokenizeTest(str, result) { + return tokenize(str).should.deep.equal(result); + } + + it('tokenizes properly', function() + { + tokenizeTest("", []); + tokenizeTest(" ", [" ", " "]); + tokenizeTest("(", ["("]); + tokenizeTest("()", ["(", ")"]); + tokenizeTest("(,)", ["(", ",", ")"]); + tokenizeTest(" ( ) ", [" ", "(", " ", ")", " "]); + tokenizeTest(" && ) ", [" ", "&", "&", " ", ")", " "]); + tokenizeTest(" && ) 'asdf'", [" ", "&", "&", " ", ")", " ", "'asdf'"]); + tokenizeTest(" && ) ',asdf'", [" ", "&", "&", " ", ")", " ", "',asdf'"]); + tokenizeTest('",asdf"', ['",asdf"']); + tokenizeTest('&& ) ",asdf"', ["&", "&", " ", ")", " ", '",asdf"']); + }); + + it('generates conditionals property', function() + { + var tokens = tokenize("[code==4||(code==5&&foo==true)]"); + var conditional = htmx._("maybeGenerateConditional")(null, tokens); + var func = eval(conditional); + func({code: 5, foo: true}).should.equal(true); + func({code: 5, foo: false}).should.equal(false); + func({code: 4, foo: false}).should.equal(true); + func({code: 3, foo: true}).should.equal(false); + }); + + + + +}) diff --git a/www/static/test/1.9.2/test/core/validation.js b/www/static/test/1.9.2/test/core/validation.js new file mode 100644 index 000000000..428a4acce --- /dev/null +++ b/www/static/test/1.9.2/test/core/validation.js @@ -0,0 +1,198 @@ +describe("Core htmx client side validation tests", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('HTML5 required validation error prevents request', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + form.textContent.should.equal("No Request"); + form.click(); + this.server.respond(); + form.textContent.should.equal("No Request"); + byId("i1").value = "foo"; + form.click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('Novalidate skips form validation', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + form.textContent.should.equal("No Request"); + form.click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('Validation skipped for indirect form submission', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '' + + '
    '); + form.textContent.should.equal("No Request"); + byId("button").click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('Formnovalidate skips form validation', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '' + + '
    '); + form.textContent.should.equal("No Request"); + byId("button").click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('HTML5 pattern validation error prevents request', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + byId("i1").value = "xyz"; + form.textContent.should.equal("No Request"); + form.click(); + this.server.respond(); + form.textContent.should.equal("No Request"); + byId("i1").value = "abc"; + form.click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('Custom validation error prevents request', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + byId("i1").setCustomValidity("Nope"); + form.textContent.should.equal("No Request"); + form.click(); + this.server.respond(); + form.textContent.should.equal("No Request"); + byId("i1").setCustomValidity(""); + form.click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('hyperscript validation error prevents request', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + htmx.trigger(form, "htmx:load"); + byId("i1").value = "boo"; + form.textContent.should.equal("No Request"); + form.click(); + this.server.respond(); + form.textContent.should.equal("No Request"); + byId("i1").value = "foo"; + form.click(); + this.server.respond(); + form.textContent.should.equal("Clicked!"); + }); + + it('calls htmx:validation:failed on failure', function() + { + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + var calledEvent = false; + var handler = htmx.on(form, "htmx:validation:failed", function(){ + calledEvent = true; + }); + try { + form.click(); + this.server.respond(); + } finally { + htmx.off(form, handler); + } + calledEvent.should.equal(true); + }); + + it('calls htmx:validation:halted on failure', function() + { + var form = make('
    ' + + 'No Request' + + '' + + '
    '); + var errors = null; + var handler = htmx.on(form, "htmx:validation:halted", function(evt){ + errors = evt.detail.errors; + }); + try { + form.click(); + this.server.respond(); + } finally { + htmx.off(form, handler); + } + errors.length.should.equal(1); + byId("i1").should.equal(errors[0].elt); + errors[0].validity.valueMissing.should.equal(true); + }); + + + it('hx-validate can prevent a single input from submitting', function() + { + this.server.respondWith("POST", "/test", "Clicked!"); + var div = make("
    No Request
    ") + var form = make('
    '); + var input = byId("i1"); + + div.textContent.should.equal("No Request"); + + input.value = "abc"; + input.click(); + this.server.respond(); + div.textContent.should.equal("No Request"); + + input.value = "1bc"; + input.click(); + this.server.respond(); + div.textContent.should.equal("No Request"); + + input.value = "123"; + input.click(); + this.server.respond(); + div.textContent.should.equal("Clicked!"); + }); + +}) diff --git a/www/static/test/1.9.2/test/core/verbs.js b/www/static/test/1.9.2/test/core/verbs.js new file mode 100644 index 000000000..1d0711c2f --- /dev/null +++ b/www/static/test/1.9.2/test/core/verbs.js @@ -0,0 +1,44 @@ +describe("Core htmx AJAX Verbs", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('handles basic posts properly', function () { + this.server.respondWith("POST", "/test", "post"); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("post"); + }) + + it('handles basic put properly', function () { + this.server.respondWith("PUT", "/test", "put"); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("put"); + }) + + it('handles basic patch properly', function () { + this.server.respondWith("PATCH", "/test", "patch"); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("patch"); + }) + + it('handles basic delete properly', function () { + this.server.respondWith("DELETE", "/test", "delete"); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("delete"); + }) + +}); + diff --git a/www/static/test/1.9.2/test/ext/ajax-header.js b/www/static/test/1.9.2/test/ext/ajax-header.js new file mode 100644 index 000000000..0888ef3b5 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/ajax-header.js @@ -0,0 +1,21 @@ +describe("ajax-header extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('Sends the X-Requested-With header', function () { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, xhr.requestHeaders['X-Requested-With']) + }); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("XMLHttpRequest"); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/bad-extension.js b/www/static/test/1.9.2/test/ext/bad-extension.js new file mode 100644 index 000000000..fcf6a4384 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/bad-extension.js @@ -0,0 +1,27 @@ +describe("bad extension", function() { + htmx.defineExtension("bad-extension", { + onEvent : function(name, evt) {throw "onEvent"}, + transformResponse : function(text, xhr, elt) {throw "transformRequest"}, + isInlineSwap : function(swapStyle) {throw "isInlineSwap"}, + handleSwap : function(swapStyle, target, fragment, settleInfo) {throw "handleSwap"}, + encodeParameters : function(xhr, parameters, elt) {throw "encodeParmeters"} + } + ) + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('does not blow up rendering', function () { + this.server.respondWith("GET", "/test", "clicked!"); + var div = make('
    Click Me!
    ') + div.click(); + this.server.respond(); + div.innerHTML.should.equal("clicked!"); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/class-tools.js b/www/static/test/1.9.2/test/ext/class-tools.js new file mode 100644 index 000000000..0c5004b56 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/class-tools.js @@ -0,0 +1,55 @@ +describe("class-tools extension", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('adds classes properly', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.length, 0); + setTimeout(function(){ + should.equal(div.classList.contains("c1"), true); + done(); + }, 100); + }); + + it('removes classes properly', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.contains("foo"), true); + should.equal(div.classList.contains("bar"), true); + setTimeout(function(){ + should.equal(div.classList.contains("foo"), true); + should.equal(div.classList.contains("bar"), false); + done(); + }, 100); + }); + + it('adds classes properly w/ data-* prefix', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.length, 0); + setTimeout(function(){ + should.equal(div.classList.contains("c1"), true); + done(); + }, 100); + }); + + it('extension can be on parent', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.length, 0); + setTimeout(function(){ + should.equal(div.classList.contains("c1"), false); + should.equal(byId("d1").classList.contains("c1"), true); + done(); + }, 100); + }); + + +}) diff --git a/www/static/test/1.9.2/test/ext/client-side-templates.js b/www/static/test/1.9.2/test/ext/client-side-templates.js new file mode 100644 index 000000000..29206d21b --- /dev/null +++ b/www/static/test/1.9.2/test/ext/client-side-templates.js @@ -0,0 +1,30 @@ +describe("client-side-templates extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('works on basic mustache template', function () { + this.server.respondWith("GET", "/test", '{"foo":"bar"}'); + var btn = make('') + make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("*bar*"); + }); + + it('works on basic handlebars template', function () { + this.server.respondWith("GET", "/test", '{"foo":"bar"}'); + var btn = make('') + Handlebars.partials["hb1"] = Handlebars.compile("*{{foo}}*"); + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("*bar*"); + }); + + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/debug.js b/www/static/test/1.9.2/test/ext/debug.js new file mode 100644 index 000000000..4eeca295e --- /dev/null +++ b/www/static/test/1.9.2/test/ext/debug.js @@ -0,0 +1,19 @@ +describe("debug extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('works on basic request', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/disable-element.js b/www/static/test/1.9.2/test/ext/disable-element.js new file mode 100644 index 000000000..cde1ad229 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/disable-element.js @@ -0,0 +1,62 @@ +describe("disable-element extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('disables the triggering element during htmx request', function () { + // GIVEN: + // - A button triggering an htmx request with disable-element extension + // - The button is enabled + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}) + }); + var btn = make('') + btn.disabled.should.equal(false); + + // WHEN clicking + btn.click(); + + // THEN it's disabled + btn.disabled.should.equal(true); + + // WHEN server response has arrived + this.server.respond(); + + // THEN it's re-enabled + btn.disabled.should.equal(false); + }); + + it('disables the designated element during htmx request', function () { + // GIVEN: + // - A button triggering an htmx request with disable-element extension + // - Another button that needs to be disabled during the htmx request + // - Both buttons are enabled + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}) + }); + var btn = make('') + var btn2 = make('') + btn.disabled.should.equal(false); + btn2.disabled.should.equal(false); + + // WHEN clicking + btn.click(); + + // THEN it's not disabled, but the other one is + btn.disabled.should.equal(false); + btn2.disabled.should.equal(true); + + // WHEN server response has arrived + this.server.respond(); + + // THEN both buttons are back enabled + btn.disabled.should.equal(false); + btn2.disabled.should.equal(false); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/event-header.js b/www/static/test/1.9.2/test/ext/event-header.js new file mode 100644 index 000000000..a5a66cf58 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/event-header.js @@ -0,0 +1,23 @@ +describe("event-header extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('Sends the Triggering-Event header', function () { + this.server.respondWith("GET", "/test", function (xhr) { + xhr.respond(200, {}, xhr.requestHeaders['Triggering-Event']) + }); + var btn = make('') + btn.click(); + this.server.respond(); + var json = JSON.parse(btn.innerText); + json.type.should.equal("click"); + json.target.should.equal("button"); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/extension-swap.js b/www/static/test/1.9.2/test/ext/extension-swap.js new file mode 100644 index 000000000..0186b5250 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/extension-swap.js @@ -0,0 +1,60 @@ +describe("default extensions behavior", function() { + + var loadCalls, afterSwapCalls, afterSettleCalls; + + beforeEach(function () { + loadCalls = []; + this.server = makeServer(); + clearWorkArea(); + + htmx.defineExtension("ext-testswap", { + onEvent : function(name, evt) { + if (name === "htmx:load") { + loadCalls.push(evt.detail.elt); + } + }, + handleSwap: function (swapStyle, target, fragment, settleInfo) { + // simple outerHTML replacement for tests + var parentEl = target.parentElement; + parentEl.removeChild(target); + return [parentEl.appendChild(fragment)]; // return the newly added element + } + + }); + + }); + + afterEach(function () { + this.server.restore(); + clearWorkArea(); + htmx.removeExtension("ext-testswap"); + }); + + it('handleSwap: afterSwap and afterSettle triggered if extension defined on parent', function () { + this.server.respondWith("GET", "/test", ''); + var div = make('
    '); + var btn = div.firstChild; + btn.click() + this.server.respond(); + loadCalls.length.should.equal(1); + loadCalls[0].textContent.should.equal('Clicked!'); // the new button is loaded + }); + + it('handleSwap: new content is handled by htmx', function() { + this.server.respondWith("GET", "/test", ''); + this.server.respondWith("GET", "/test-inner", 'Loaded!'); + make('
    ').querySelector('button').click(); + + this.server.respond(); // call /test via button trigger=click + var btn = byId('test-ext-testswap'); + btn.textContent.should.equal('Clicked!'); + loadCalls.length.should.equal(1); + loadCalls[0].textContent.should.equal('Clicked!'); // the new button is loaded + + this.server.respond(); // call /test-inner via span trigger=load + btn.textContent.should.equal("Clicked!Loaded!"); + loadCalls.length.should.equal(2); + loadCalls[1].textContent.should.equal('Loaded!'); // the new span is loaded + }); + +}); diff --git a/www/static/test/1.9.2/test/ext/hyperscript.js b/www/static/test/1.9.2/test/ext/hyperscript.js new file mode 100644 index 000000000..6d49a2dae --- /dev/null +++ b/www/static/test/1.9.2/test/ext/hyperscript.js @@ -0,0 +1,64 @@ +describe("hyperscript integration", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('can trigger with a custom event', function () { + this.server.respondWith("GET", "/test", "Custom Event Sent!"); + var btn = make('') + htmx.trigger(btn, "htmx:load"); // have to manually trigger the load event for non-AJAX dynamic content + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Custom Event Sent!"); + }); + + it('can handle htmx driven events', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('') + htmx.trigger(btn, "htmx:load"); + btn.classList.contains("afterSettle").should.equal(false); + btn.click(); + this.server.respond(); + btn.classList.contains("afterSettle").should.equal(true); + }); + + it('can handle htmx error events', function () { + this.server.respondWith("GET", "/test", [404, {}, "Bad request"]); + var div = make('
    ') + var btn = make('') + htmx.trigger(btn, "htmx:load"); + btn.click(); + this.server.respond(); + div.innerHTML.startsWith("Response Status Error Code 404 from"); + }); + + it('hyperscript in non-htmx annotated nodes is evaluated', function () { + this.server.respondWith("GET", "/test", "
    "); + var btn = make('') + btn.click(); + this.server.respond(); + var newDiv = byId("d1"); + newDiv.click(); + newDiv.innerText.should.equal("Clicked..."); + }); + + it('hyperscript removal example works', function (done) { + this.server.respondWith("GET", "/test", "
    To Remove
    "); + var btn = make('') + btn.click(); + this.server.respond(); + var newDiv = byId("d1"); + newDiv.innerText.should.equal("To Remove") + setTimeout(function(){ + newDiv = byId("d1"); + should.equal(newDiv, null); + done(); + }, 100); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/include-vals.js b/www/static/test/1.9.2/test/ext/include-vals.js new file mode 100644 index 000000000..fc05a067b --- /dev/null +++ b/www/static/test/1.9.2/test/ext/include-vals.js @@ -0,0 +1,23 @@ +describe("include-vals extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('Includes values properly', function () { + var params = {}; + this.server.respondWith("POST", "/test", function (xhr) { + params = getParameters(xhr); + xhr.respond(200, {}, "clicked"); + }); + var btn = make('') + btn.click(); + this.server.respond(); + params['foo'].should.equal("bar"); + }); + +}); \ No newline at end of file diff --git a/www/static/test/1.9.2/test/ext/json-enc.js b/www/static/test/1.9.2/test/ext/json-enc.js new file mode 100644 index 000000000..ed805a17c --- /dev/null +++ b/www/static/test/1.9.2/test/ext/json-enc.js @@ -0,0 +1,136 @@ +// +describe("json-enc extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('handles basic post properly', function () { + var jsonResponseBody = JSON.stringify({}); + this.server.respondWith("POST", "/test", jsonResponseBody); + var div = make("
    click me
    "); + div.click(); + this.server.respond(); + this.server.lastRequest.response.should.equal("{}"); + }) + + it('handles basic put properly', function () { + var jsonResponseBody = JSON.stringify({}); + this.server.respondWith("PUT", "/test", jsonResponseBody); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + this.server.lastRequest.response.should.equal("{}"); + }) + + it('handles basic patch properly', function () { + var jsonResponseBody = JSON.stringify({}); + this.server.respondWith("PATCH", "/test", jsonResponseBody); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + this.server.lastRequest.response.should.equal("{}"); + }) + + it('handles basic delete properly', function () { + var jsonResponseBody = JSON.stringify({}); + this.server.respondWith("DELETE", "/test", jsonResponseBody); + var div = make('
    click me
    '); + div.click(); + this.server.respond(); + this.server.lastRequest.response.should.equal("{}"); + }) + + it('handles post with form parameters', function () { + + this.server.respondWith("POST", "/test", function (xhr) { + var values = JSON.parse(xhr.requestBody); + values.should.have.keys("username","password"); + values["username"].should.be.equal("joe"); + values["password"].should.be.equal("123456"); + var ans = { "passwordok": values["password"] == "123456"}; + xhr.respond(200, {}, JSON.stringify(ans)); + }); + + var html = make('
    ' + + ' ' + + ' ' + + ' '); + + byId("btnSubmit").click(); + this.server.respond(); + this.server.lastRequest.response.should.equal('{"passwordok":true}'); + }) + + it('handles put with form parameters', function () { + + this.server.respondWith("PUT", "/test", function (xhr) { + var values = JSON.parse(xhr.requestBody); + values.should.have.keys("username","password"); + values["username"].should.be.equal("joe"); + values["password"].should.be.equal("123456"); + var ans = { "passwordok": values["password"] == "123456"}; + xhr.respond(200, {}, JSON.stringify(ans)); + }); + + var html = make(' ' + + ' ' + + ' ' + + ' '); + + byId("btnSubmit").click(); + this.server.respond(); + this.server.lastRequest.response.should.equal('{"passwordok":true}'); + }) + + + it('handles patch with form parameters', function () { + + this.server.respondWith("PATCH", "/test", function (xhr) { + var values = JSON.parse(xhr.requestBody); + values.should.have.keys("username","password"); + values["username"].should.be.equal("joe"); + values["password"].should.be.equal("123456"); + var ans = { "passwordok": values["password"] == "123456"}; + xhr.respond(200, {}, JSON.stringify(ans)); + }); + + var html = make(' ' + + ' ' + + ' ' + + ' '); + + byId("btnSubmit").click(); + this.server.respond(); + this.server.lastRequest.response.should.equal('{"passwordok":true}'); + }) + + it('handles delete with form parameters', function () { + + this.server.respondWith("DELETE", "/test", function (xhr) { + var values = JSON.parse(xhr.requestBody); + values.should.have.keys("username","password"); + values["username"].should.be.equal("joe"); + values["password"].should.be.equal("123456"); + var ans = { "passwordok": values["password"] == "123456"}; + xhr.respond(200, {}, JSON.stringify(ans)); + }); + + var html = make(' ' + + ' ' + + ' ' + + ' '); + + byId("btnSubmit").click(); + this.server.respond(); + this.server.lastRequest.response.should.equal('{"passwordok":true}'); + }) + + + +}); + diff --git a/www/static/test/1.9.2/test/ext/loading-states.js b/www/static/test/1.9.2/test/ext/loading-states.js new file mode 100644 index 000000000..d73634d46 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/loading-states.js @@ -0,0 +1,167 @@ +describe("loading states extension", function () { + beforeEach(function () { + this.server = makeServer(); + this.clock = sinon.useFakeTimers(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + this.clock.restore(); + clearWorkArea(); + }); + + it('works on basic setup', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var element = make('
    '); + btn.click(); + element.style.display.should.be.equal("inline-block"); + this.server.respond(); + element.style.display.should.be.equal("none"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with custom display', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var element = make('
    '); + btn.click(); + element.style.display.should.be.equal("flex"); + this.server.respond(); + element.style.display.should.be.equal("none"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with classes', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var element = make('
    '); + btn.click(); + element.should.have.class("test"); + this.server.respond(); + element.should.not.have.class("test"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with classes removal', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var element = make('
    '); + btn.click(); + element.should.not.have.class("test"); + this.server.respond(); + element.should.have.class("test"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with disabling', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var element = make(''); + var element = make(''); + var element = make(''); + var element = make('
    '); + btn.click(); + element.should.have.class("test"); + this.clock.tick(1000); + element.should.not.have.class("test"); + this.server.respond(); + element.should.have.class("test"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with custom targets', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var element = make('
    '); + btn.click(); + element.should.have.class("test"); + this.server.respond(); + element.should.not.have.class("test"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with path filters', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make(''); + var matchingRequestElement = make('
    '); + var nonMatchingPathElement = make('
    '); + btn.click(); + matchingRequestElement.should.have.class("test"); + nonMatchingPathElement.should.not.have.class("test"); + this.server.respond(); + matchingRequestElement.should.not.have.class("test"); + nonMatchingPathElement.should.not.have.class("test"); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with scopes', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + var btn = make('
    '); + var element = make('
    '); + btn.getElementsByTagName("button")[0].click(); + element.should.not.have.class("test"); + this.server.respond(); + element.should.not.have.class("test"); + btn.getElementsByTagName("button")[0].innerHTML.should.equal("Clicked!"); + }); + + it('history restore should not have loading states in content', function () { + // this test is based on test from test/attributes/hx-push-url.js:65 + this.server.respondWith("GET", "/test1", ''); + this.server.respondWith("GET", "/test2", ''); + + make('
    '); + + byId("d1").click(); + byId("d1").disabled.should.be.true; + this.server.respond(); + byId("d2").disabled.should.be.false; + var workArea = getWorkArea(); + workArea.textContent.should.equal("test1"); + + byId("d2").click(); + byId("d2").disabled.should.be.true; + this.server.respond(); + workArea.textContent.should.equal("test2") + + htmx._('restoreHistory')("/test1") + + var el = byId("d2"); + el.disabled.should.be.false; + }) +}); diff --git a/www/static/test/1.9.2/test/ext/method-override.js b/www/static/test/1.9.2/test/ext/method-override.js new file mode 100644 index 000000000..b0a21ea1d --- /dev/null +++ b/www/static/test/1.9.2/test/ext/method-override.js @@ -0,0 +1,53 @@ +describe("method-override extension", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('issues a DELETE request with proper headers', function() + { + this.server.respondWith("DELETE", "/test", function(xhr){ + xhr.requestHeaders['X-HTTP-Method-Override'].should.equal('DELETE'); + xhr.method.should.equal("POST") + xhr.respond(200, {}, "Deleted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Deleted!"); + }); + + it('issues a PATCH request with proper headers', function() + { + this.server.respondWith("PATCH", "/test", function(xhr){ + xhr.requestHeaders['X-HTTP-Method-Override'].should.equal('PATCH'); + xhr.method.should.equal("POST") + xhr.respond(200, {}, "Patched!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Patched!"); + }); + + it('issues a PUT request with proper headers', function() + { + this.server.respondWith("PUT", "/test", function(xhr){ + xhr.requestHeaders['X-HTTP-Method-Override'].should.equal('PUT'); + xhr.method.should.equal("POST") + xhr.respond(200, {}, "Putted!"); + }); + + var btn = make('') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Putted!"); + }); + +}) diff --git a/www/static/test/1.9.2/test/ext/morphdom-swap.js b/www/static/test/1.9.2/test/ext/morphdom-swap.js new file mode 100644 index 000000000..439fa54cf --- /dev/null +++ b/www/static/test/1.9.2/test/ext/morphdom-swap.js @@ -0,0 +1,40 @@ +describe("morphdom-swap extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('works on basic request', function () { + this.server.respondWith("GET", "/test", "!"); + var btn = make('') + btn.click(); + should.equal(btn.getAttribute("hx-get"), "/test"); + this.server.respond(); + should.equal(btn.getAttribute("hx-get"), null); + btn.innerHTML.should.equal("Clicked!"); + }); + + it('works with htmx elements in new content', function () { + this.server.respondWith("GET", "/test", ''); + this.server.respondWith("GET", "/test-inner", 'Loaded!'); + var btn = make('
    ').querySelector('button'); + btn.click(); + this.server.respond(); // call /test via button trigger=click + this.server.respond(); // call /test-inner via span trigger=load + btn.innerHTML.should.equal("Clicked!Loaded!"); + }); + + it('works with hx-select', function () { + this.server.respondWith("GET", "/test", "!"); + var btn = make('') + btn.click(); + should.equal(btn.getAttribute("hx-get"), "/test"); + this.server.respond(); + should.equal(btn.getAttribute("hx-get"), null); + btn.innerHTML.should.equal("Clicked!"); + }); +}); diff --git a/www/static/test/1.9.2/test/ext/multi-swap.js b/www/static/test/1.9.2/test/ext/multi-swap.js new file mode 100644 index 000000000..70b09821a --- /dev/null +++ b/www/static/test/1.9.2/test/ext/multi-swap.js @@ -0,0 +1,52 @@ +describe("multi-swap extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('swap only one element with default innerHTML', function () { + this.server.respondWith("GET", "/test", '
    New A
    '); + var content = make('
    Foo
    Old A
    '); + var btn = make(''); + btn.click(); + this.server.respond(); + should.equal(content.innerHTML, 'Foo
    New A
    '); + }); + + it('swap multiple elements with outerHTML, beforeend, afterend, beforebegin and delete methods', function () { + this.server.respondWith("GET", "/test", + '
    ' + + '
    New A
    foo ' + + '
    New B
    bar ' + + '
    New C
    dummy ' + + '
    New D
    lorem ' + + '
    TO DELETE
    ' + + '
    ' + ); + var content = make( + '
    Foo ' + + '
    Old A
    A ' + + '
    Old B
    B ' + + '
    Old C
    C ' + + '
    Old D
    D ' + + '
    Old E
    E ' + + '
    ' + ); + var btn = make(''); + btn.click(); + this.server.respond(); + should.equal(content.outerHTML, + '
    Foo ' + + '
    New A
    A ' + + '
    Old BNew B
    B ' + + '
    Old C
    New C C ' + + ' New D
    Old D
    D ' + + ' E ' + + '
    ' + ); + }); +}); diff --git a/www/static/test/1.9.2/test/ext/path-deps.js b/www/static/test/1.9.2/test/ext/path-deps.js new file mode 100644 index 000000000..9b1569ace --- /dev/null +++ b/www/static/test/1.9.2/test/ext/path-deps.js @@ -0,0 +1,173 @@ +describe("path-deps extension", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('path-deps basic case works', function () { + this.server.respondWith("POST", "/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps works with trailing slash', function () { + this.server.respondWith("POST", "/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps GET does not trigger', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("FOO"); + }); + + it('path-deps dont trigger on path mismatch', function () { + this.server.respondWith("POST", "/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("FOO"); + }); + + it('path-deps dont trigger on path longer than request', function () { + this.server.respondWith("POST", "/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("FOO"); + }); + + it('path-deps trigger on path shorter than request', function () { + this.server.respondWith("POST", "/test/child", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps trigger on *-at-start path', function () { + this.server.respondWith("POST", "/test/child/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps trigger on *-in-middle path', function () { + this.server.respondWith("POST", "/test/child/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps trigger on *-at-end path', function () { + this.server.respondWith("POST", "/test/child/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps trigger all *s path', function () { + this.server.respondWith("POST", "/test/child/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var btn = make('') + var div = make('
    FOO
    ') + btn.click(); + this.server.respond(); + btn.innerHTML.should.equal("Clicked!"); + div.innerHTML.should.equal("FOO"); + this.server.respond(); + div.innerHTML.should.equal("Deps fired!"); + }); + + it('path-deps api basic refresh case works', function () { + this.server.respondWith("GET", "/test", "Path deps fired!"); + var div = make('
    FOO
    ') + PathDeps.refresh("/test"); + this.server.respond(); + div.innerHTML.should.equal("Path deps fired!"); + }); + + it('path-deps api parent path case works', function () { + this.server.respondWith("GET", "/test1", "Path deps 1 fired!"); + this.server.respondWith("GET", "/test2", "Path deps 2 fired!"); + var div = make('
    FOO
    ') + var div2 = make('
    BAR
    ') + PathDeps.refresh("/test/child"); + this.server.respond(); + div.innerHTML.should.equal("Path deps 1 fired!"); + this.server.respond(); + div2.innerHTML.should.equal("Path deps 2 fired!"); + }); + + it('path-deps replacing containing element fires event', function () { + this.server.respondWith("POST", "/test", "Clicked!"); + this.server.respondWith("GET", "/test2", "Deps fired!"); + var div1 = make('
    ') + var div2 = make('
    FOO
    ') + byId("buttonSubmit").click(); + this.server.respond(); + div1.innerHTML.should.equal('Clicked!'); + div2.innerHTML.should.equal("FOO"); + this.server.respond(); + div2.innerHTML.should.equal("Deps fired!"); + }); +}); diff --git a/www/static/test/1.9.2/test/ext/remove-me.js b/www/static/test/1.9.2/test/ext/remove-me.js new file mode 100644 index 000000000..cdfd51f83 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/remove-me.js @@ -0,0 +1,53 @@ +describe("remove-me extension", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('removes elements properly', function(done) + { + var div = make('
    Click Me!
    ') + byId("d1").should.equal(div) + setTimeout(function(){ + should.equal(byId("d1"), null); + done(); + }, 40); + }); + + + it('removes properly w/ data-* prefix', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.length, 0); + setTimeout(function(){ + should.equal(div.parentElement, null); + done(); + }, 100); + }); + + it('extension can be on parent', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.length, 0); + setTimeout(function(){ + should.equal(byId("d1"), null); + done(); + }, 100); + }); + + it('extension can be on a child', function(done) + { + var div = make('
    Click Me!
    ') + should.equal(div.classList.length, 0); + setTimeout(function(){ + should.equal(byId("d1"), null); + done(); + }, 100); + }); + + +}) diff --git a/www/static/test/1.9.2/test/ext/ws.js b/www/static/test/1.9.2/test/ext/ws.js new file mode 100644 index 000000000..734bca412 --- /dev/null +++ b/www/static/test/1.9.2/test/ext/ws.js @@ -0,0 +1,319 @@ +describe("web-sockets extension", function () { + beforeEach(function () { + this.server = makeServer(); + this.socketServer = new Mock.Server('ws://localhost:8080'); + this.messages = []; + this.clock = sinon.useFakeTimers(); + + this.socketServer.on('connection', function (socket) { + socket.on('message', function (event) { + this.messages.push(event) + }.bind(this)) + }.bind(this)) + + /* Mock socket library is cool, but it uses setTimeout to emulate asynchronous nature of the network. + * To avoid unexpected behavior, make sure to call this method whenever socket would have a network communication, + * e.g., when connecting, disconnecting, sending messages. */ + this.tickMock = function () { + this.clock.tick(5); + } + + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + this.socketServer.close(); + this.socketServer.stop(); + this.clock.restore(); + }); + + it('can establish connection with the server', function () { + this.socketServer.clients().length.should.equal(0); + make('
    '); + this.socketServer.clients().length.should.equal(1); + + this.tickMock(); + }) + + it('is closed after removal by swap', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + var div = make('
    '); + this.tickMock(); + + this.socketServer.clients().length.should.equal(1); + + div.click(); + this.server.respond(); + + this.tickMock(); + + this.socketServer.clients().length.should.equal(0); + }) + + it('is closed after removal by js when message is received', function () { + this.server.respondWith("GET", "/test", "Clicked!"); + + var div = make('
    '); + this.tickMock(); + + this.socketServer.clients().length.should.equal(1); + div.parentElement.removeChild(div); + + this.socketServer.emit('message', 'foo'); + this.tickMock(); + + this.socketServer.clients().length.should.equal(0); + }) + + it('sends data to the server', function () { + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.tickMock(); + + this.messages.length.should.equal(1); + }) + + it('handles message from the server', function () { + var div = make('
    div1
    div2
    '); + this.tickMock(); + + this.socketServer.emit('message', "
    replaced
    "); + + this.tickMock(); + byId("d1").innerHTML.should.equal("replaced"); + byId("d2").innerHTML.should.equal("div2"); + }) + + it('raises lifecycle events (connecting, open, close) in correct order', function () { + var handledEventTypes = []; + var handler = function (evt) { handledEventTypes.push(evt.detail.event.type) }; + + htmx.on("htmx:wsConnecting", handler); + + var div = make('
    '); + + htmx.on(div, "htmx:wsOpen", handler); + htmx.on(div, "htmx:wsClose", handler); + + this.tickMock(); + + div.parentElement.removeChild(div); + this.socketServer.emit('message', 'foo'); + + this.tickMock(); + + handledEventTypes.should.eql(['connecting', 'open', 'close']); + + this.tickMock(); + + htmx.off("htmx:wsConnecting", handler); + htmx.off(div, "htmx:wsOpen", handler); + htmx.off(div, "htmx:wsClose", handler); + }) + + it('raises htmx:wsConfigSend when sending, allows message modification', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + evt.detail.parameters.foo = "bar"; + } + + htmx.on("htmx:wsConfigSend", handle) + + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.tickMock(); + + myEventCalled.should.be.true; + this.messages.length.should.equal(1); + this.messages[0].should.contains('"foo":"bar"') + htmx.off("htmx:wsConfigSend", handle) + }) + + it('passes socketWrapper to htmx:wsConfigSend', function () { + var socketWrapper = null; + + function handle(evt) { + evt.preventDefault(); + socketWrapper = evt.detail.socketWrapper; + socketWrapper.send(JSON.stringify({foo: 'bar'}), evt.detail.elt) + } + + htmx.on("htmx:wsConfigSend", handle) + + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.tickMock(); + + socketWrapper.should.not.be.null; + socketWrapper.send.should.be.a('function'); + socketWrapper.sendImmediately.should.be.a('function'); + socketWrapper.queue.should.be.an('array'); + + this.messages.length.should.equal(1); + this.messages[0].should.contains('"foo":"bar"') + + htmx.off("htmx:wsConfigSend", handle); + }) + + it('cancels sending when htmx:wsConfigSend is cancelled', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + evt.preventDefault(); + } + + htmx.on("htmx:wsConfigSend", handle) + + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.messages.length.should.equal(0); + + myEventCalled.should.be.true; + + htmx.off("htmx:wsConfigSend", handle); + }) + + it('raises htmx:wsBeforeSend when sending', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + } + + htmx.on("htmx:wsBeforeSend", handle) + + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.tickMock(); + + myEventCalled.should.be.true; + this.messages.length.should.equal(1); + htmx.off("htmx:wsBeforeSend", handle) + }) + + it('cancels sending when htmx:wsBeforeSend is cancelled', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + evt.preventDefault(); + } + + htmx.on("htmx:wsBeforeSend", handle) + + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.tickMock(); + + myEventCalled.should.be.true; + this.messages.length.should.equal(0); + htmx.off("htmx:wsBeforeSend", handle) + }) + + it('raises htmx:wsAfterSend when sending', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + } + + htmx.on("htmx:wsAfterSend", handle) + + var div = make('
    div1
    '); + this.tickMock(); + + byId("d1").click(); + + this.tickMock(); + + myEventCalled.should.be.true; + this.messages.length.should.equal(1); + htmx.off("htmx:wsAfterSend", handle) + }) + + it('raises htmx:wsBeforeMessage when receiving message from the server', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + } + + htmx.on("htmx:wsBeforeMessage", handle) + + var div = make('
    div1
    div2
    '); + this.tickMock(); + + this.socketServer.emit('message', "
    replaced
    ") + + this.tickMock(); + myEventCalled.should.be.true; + + htmx.off("htmx:wsBeforeMessage", handle) + }) + + it('cancels swap when htmx:wsBeforeMessage was cancelled', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + evt.preventDefault(); + } + + htmx.on("htmx:wsBeforeMessage", handle) + + var div = make('
    div1
    div2
    '); + this.tickMock(); + + this.socketServer.emit('message', "
    replaced
    ") + + this.tickMock(); + myEventCalled.should.be.true; + + byId("d1").innerHTML.should.equal("div1"); + byId("d2").innerHTML.should.equal("div2"); + + htmx.off("htmx:wsBeforeMessage", handle) + }) + + it('raises htmx:wsAfterMessage when message was completely processed', function () { + var myEventCalled = false; + + function handle(evt) { + myEventCalled = true; + } + + htmx.on("htmx:wsAfterMessage", handle) + + var div = make('
    div1
    div2
    '); + this.tickMock(); + + this.socketServer.emit('message', "
    replaced
    ") + + this.tickMock(); + myEventCalled.should.be.true; + + htmx.off("htmx:wsAfterMessage", handle) + }) +}); diff --git a/www/static/test/1.9.2/test/img/bars.svg b/www/static/test/1.9.2/test/img/bars.svg new file mode 100644 index 000000000..7cb07e65a --- /dev/null +++ b/www/static/test/1.9.2/test/img/bars.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/static/test/1.9.2/test/index.html b/www/static/test/1.9.2/test/index.html new file mode 100644 index 000000000..cf5d85188 --- /dev/null +++ b/www/static/test/1.9.2/test/index.html @@ -0,0 +1,159 @@ + + + + Mocha Tests + + + + + + + + + + + +

    htmx.js test suite

    + +

    Scratch Page

    + + +

    Manual Tests

    +Here + +

    Mocha Test Suite

    +[ALL] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +Work Area +
    +
    +
    + + diff --git a/www/static/test/1.9.2/test/lib/_hyperscript.js b/www/static/test/1.9.2/test/lib/_hyperscript.js new file mode 100644 index 000000000..114c95741 --- /dev/null +++ b/www/static/test/1.9.2/test/lib/_hyperscript.js @@ -0,0 +1,6067 @@ +///========================================================================= +/// This module provides the core runtime and grammar for hyperscript +///========================================================================= +//AMD insanity + +/** @var {HyperscriptObject} _hyperscript */ + +(function (root, factory) { + if (typeof define === "function" && define.amd) { + // AMD. Register as an anonymous module. + define([], factory); + } else { + // Browser globals + root._hyperscript = factory(); + } +})(typeof self !== "undefined" ? self : this, function () { + "use strict"; + + //==================================================================== + // Utilities + //==================================================================== + + /** + * mergeObjects combines the keys from obj2 into obj2, then returns obj1 + * + * @param {object} obj1 + * @param {object} obj2 + * @returns object + */ + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + function getOrInitObject(root, prop) { + var value = root[prop]; + if (value) { + return value; + } else { + var newObj = {}; + root[prop] = newObj; + return newObj; + } + } + + /** + * parseJSON parses a JSON string into a corresponding value. If the + * value passed in is not valid JSON, then it logs an error and returns `null`. + * + * @param {string} jString + * @returns any + */ + function parseJSON(jString) { + try { + return JSON.parse(jString); + } catch (error) { + logError(error); + return null; + } + } + + /** + * logError writes an error message to the Javascript console. It can take any + * value, but msg should commonly be a simple string. + * @param {*} msg + */ + function logError(msg) { + if (console.error) { + console.error(msg); + } else if (console.log) { + console.log("ERROR: ", msg); + } + } + + // TODO: JSDoc description of what's happening here + function varargConstructor(Cls, args) { + return new (Cls.bind.apply(Cls, [Cls].concat(args)))(); + } + + var globalScope = typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this; + + //==================================================================== + // Lexer + //==================================================================== + + /** @type LexerObject */ + var _lexer = (function () { + var OP_TABLE = { + "+": "PLUS", + "-": "MINUS", + "*": "MULTIPLY", + "/": "DIVIDE", + ".": "PERIOD", + "..": "ELLIPSIS", + "\\": "BACKSLASH", + ":": "COLON", + "%": "PERCENT", + "|": "PIPE", + "!": "EXCLAMATION", + "?": "QUESTION", + "#": "POUND", + "&": "AMPERSAND", + $: "DOLLAR", + ";": "SEMI", + ",": "COMMA", + "(": "L_PAREN", + ")": "R_PAREN", + "<": "L_ANG", + ">": "R_ANG", + "<=": "LTE_ANG", + ">=": "GTE_ANG", + "==": "EQ", + "===": "EQQ", + "!=": "NEQ", + "!==": "NEQQ", + "{": "L_BRACE", + "}": "R_BRACE", + "[": "L_BRACKET", + "]": "R_BRACKET", + "=": "EQUALS", + }; + + /** + * isValidCSSClassChar returns `true` if the provided character is valid in a CSS class. + * @param {string} c + * @returns boolean + */ + function isValidCSSClassChar(c) { + return isAlpha(c) || isNumeric(c) || c === "-" || c === "_" || c === ":"; + } + + /** + * isValidCSSIDChar returns `true` if the provided character is valid in a CSS ID + * @param {string} c + * @returns boolean + */ + function isValidCSSIDChar(c) { + return isAlpha(c) || isNumeric(c) || c === "-" || c === "_" || c === ":"; + } + + /** + * isWhitespace returns `true` if the provided character is whitespace. + * @param {string} c + * @returns boolean + */ + function isWhitespace(c) { + return c === " " || c === "\t" || isNewline(c); + } + + /** + * positionString returns a string representation of a Token's line and column details. + * @param {Token} token + * @returns string + */ + function positionString(token) { + return "[Line: " + token.line + ", Column: " + token.col + "]"; + } + + /** + * isNewline returns `true` if the provided character is a carrage return or newline + * @param {string} c + * @returns boolean + */ + function isNewline(c) { + return c === "\r" || c === "\n"; + } + + /** + * isNumeric returns `true` if the provided character is a number (0-9) + * @param {string} c + * @returns boolean + */ + function isNumeric(c) { + return c >= "0" && c <= "9"; + } + + /** + * isAlpha returns `true` if the provided character is a letter in the alphabet + * @param {string} c + * @returns boolean + */ + function isAlpha(c) { + return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z"); + } + + /** + * @param {string} c + * @param {boolean} [dollarIsOp] + * @returns boolean + */ + function isIdentifierChar(c) { + return c === "_" || c === "$"; + } + + /** + * @param {string} c + * @returns boolean + */ + function isReservedChar(c) { + return c === "`" || c === "^"; + } + + /** + * @param {Token[]} tokens + * @param {Token[]} consumed + * @param {string} source + * @returns {TokensObject} + */ + function makeTokensObject(tokens, consumed, source) { + consumeWhitespace(); // consume initial whitespace + + /** @type Token | null */ + var _lastConsumed = null; + + function consumeWhitespace() { + while (token(0, true).type === "WHITESPACE") { + consumed.push(tokens.shift()); + } + } + + /** + * @param {Token[]} tokens + * @param {*} error + */ + function raiseError(tokens, error) { + _parser.raiseParseError(tokens, error); + } + + /** + * @param {string} value + * @returns {Token} + */ + function requireOpToken(value) { + var token = matchOpToken(value); + if (token) { + return token; + } else { + raiseError(this, "Expected '" + value + "' but found '" + currentToken().value + "'"); + } + } + + /** + * @param {string} op1 + * @param {string} [op2] + * @param {string} [op3] + * @returns {Token | void} + */ + function matchAnyOpToken(op1, op2, op3) { + for (var i = 0; i < arguments.length; i++) { + var opToken = arguments[i]; + var match = matchOpToken(opToken); + if (match) { + return match; + } + } + } + + /** + * @param {string} op1 + * @param {string} [op2] + * @param {string} [op3] + * @returns {Token | void} + */ + function matchAnyToken(op1, op2, op3) { + for (var i = 0; i < arguments.length; i++) { + var opToken = arguments[i]; + var match = matchToken(opToken); + if (match) { + return match; + } + } + } + + /** + * @param {string} value + * @returns {Token | void} + */ + function matchOpToken(value) { + if (currentToken() && currentToken().op && currentToken().value === value) { + return consumeToken(); + } + } + + /** + * @param {string} type1 + * @param {string} [type2] + * @param {string} [type3] + * @param {string} [type4] + * @returns {Token | void} + */ + function requireTokenType(type1, type2, type3, type4) { + var token = matchTokenType(type1, type2, type3, type4); + if (token) { + return token; + } else { + raiseError(this, "Expected one of " + JSON.stringify([type1, type2, type3])); + } + } + + /** + * @param {string} type1 + * @param {string} [type2] + * @param {string} [type3] + * @param {string} [type4] + * @returns {Token | void} + */ + function matchTokenType(type1, type2, type3, type4) { + if ( + currentToken() && + currentToken().type && + [type1, type2, type3, type4].indexOf(currentToken().type) >= 0 + ) { + return consumeToken(); + } + } + + /** + * @param {string} value + * @param {string} [type] + * @returns {Token} + */ + function requireToken(value, type) { + var token = matchToken(value, type); + if (token) { + return token; + } else { + raiseError(this, "Expected '" + value + "' but found '" + currentToken().value + "'"); + } + } + + /** + * @param {string} value + * @param {string} [type] + * @returns {Token | void} + */ + function matchToken(value, type) { + if (follows.indexOf(value) !== -1) { + return; // disallowed token here + } + var type = type || "IDENTIFIER"; + if (currentToken() && currentToken().value === value && currentToken().type === type) { + return consumeToken(); + } + } + + /** + * @returns {Token} + */ + function consumeToken() { + var match = tokens.shift(); + consumed.push(match); + _lastConsumed = match; + consumeWhitespace(); // consume any whitespace + return match; + } + + /** + * @param {string} value + * @param {string} [type] + * @returns {Token[]} + */ + function consumeUntil(value, type) { + /** @type Token[] */ + var tokenList = []; + var currentToken = token(0, true); + + while ( + (type == null || currentToken.type !== type) && + (value == null || currentToken.value !== value) && + currentToken.type !== "EOF" + ) { + var match = tokens.shift(); + consumed.push(match); + tokenList.push(currentToken); + currentToken = token(0, true); + } + consumeWhitespace(); // consume any whitespace + return tokenList; + } + + /** + * @returns {string} + */ + function lastWhitespace() { + if (consumed[consumed.length - 1] && consumed[consumed.length - 1].type === "WHITESPACE") { + return consumed[consumed.length - 1].value; + } else { + return ""; + } + } + + function consumeUntilWhitespace() { + return consumeUntil(null, "WHITESPACE"); + } + + /** + * @returns {boolean} + */ + function hasMore() { + return tokens.length > 0; + } + + /** + * @param {number} n + * @param {boolean} [dontIgnoreWhitespace] + * @returns {Token} + */ + function token(n, dontIgnoreWhitespace) { + var /**@type {Token}*/ token; + var i = 0; + do { + if (!dontIgnoreWhitespace) { + while (tokens[i] && tokens[i].type === "WHITESPACE") { + i++; + } + } + token = tokens[i]; + n--; + i++; + } while (n > -1); + if (token) { + return token; + } else { + return { + type: "EOF", + value: "<<>>", + }; + } + } + + /** + * @returns {Token} + */ + function currentToken() { + return token(0); + } + + /** + * @returns {Token | null} + */ + function lastMatch() { + return _lastConsumed; + } + + /** + * @returns {string} + */ + function sourceFor() { + return source.substring(this.startToken.start, this.endToken.end); + } + + /** + * @returns {string} + */ + function lineFor() { + return source.split("\n")[this.startToken.line - 1]; + } + + var follows = []; + + function pushFollow(str) { + follows.push(str); + } + + function popFollow() { + follows.pop(); + } + + function clearFollows() { + var tmp = follows; + follows = []; + return tmp; + } + + function restoreFollows(f) { + follows = f; + } + + /** @type {TokensObject} */ + return { + pushFollow: pushFollow, + popFollow: popFollow, + clearFollow: clearFollows, + restoreFollow: restoreFollows, + matchAnyToken: matchAnyToken, + matchAnyOpToken: matchAnyOpToken, + matchOpToken: matchOpToken, + requireOpToken: requireOpToken, + matchTokenType: matchTokenType, + requireTokenType: requireTokenType, + consumeToken: consumeToken, + matchToken: matchToken, + requireToken: requireToken, + list: tokens, + consumed: consumed, + source: source, + hasMore: hasMore, + currentToken: currentToken, + lastMatch: lastMatch, + token: token, + consumeUntil: consumeUntil, + consumeUntilWhitespace: consumeUntilWhitespace, + lastWhitespace: lastWhitespace, + sourceFor: sourceFor, + lineFor: lineFor, + }; + } + + /** + * @param {Token[]} tokens + * @returns {boolean} + */ + function isValidSingleQuoteStringStart(tokens) { + if (tokens.length > 0) { + var previousToken = tokens[tokens.length - 1]; + if ( + previousToken.type === "IDENTIFIER" || + previousToken.type === "CLASS_REF" || + previousToken.type === "ID_REF" + ) { + return false; + } + if (previousToken.op && (previousToken.value === ">" || previousToken.value === ")")) { + return false; + } + } + return true; + } + + /** + * @param {string} string + * @param {boolean} [template] + * @returns {TokensObject} + */ + function tokenize(string, template) { + var tokens = /** @type {Token[]}*/ []; + var source = string; + var position = 0; + var column = 0; + var line = 1; + var lastToken = ""; + var templateBraceCount = 0; + + function inTemplate() { + return template && templateBraceCount === 0; + } + + while (position < source.length) { + if (currentChar() === "-" && nextChar() === "-") { + consumeComment(); + } else { + if (isWhitespace(currentChar())) { + tokens.push(consumeWhitespace()); + } else if ( + !possiblePrecedingSymbol() && + currentChar() === "." && + (isAlpha(nextChar()) || nextChar() === "{") + ) { + tokens.push(consumeClassReference()); + } else if ( + !possiblePrecedingSymbol() && + currentChar() === "#" && + (isAlpha(nextChar()) || nextChar() === "{") + ) { + tokens.push(consumeIdReference()); + } else if (currentChar() === "[" && nextChar() === "@") { + tokens.push(consumeAttributeReference()); + } else if (currentChar() === "@") { + tokens.push(consumeShortAttributeReference()); + } else if (isAlpha(currentChar()) || (!inTemplate() && isIdentifierChar(currentChar()))) { + tokens.push(consumeIdentifier()); + } else if (isNumeric(currentChar())) { + tokens.push(consumeNumber()); + } else if (!inTemplate() && (currentChar() === '"' || currentChar() === "`")) { + tokens.push(consumeString()); + } else if (!inTemplate() && currentChar() === "'") { + if (isValidSingleQuoteStringStart(tokens)) { + tokens.push(consumeString()); + } else { + tokens.push(consumeOp()); + } + } else if (OP_TABLE[currentChar()]) { + if (lastToken === "$" && currentChar() === "{") { + templateBraceCount++; + } + if (currentChar() === "}") { + templateBraceCount--; + } + tokens.push(consumeOp()); + } else if (inTemplate() || isReservedChar(currentChar())) { + tokens.push(makeToken("RESERVED", consumeChar())); + } else { + if (position < source.length) { + throw Error("Unknown token: " + currentChar() + " "); + } + } + } + } + + return makeTokensObject(tokens, [], source); + + /** + * @param {string} [type] + * @param {string} [value] + * @returns {Token} + */ + function makeOpToken(type, value) { + var token = makeToken(type, value); + token.op = true; + return token; + } + + /** + * @param {string} [type] + * @param {string} [value] + * @returns {Token} + */ + function makeToken(type, value) { + return { + type: type, + value: value, + start: position, + end: position + 1, + column: column, + line: line, + }; + } + + function consumeComment() { + while (currentChar() && !isNewline(currentChar())) { + consumeChar(); + } + consumeChar(); + } + + /** + * @returns Token + */ + function consumeClassReference() { + var classRef = makeToken("CLASS_REF"); + var value = consumeChar(); + if (currentChar() === "{") { + classRef.template = true; + value += consumeChar(); + while (currentChar() && currentChar() !== "}") { + value += consumeChar(); + } + if (currentChar() !== "}") { + throw Error("Unterminated class reference"); + } else { + value += consumeChar(); // consume final curly + } + } else { + while (isValidCSSClassChar(currentChar())) { + value += consumeChar(); + } + } + classRef.value = value; + classRef.end = position; + return classRef; + } + + /** + * @returns Token + */ + function consumeAttributeReference() { + var attributeRef = makeToken("ATTRIBUTE_REF"); + var value = consumeChar(); + while (position < source.length && currentChar() !== "]") { + value += consumeChar(); + } + if (currentChar() === "]") { + value += consumeChar(); + } + attributeRef.value = value; + attributeRef.end = position; + return attributeRef; + } + + function consumeShortAttributeReference() { + var attributeRef = makeToken("ATTRIBUTE_REF"); + var value = consumeChar(); + while (isValidCSSIDChar(currentChar())) { + value += consumeChar(); + } + attributeRef.value = value; + attributeRef.end = position; + return attributeRef; + } + + /** + * @returns Token + */ + function consumeIdReference() { + var idRef = makeToken("ID_REF"); + var value = consumeChar(); + if (currentChar() === "{") { + idRef.template = true; + value += consumeChar(); + while (currentChar() && currentChar() !== "}") { + value += consumeChar(); + } + if (currentChar() !== "}") { + throw Error("Unterminated id reference"); + } else { + consumeChar(); // consume final quote + } + } else { + while (isValidCSSIDChar(currentChar())) { + value += consumeChar(); + } + } + idRef.value = value; + idRef.end = position; + return idRef; + } + + /** + * @returns Token + */ + function consumeIdentifier() { + var identifier = makeToken("IDENTIFIER"); + var value = consumeChar(); + while (isAlpha(currentChar()) || isIdentifierChar(currentChar())) { + value += consumeChar(); + } + identifier.value = value; + identifier.end = position; + return identifier; + } + + /** + * @returns Token + */ + function consumeNumber() { + var number = makeToken("NUMBER"); + var value = consumeChar(); + while (isNumeric(currentChar())) { + value += consumeChar(); + } + if (currentChar() === "." && isNumeric(nextChar())) { + value += consumeChar(); + } + while (isNumeric(currentChar())) { + value += consumeChar(); + } + number.value = value; + number.end = position; + return number; + } + + /** + * @returns Token + */ + function consumeOp() { + var op = makeOpToken(); + var value = consumeChar(); // consume leading char + while (currentChar() && OP_TABLE[value + currentChar()]) { + value += consumeChar(); + } + op.type = OP_TABLE[value]; + op.value = value; + op.end = position; + return op; + } + + /** + * @returns Token + */ + function consumeString() { + var string = makeToken("STRING"); + var startChar = consumeChar(); // consume leading quote + var value = ""; + while (currentChar() && currentChar() !== startChar) { + if (currentChar() === "\\") { + consumeChar(); // consume escape char and move on + } + value += consumeChar(); + } + if (currentChar() !== startChar) { + throw Error("Unterminated string at " + positionString(string)); + } else { + consumeChar(); // consume final quote + } + string.value = value; + string.end = position; + string.template = startChar === "`"; + return string; + } + + /** + * @returns string + */ + function currentChar() { + return source.charAt(position); + } + + /** + * @returns string + */ + function nextChar() { + return source.charAt(position + 1); + } + + /** + * @returns string + */ + function consumeChar() { + lastToken = currentChar(); + position++; + column++; + return lastToken; + } + + /** + * @returns boolean + */ + function possiblePrecedingSymbol() { + return ( + isAlpha(lastToken) || + isNumeric(lastToken) || + lastToken === ")" || + lastToken === "}" || + lastToken === "]" + ); + } + + /** + * @returns Token + */ + function consumeWhitespace() { + var whitespace = makeToken("WHITESPACE"); + var value = ""; + while (currentChar() && isWhitespace(currentChar())) { + if (isNewline(currentChar())) { + column = 0; + line++; + } + value += consumeChar(); + } + whitespace.value = value; + whitespace.end = position; + return whitespace; + } + } + + return { + tokenize: tokenize, + makeTokensObject: makeTokensObject, + }; + })(); + + //==================================================================== + // Parser + //==================================================================== + + /** @type ParserObject */ + var _parser = (function () { + /** @type {Object} */ + var GRAMMAR = {}; + + /** @type {Object} */ + var COMMANDS = {}; + + /** @type {Object} */ + var FEATURES = {}; + + var LEAF_EXPRESSIONS = []; + var INDIRECT_EXPRESSIONS = []; + + /** + * @param {*} parseElement + * @param {*} start + * @param {TokensObject} tokens + */ + function initElt(parseElement, start, tokens) { + parseElement.startToken = start; + parseElement.sourceFor = tokens.sourceFor; + parseElement.lineFor = tokens.lineFor; + parseElement.programSource = tokens.source; + } + + /** + * @param {string} type + * @param {TokensObject} tokens + * @param {*} root + * @returns GrammarElement + */ + function parseElement(type, tokens, root) { + var elementDefinition = GRAMMAR[type]; + if (elementDefinition) { + var start = tokens.currentToken(); + var parseElement = elementDefinition(_parser, _runtime, tokens, root); + if (parseElement) { + initElt(parseElement, start, tokens); + parseElement.endToken = parseElement.endToken || tokens.lastMatch(); + var root = parseElement.root; + while (root != null) { + initElt(root, start, tokens); + root = root.root; + } + } + return parseElement; + } + } + + /** + * @param {string} type + * @param {TokensObject} tokens + * @param {string} [message] + * @param {*} [root] + * @returns {GrammarElement} + */ + function requireElement(type, tokens, message, root) { + var result = parseElement(type, tokens, root); + return result || raiseParseError(tokens, message || "Expected " + type); + } + + /** + * @param {string[]} types + * @param {TokensObject} tokens + * @returns {GrammarElement} + */ + function parseAnyOf(types, tokens) { + for (var i = 0; i < types.length; i++) { + var type = types[i]; + var expression = parseElement(type, tokens); + if (expression) { + return expression; + } + } + } + + /** + * @param {string} name + * @param {GrammarDefinition} definition + */ + function addGrammarElement(name, definition) { + GRAMMAR[name] = definition; + } + + /** + * @param {string} keyword + * @param {GrammarDefinition} definition + */ + function addCommand(keyword, definition) { + var commandGrammarType = keyword + "Command"; + var commandDefinitionWrapper = function (parser, runtime, tokens) { + var commandElement = definition(parser, runtime, tokens); + if (commandElement) { + commandElement.type = commandGrammarType; + commandElement.execute = function (context) { + context.meta.command = commandElement; + return runtime.unifiedExec(this, context); + }; + return commandElement; + } + }; + GRAMMAR[commandGrammarType] = commandDefinitionWrapper; + COMMANDS[keyword] = commandDefinitionWrapper; + } + + /** + * @param {string} keyword + * @param {GrammarDefinition} definition + */ + function addFeature(keyword, definition) { + var featureGrammarType = keyword + "Feature"; + + /** @type {GrammarDefinition} */ + var featureDefinitionWrapper = function (parser, runtime, tokens) { + var featureElement = definition(parser, runtime, tokens); + if (featureElement) { + featureElement.keyword = keyword; + featureElement.type = featureGrammarType; + return featureElement; + } + }; + GRAMMAR[featureGrammarType] = featureDefinitionWrapper; + FEATURES[keyword] = featureDefinitionWrapper; + } + + /** + * @param {string} name + * @param {GrammarDefinition} definition + */ + function addLeafExpression(name, definition) { + LEAF_EXPRESSIONS.push(name); + addGrammarElement(name, definition); + } + + /** + * @param {string} name + * @param {GrammarDefinition} definition + */ + function addIndirectExpression(name, definition) { + INDIRECT_EXPRESSIONS.push(name); + addGrammarElement(name, definition); + } + + /* ============================================================================================ */ + /* Core hyperscript Grammar Elements */ + /* ============================================================================================ */ + addGrammarElement("feature", function (parser, runtime, tokens) { + if (tokens.matchOpToken("(")) { + var featureElement = parser.requireElement("feature", tokens); + tokens.requireOpToken(")"); + return featureElement; + } + + var featureDefinition = FEATURES[tokens.currentToken().value]; + if (featureDefinition) { + return featureDefinition(parser, runtime, tokens); + } + }); + + addGrammarElement("command", function (parser, runtime, tokens) { + if (tokens.matchOpToken("(")) { + var commandElement = parser.requireElement("command", tokens); + tokens.requireOpToken(")"); + return commandElement; + } + + var commandDefinition = COMMANDS[tokens.currentToken().value]; + if (commandDefinition) { + var commandElement = commandDefinition(parser, runtime, tokens); + } else if (tokens.currentToken().type === "IDENTIFIER" && tokens.token(1).value === "(") { + var commandElement = parser.requireElement("pseudoCommand", tokens); + } + if (commandElement) { + return parser.parseElement("indirectStatement", tokens, commandElement); + } + + return commandElement; + }); + + addGrammarElement("commandList", function (parser, runtime, tokens) { + var cmd = parser.parseElement("command", tokens); + if (cmd) { + tokens.matchToken("then"); + cmd.next = parser.parseElement("commandList", tokens); + return cmd; + } + }); + + addGrammarElement("leaf", function (parser, runtime, tokens) { + var result = parseAnyOf(LEAF_EXPRESSIONS, tokens); + // symbol is last so it doesn't consume any constants + if (result == null) { + return parseElement("symbol", tokens); + } + + return result; + }); + + addGrammarElement("indirectExpression", function (parser, runtime, tokens, root) { + for (var i = 0; i < INDIRECT_EXPRESSIONS.length; i++) { + var indirect = INDIRECT_EXPRESSIONS[i]; + root.endToken = tokens.lastMatch(); + var result = parser.parseElement(indirect, tokens, root); + if (result) { + return result; + } + } + return root; + }); + + addGrammarElement("indirectStatement", function (parser, runtime, tokens, root) { + if (tokens.matchToken("unless")) { + root.endToken = tokens.lastMatch(); + var conditional = parser.requireElement("expression", tokens); + var unless = { + type: "unlessStatementModifier", + args: [conditional], + op: function (context, conditional) { + if (conditional) { + return this.next; + } else { + return root; + } + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + root.parent = unless; + return unless; + } + return root; + }); + + addGrammarElement("primaryExpression", function (parser, runtime, tokens) { + var leaf = parser.parseElement("leaf", tokens); + if (leaf) { + return parser.parseElement("indirectExpression", tokens, leaf); + } + parser.raiseParseError(tokens, "Unexpected value: " + tokens.currentToken().value); + }); + + /* ============================================================================================ */ + /* END Core hyperscript Grammar Elements */ + + /* ============================================================================================ */ + + /** + * + * @param {TokensObject} tokens + * @returns string + */ + function createParserContext(tokens) { + var currentToken = tokens.currentToken(); + var source = tokens.source; + var lines = source.split("\n"); + var line = currentToken && currentToken.line ? currentToken.line - 1 : lines.length - 1; + var contextLine = lines[line]; + var offset = currentToken && currentToken.line ? currentToken.column : contextLine.length - 1; + return contextLine + "\n" + " ".repeat(offset) + "^^\n\n"; + } + + /** + * @param {TokensObject} tokens + * @param {string} message + */ + function raiseParseError(tokens, message) { + message = + (message || "Unexpected Token : " + tokens.currentToken().value) + "\n\n" + createParserContext(tokens); + var error = new Error(message); + error["tokens"] = tokens; + throw error; + } + + /** + * @param {TokensObject} tokens + * @returns {GrammarElement} + */ + function parseHyperScript(tokens) { + var result = parseElement("hyperscript", tokens); + if (tokens.hasMore()) raiseParseError(tokens); + return result; + } + + /** + * @param {GrammarElement} elt + * @param {GrammarElement} parent + */ + function setParent(elt, parent) { + if (elt) { + elt.parent = parent; + setParent(elt.next, parent); + } + } + + /** + * @param {Token} token + * @returns {GrammarDefinition} + */ + function commandStart(token) { + return COMMANDS[token.value]; + } + + /** + * @param {Token} token + * @returns {GrammarDefinition} + */ + function featureStart(token) { + return FEATURES[token.value]; + } + + /** + * @param {Token} token + * @returns {true | void} + */ + function commandBoundary(token) { + if ( + token.value == "end" || + token.value == "then" || + token.value == "else" || + token.value == ")" || + commandStart(token) || + featureStart(token) || + token.type == "EOF" + ) { + return true; + } + } + + /** + * @param {TokensObject} tokens + * @returns {(string | Token)[]} + */ + function parseStringTemplate(tokens) { + /** @type (string | Token)[] */ + var returnArr = [""]; + do { + returnArr.push(tokens.lastWhitespace()); + if (tokens.currentToken().value === "$") { + tokens.consumeToken(); + var startingBrace = tokens.matchOpToken("{"); + returnArr.push(requireElement("expression", tokens)); + if (startingBrace) { + tokens.requireOpToken("}"); + } + returnArr.push(""); + } else if (tokens.currentToken().value === "\\") { + tokens.consumeToken(); // skip next + tokens.consumeToken(); + } else { + var token = tokens.consumeToken(); + returnArr[returnArr.length - 1] += token ? token.value : ""; + } + } while (tokens.hasMore()); + returnArr.push(tokens.lastWhitespace()); + return returnArr; + } + + // parser API + return { + setParent: setParent, + requireElement: requireElement, + parseElement: parseElement, + featureStart: featureStart, + commandStart: commandStart, + commandBoundary: commandBoundary, + parseAnyOf: parseAnyOf, + parseHyperScript: parseHyperScript, + raiseParseError: raiseParseError, + addGrammarElement: addGrammarElement, + addCommand: addCommand, + addFeature: addFeature, + addLeafExpression: addLeafExpression, + addIndirectExpression: addIndirectExpression, + parseStringTemplate: parseStringTemplate, + }; + })(); + + //==================================================================== + // Runtime + //==================================================================== + + /** @type ConversionMap */ + var CONVERSIONS = { + dynamicResolvers: /** @type DynamicConversionFunction[] */ [], + String: function (val) { + if (val.toString) { + return val.toString(); + } else { + return "" + val; + } + }, + Int: function (val) { + return parseInt(val); + }, + Float: function (val) { + return parseFloat(val); + }, + Number: function (val) { + console.log(val); + return Number(val); + }, + Date: function (val) { + return Date(val); + }, + Array: function (val) { + return Array.from(val); + }, + JSON: function (val) { + return JSON.stringify(val); + }, + Object: function (val) { + if (val instanceof String) { + val = val.toString(); + } + if (typeof val === "string") { + return JSON.parse(val); + } else { + return mergeObjects({}, val); + } + }, + }; + + /******************************************** + * RUNTIME OBJECT + ********************************************/ + + /** @type {RuntimeObject} */ + var _runtime = (function () { + /** + * @param {HTMLElement} elt + * @param {string} selector + * @returns boolean + */ + function matchesSelector(elt, selector) { + // noinspection JSUnresolvedVariable + var matchesFunction = + elt.matches || + elt.matchesSelector || + elt.msMatchesSelector || + elt.mozMatchesSelector || + elt.webkitMatchesSelector || + elt.oMatchesSelector; + return matchesFunction && matchesFunction.call(elt, selector); + } + + /** + * @param {string} eventName + * @param {Object} [detail] + * @returns {Event} + */ + function makeEvent(eventName, detail) { + var evt; + if (window.CustomEvent && typeof window.CustomEvent === "function") { + evt = new CustomEvent(eventName, { + bubbles: true, + cancelable: true, + detail: detail, + }); + } else { + evt = document.createEvent("CustomEvent"); + evt.initCustomEvent(eventName, true, true, detail); + } + return evt; + } + + /** + * @param {HTMLElement} elt + * @param {string} eventName + * @param {Object} [detail] + * @returns {boolean} + */ + function triggerEvent(elt, eventName, detail) { + detail = detail || {}; + detail["sentBy"] = elt; + var event = makeEvent(eventName, detail); + var eventResult = elt.dispatchEvent(event); + return eventResult; + } + + /** + * isArrayLike returns `true` if the provided value is an array or + * a NodeList (which is close enough to being an array for our purposes). + * + * @param {any} value + * @returns {value is Array | NodeList} + */ + function isArrayLike(value) { + return Array.isArray(value) || value instanceof NodeList; + } + + /** + * forEach executes the provided `func` on every item in the `value` array. + * if `value` is a single item (and not an array) then `func` is simply called + * once. If `value` is null, then no further actions are taken. + * + * @template T + * @param {NodeList | T | T[]} value + * @param {(item:Node | T) => void} func + */ + function forEach(value, func) { + if (value == null) { + // do nothing + } else if (isArrayLike(value)) { + for (var i = 0; i < value.length; i++) { + func(value[i]); + } + } else { + func(value); + } + } + + var ARRAY_SENTINEL = { array_sentinel: true }; + + function linearize(args) { + var arr = []; + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + if (Array.isArray(arg)) { + arr.push(ARRAY_SENTINEL); + for (var j = 0; j < arg.length; j++) { + arr.push(arg[j]); + } + arr.push(ARRAY_SENTINEL); + } else { + arr.push(arg); + } + } + return arr; + } + + function delinearize(values) { + var arr = []; + for (var i = 0; i < values.length; i++) { + var value = values[i]; + if (value === ARRAY_SENTINEL) { + value = values[++i]; + var valueArray = []; + arr.push(valueArray); + while (value !== ARRAY_SENTINEL) { + valueArray.push(value); + value = values[++i]; + } + } else { + arr.push(value); + } + } + return arr; + } + + function unwrapAsyncs(values) { + for (var i = 0; i < values.length; i++) { + var value = values[i]; + if (value.asyncWrapper) { + values[i] = value.value; + } + if (Array.isArray(value)) { + for (var j = 0; j < value.length; j++) { + var valueElement = value[j]; + if (valueElement.asyncWrapper) { + value[j] = valueElement.value; + } + } + } + } + } + + var HALT = { halt_flag: true }; + + /** + * @param {GrammarDefinition} command + * @param {Context} ctx + */ + function unifiedExec(command, ctx) { + while (true) { + try { + var next = unifiedEval(command, ctx); + } catch (e) { + _runtime.registerHyperTrace(ctx, e); + if (ctx.meta.errorHandler && !ctx.meta.handlingError) { + ctx.meta.handlingError = true; + ctx[ctx.meta.errorSymmbol] = e; + command = ctx.meta.errorHandler; + continue; + } else if (ctx.meta.reject) { + ctx.meta.reject(e); + next = HALT; + } else { + throw e; + } + } + if (next == null) { + console.error(command, " did not return a next element to execute! context: ", ctx); + return; + } else if (next.then) { + next.then(function (resolvedNext) { + unifiedExec(resolvedNext, ctx); + }).catch(function (reason) { + _runtime.registerHyperTrace(ctx, reason); + if (ctx.meta.errorHandler && !ctx.meta.handlingError) { + ctx.meta.handlingError = true; + ctx[ctx.meta.errorSymmbol] = reason; + unifiedExec(ctx.meta.errorHandler, ctx); + } else if (ctx.meta.reject) { + ctx.meta.reject(reason); + } else { + throw reason; + } + }); + return; + } else if (next === HALT) { + // done + return; + } else { + command = next; // move to the next command + } + } + } + + /** + * @param {*} parseElement + * @param {Context} ctx + * @returns {*} + */ + function unifiedEval(parseElement, ctx) { + /** @type any[] */ + var args = [ctx]; + var async = false; + var wrappedAsyncs = false; + + if (parseElement.args) { + for (var i = 0; i < parseElement.args.length; i++) { + var argument = parseElement.args[i]; + if (argument == null) { + args.push(null); + } else if (Array.isArray(argument)) { + var arr = []; + for (var j = 0; j < argument.length; j++) { + var element = argument[j]; + var value = element ? element.evaluate(ctx) : null; // OK + if (value) { + if (value.then) { + async = true; + } else if (value.asyncWrapper) { + wrappedAsyncs = true; + } + } + arr.push(value); + } + args.push(arr); + } else if (argument.evaluate) { + var value = argument.evaluate(ctx); // OK + if (value) { + if (value.then) { + async = true; + } else if (value.asyncWrapper) { + wrappedAsyncs = true; + } + } + args.push(value); + } else { + args.push(argument); + } + } + } + if (async) { + return new Promise(function (resolve, reject) { + var linearized = linearize(args); + Promise.all(linearized) + .then(function (values) { + values = delinearize(values); + if (wrappedAsyncs) { + unwrapAsyncs(values); + } + try { + var apply = parseElement.op.apply(parseElement, values); + resolve(apply); + } catch (e) { + reject(e); + } + }) + .catch(function (reason) { + if (ctx.meta.errorHandler && !ctx.meta.handlingError) { + ctx.meta.handlingError = true; + ctx[ctx.meta.errorSymmbol] = reason; + unifiedExec(ctx.meta.errorHandler, ctx); + } else if (ctx.meta.reject) { + ctx.meta.reject(reason); + } else { + // TODO: no meta context to reject with, trigger event? + } + }); + }); + } else { + if (wrappedAsyncs) { + unwrapAsyncs(args); + } + return parseElement.op.apply(parseElement, args); + } + } + + var _scriptAttrs = null; + + /** + * getAttributes returns the attribute name(s) to use when + * locating hyperscript scripts in a DOM element. If no value + * has been configured, it defaults to _hyperscript.config.attributes + * @returns string[] + */ + function getScriptAttributes() { + if (_scriptAttrs == null) { + _scriptAttrs = _hyperscript.config.attributes.replace(/ /g, "").split(","); + } + return _scriptAttrs; + } + + /** + * @param {HTMLElement} elt + * @returns {string | null} + */ + function getScript(elt) { + for (var i = 0; i < getScriptAttributes().length; i++) { + var scriptAttribute = getScriptAttributes()[i]; + if (elt.hasAttribute && elt.hasAttribute(scriptAttribute)) { + return elt.getAttribute(scriptAttribute); + } + } + if (elt["type"] === "text/hyperscript") { + return elt.innerText; + } + return null; + } + + /** + * @param {Object} owner + * @param {Context} ctx + */ + function addFeatures(owner, ctx) { + if (owner) { + if (owner.hyperscriptFeatures) { + mergeObjects(ctx, owner.hyperscriptFeatures); + } + addFeatures(owner.parentElement, ctx); + } + } + + /** + * @param {*} owner + * @param {*} feature + * @param {*} hyperscriptTarget + * @param {*} event + * @returns {Context} + */ + function makeContext(owner, feature, hyperscriptTarget, event) { + /** @type {Context} */ + var ctx = { + meta: { + parser: _parser, + lexer: _lexer, + runtime: _runtime, + owner: owner, + feature: feature, + iterators: {}, + }, + me: hyperscriptTarget, + event: event, + target: event ? event.target : null, + detail: event ? event.detail : null, + body: "document" in globalScope ? document.body : null, + }; + ctx.meta.ctx = ctx; + addFeatures(owner, ctx); + return ctx; + } + + /** + * @returns string + */ + function getScriptSelector() { + return getScriptAttributes() + .map(function (attribute) { + return "[" + attribute + "]"; + }) + .join(", "); + } + + /** + * @param {any} value + * @param {string} type + * @returns {any} + */ + function convertValue(value, type) { + var dynamicResolvers = CONVERSIONS.dynamicResolvers; + for (var i = 0; i < dynamicResolvers.length; i++) { + var dynamicResolver = dynamicResolvers[i]; + var converted = dynamicResolver(type, value); + if (converted !== undefined) { + return converted; + } + } + + if (value == null) { + return null; + } + var converter = CONVERSIONS[type]; + if (converter) { + return converter(value); + } + + throw "Unknown conversion : " + type; + } + + // TODO: There do not seem to be any references to this function. + // Is it still in use, or can it be removed? + function isType(o, type) { + return Object.prototype.toString.call(o) === "[object " + type + "]"; + } + + /** + * @param {string} src + * @returns {GrammarElement} + */ + function parse(src) { + var tokens = _lexer.tokenize(src); + if (_parser.commandStart(tokens.currentToken())) { + var commandList = _parser.parseElement("commandList", tokens); + var last = commandList; + while (last.next) { + last = last.next; + } + last.next = { + op: function () { + return HALT; + }, + }; + return commandList; + } else if (_parser.featureStart(tokens.currentToken())) { + var hyperscript = _parser.parseElement("hyperscript", tokens); + return hyperscript; + } else { + var expression = _parser.parseElement("expression", tokens); + return expression; + } + } + + /** + * @param {string} src + * @param {Context} ctx + * @returns {any} + */ + function evaluate(src, ctx) { + ctx = mergeObjects(makeContext(document.body, null, document.body, null), ctx || {}); + var element = parse(src); + if (element.execute) { + return element.execute(ctx); + } else if (element.apply) { + element.apply(document.body, null); + } else { + return element.evaluate(ctx); + } + } + + /** + * @param {HTMLElement} elt + */ + function processNode(elt) { + var selector = _runtime.getScriptSelector(); + if (matchesSelector(elt, selector)) { + initElement(elt, elt); + } + if (elt["type"] === "text/hyperscript") { + initElement(elt, document.body); + } + if (elt.querySelectorAll) { + forEach(elt.querySelectorAll(selector + ", [type='text/hyperscript']"), function (elt) { + initElement(elt, elt.type === "text/hyperscript" ? document.body : elt); + }); + } + } + + /** + * @param {HTMLElement} elt + * @param {HTMLElement} [target] + */ + function initElement(elt, target) { + if (elt.closest && elt.closest(_hyperscript.config.disableSelector)) { + return; + } + var internalData = getInternalData(elt); + if (!internalData.initialized) { + var src = getScript(elt); + if (src) { + try { + internalData.initialized = true; + internalData.script = src; + var tokens = _lexer.tokenize(src); + var hyperScript = _parser.parseHyperScript(tokens); + hyperScript.apply(target || elt, elt); + setTimeout(function () { + triggerEvent(target || elt, "load", { + hyperscript: true, + }); + }, 1); + } catch (e) { + _runtime.triggerEvent(elt, "exception", { + error: e, + }); + console.error( + "hyperscript errors were found on the following element:", + elt, + "\n\n", + e.message, + e.stack + ); + } + } + } + } + + /** + * @param {HTMLElement} elt + * @returns {Object} + */ + function getInternalData(elt) { + var dataProp = "hyperscript-internal-data"; + var data = elt[dataProp]; + if (!data) { + data = elt[dataProp] = {}; + } + return data; + } + + /** + * @param {any} value + * @param {string} typeString + * @param {boolean} [nullOk] + * @returns {boolean} + */ + function typeCheck(value, typeString, nullOk) { + if (value == null && nullOk) { + return true; + } + var typeName = Object.prototype.toString.call(value).slice(8, -1); + return typeName === typeString; + } + + function getElementScope(context) { + var elt = context.meta.owner; + if (elt) { + var internalData = getInternalData(elt); + var scopeName = "elementScope"; + if (context.meta.feature && context.meta.feature.behavior) { + scopeName = context.meta.feature.behavior + "Scope"; + } + var elementScope = getOrInitObject(internalData, scopeName); + return elementScope; + } else { + return {}; // no element, return empty scope + } + } + + /** + * @param {string} str + * @param {Context} context + * @returns {any} + */ + function resolveSymbol(str, context, type) { + if (str === "me" || str === "my" || str === "I") { + return context["me"]; + } + if (str === "it" || str === "its") { + return context["result"]; + } + if (str === "you" || str === "your" || str === "yourself") { + return context["beingTold"]; + } else { + if (type === "global") { + return globalScope[str]; + } else if (type === "element") { + var elementScope = getElementScope(context); + return elementScope[str]; + } else if (type === "local") { + return context[str]; + } else { + // meta scope (used for event conditionals) + if (context.meta && context.meta.context) { + var fromMetaContext = context.meta.context[str]; + if (typeof fromMetaContext !== "undefined") { + return fromMetaContext; + } + } + // local scope + var fromContext = context[str]; + if (typeof fromContext !== "undefined") { + return fromContext; + } else { + // element scope + var elementScope = getElementScope(context); + fromContext = elementScope[str]; + if (typeof fromContext !== "undefined") { + return fromContext; + } else { + // global scope + return globalScope[str]; + } + } + } + } + } + + function setSymbol(str, context, type, value) { + if (type === "global") { + globalScope[str] = value; + } else if (type === "element") { + var elementScope = getElementScope(context); + elementScope[str] = value; + } else if (type === "local") { + context[str] = value; + } else { + // local scope + var fromContext = context[str]; + if (typeof fromContext !== "undefined") { + context[str] = value; + } else { + // element scope + var elementScope = getElementScope(context); + fromContext = elementScope[str]; + if (typeof fromContext !== "undefined") { + elementScope[str] = value; + } else { + // global scope + fromContext = globalScope[str]; + if (typeof fromContext !== "undefined") { + globalScope[str] = value; + } else { + context[str] = value; + } + } + } + } + } + + /** + * @param {GrammarElement} command + * @param {Context} context + * @returns {undefined | GrammarElement} + */ + function findNext(command, context) { + if (command) { + if (command.resolveNext) { + return command.resolveNext(context); + } else if (command.next) { + return command.next; + } else { + return findNext(command.parent, context); + } + } + } + + /** + * @param {Object} root + * @param {string} property + * @param {boolean} attribute + * @returns {any} + */ + function resolveProperty(root, property, attribute) { + if (root != null) { + var val = attribute && root.getAttribute ? root.getAttribute(property) : root[property]; + if (typeof val !== "undefined") { + return val; + } + + if (isArrayLike(root)) { + // flat map + var result = []; + for (var i = 0; i < root.length; i++) { + var component = root[i]; + var componentValue = attribute ? component.getAttribute(property) : component[property]; + if (componentValue) { + result.push(componentValue); + } + } + return result; + } + } + } + + /** + * @param {Element} elt + * @param {string[]} nameSpace + * @param {string} name + * @param {any} value + */ + function assignToNamespace(elt, nameSpace, name, value) { + if (typeof document === "undefined" || elt === document.body) { + var root = globalScope; + } else { + var root = elt["hyperscriptFeatures"]; + if (root == null) { + root = {}; + elt["hyperscriptFeatures"] = root; + } + } + while (nameSpace.length > 0) { + var propertyName = nameSpace.shift(); + var newRoot = root[propertyName]; + if (newRoot == null) { + newRoot = {}; + root[propertyName] = newRoot; + } + root = newRoot; + } + + root[name] = value; + } + + function getHyperTrace(ctx, thrown) { + var trace = []; + var root = ctx; + while (root.meta.caller) { + root = root.meta.caller; + } + if (root.meta.traceMap) { + return root.meta.traceMap.get(thrown, trace); + } + } + + function registerHyperTrace(ctx, thrown) { + var trace = []; + var root = null; + while (ctx != null) { + trace.push(ctx); + root = ctx; + ctx = ctx.meta.caller; + } + if (root.meta.traceMap == null) { + root.meta.traceMap = new Map(); // TODO - WeakMap? + } + if (!root.meta.traceMap.get(thrown)) { + var traceEntry = { + trace: trace, + print: function (logger) { + logger = logger || console.error; + logger("hypertrace /// "); + var maxLen = 0; + for (var i = 0; i < trace.length; i++) { + maxLen = Math.max(maxLen, trace[i].meta.feature.displayName.length); + } + for (var i = 0; i < trace.length; i++) { + var traceElt = trace[i]; + logger( + " ->", + traceElt.meta.feature.displayName.padEnd(maxLen + 2), + "-", + traceElt.meta.owner + ); + } + }, + }; + root.meta.traceMap.set(thrown, traceEntry); + } + } + + /** + * @param {string} str + * @returns {string} + */ + function escapeSelector(str) { + return str.replace(/:/g, function (str) { + return "\\" + str; + }); + } + + /** + * @param {any} value + * @param {*} elt + */ + function nullCheck(value, elt) { + if (value == null) { + throw new Error(elt.sourceFor() + " is null"); + } + } + + /** + * @param {any} value + * @returns {boolean} + */ + function isEmpty(value) { + return value == undefined || value.length === 0; + } + + /** @type string | null */ + var hyperscriptUrl = "document" in globalScope ? document.currentScript.src : null; + + /** @type {RuntimeObject} */ + return { + typeCheck: typeCheck, + forEach: forEach, + triggerEvent: triggerEvent, + matchesSelector: matchesSelector, + getScript: getScript, + processNode: processNode, + evaluate: evaluate, + parse: parse, + getScriptSelector: getScriptSelector, + resolveSymbol: resolveSymbol, + setSymbol: setSymbol, + makeContext: makeContext, + findNext: findNext, + unifiedEval: unifiedEval, + convertValue: convertValue, + unifiedExec: unifiedExec, + resolveProperty: resolveProperty, + assignToNamespace: assignToNamespace, + registerHyperTrace: registerHyperTrace, + getHyperTrace: getHyperTrace, + getInternalData: getInternalData, + escapeSelector: escapeSelector, + nullCheck: nullCheck, + isEmpty: isEmpty, + hyperscriptUrl: hyperscriptUrl, + HALT: HALT, + }; + })(); + + //==================================================================== + // Grammar + //==================================================================== + { + _parser.addLeafExpression("parenthesized", function (parser, _runtime, tokens) { + if (tokens.matchOpToken("(")) { + var follows = tokens.clearFollow(); + try { + var expr = parser.requireElement("expression", tokens); + } finally { + tokens.restoreFollow(follows); + } + tokens.requireOpToken(")"); + return expr; + } + }); + + _parser.addLeafExpression("string", function (parser, runtime, tokens) { + var stringToken = tokens.matchTokenType("STRING"); + if (!stringToken) return; + var rawValue = stringToken.value; + if (stringToken.template) { + var innerTokens = _lexer.tokenize(rawValue, true); + var args = parser.parseStringTemplate(innerTokens); + } else { + var args = []; + } + return { + type: "string", + token: stringToken, + args: args, + op: function (context) { + var returnStr = ""; + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (val !== undefined) { + returnStr += val; + } + } + return returnStr; + }, + evaluate: function (context) { + if (args.length === 0) { + return rawValue; + } else { + return runtime.unifiedEval(this, context); + } + }, + }; + }); + + _parser.addGrammarElement("nakedString", function (parser, runtime, tokens) { + if (tokens.hasMore()) { + var tokenArr = tokens.consumeUntilWhitespace(); + tokens.matchTokenType("WHITESPACE"); + return { + type: "nakedString", + tokens: tokenArr, + evaluate: function (context) { + return tokenArr + .map(function (t) { + return t.value; + }) + .join(""); + }, + }; + } + }); + + _parser.addLeafExpression("number", function (parser, runtime, tokens) { + var number = tokens.matchTokenType("NUMBER"); + if (!number) return; + var numberToken = number; + var value = parseFloat(number.value); + return { + type: "number", + value: value, + numberToken: numberToken, + evaluate: function () { + return value; + }, + }; + }); + + _parser.addLeafExpression("idRef", function (parser, runtime, tokens) { + var elementId = tokens.matchTokenType("ID_REF"); + if (!elementId) return; + // TODO - unify these two expression types + if (elementId.template) { + var templateValue = elementId.value.substr(2, elementId.value.length - 2); + var innerTokens = _lexer.tokenize(templateValue); + var innerExpression = parser.requireElement("expression", innerTokens); + return { + type: "idRefTemplate", + args: [innerExpression], + op: function (context, arg) { + return context.me.getRootNode().getElementById(arg) || document.getElementById(arg); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + return { + type: "idRef", + css: elementId.value, + value: elementId.value.substr(1), + evaluate: function (context) { + return ( + context.me.getRootNode().getElementById(this.value) || document.getElementById(this.value) + ); + }, + }; + } + }); + + _parser.addLeafExpression("classRef", function (parser, runtime, tokens) { + var classRef = tokens.matchTokenType("CLASS_REF"); + + if (!classRef) return; + + // TODO - unify these two expression types + if (classRef.template) { + var templateValue = classRef.value.substr(2, classRef.value.length - 2); + var innerTokens = _lexer.tokenize(templateValue); + var innerExpression = parser.requireElement("expression", innerTokens); + return { + type: "classRefTemplate", + args: [innerExpression], + op: function (context, arg) { + return document.querySelectorAll(runtime.escapeSelector("." + arg)); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + return { + type: "classRef", + css: classRef.value, + className: function () { + return this.css.substr(1); + }, + evaluate: function (context) { + return context.me.getRootNode().querySelectorAll(runtime.escapeSelector(this.css)); + }, + }; + } + }); + + _parser.addLeafExpression("queryRef", function (parser, runtime, tokens) { + var queryStart = tokens.matchOpToken("<"); + if (!queryStart) return; + var queryTokens = tokens.consumeUntil("/"); + tokens.requireOpToken("/"); + tokens.requireOpToken(">"); + var queryValue = queryTokens + .map(function (t) { + if (t.type === "STRING") { + return '"' + t.value + '"'; + } else { + return t.value; + } + }) + .join(""); + + if (queryValue.indexOf("$") >= 0) { + var template = true; + var innerTokens = _lexer.tokenize(queryValue, true); + var args = parser.parseStringTemplate(innerTokens); + } + + return { + type: "queryRef", + css: queryValue, + args: args, + op: function (context, args) { + var query = queryValue; + var elements = []; + if (template) { + query = ""; + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (val) { + if (val instanceof Element) { + val.dataset.hsQueryId = elements.length; + query += "[data-hs-query-id='" + elements.length + "']"; + elements.push(val); + } else query += val; + } + } + } + var result = context.me.getRootNode().querySelectorAll(query); + runtime.forEach(elements, function (el) { el.removeAttribute("data-hs-query-id") }); + return result; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addLeafExpression("attributeRef", function (parser, runtime, tokens) { + var attributeRef = tokens.matchTokenType("ATTRIBUTE_REF"); + if (!attributeRef) return; + var outerVal = attributeRef.value; + if (outerVal.indexOf("[") === 0) { + var innerValue = outerVal.substring(2, outerVal.length - 1); + } else { + var innerValue = outerVal.substring(1); + } + var css = "[" + innerValue + "]"; + var split = innerValue.split("="); + var name = split[0]; + var value = split[1]; + if (value) { + // strip quotes + if (value.indexOf('"') === 0) { + value = value.substring(1, value.length - 1); + } + } + return { + type: "attributeRef", + name: name, + css: css, + value: value, + op: function (context) { + var target = context.beingTold || context.me; + if (target) { + return target.getAttribute(name); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("objectKey", function (parser, runtime, tokens) { + var token; + if ((token = tokens.matchTokenType("STRING"))) { + return { + type: "objectKey", + key: token.value, + evaluate: function () { + return this.key; + }, + }; + } else if (tokens.matchOpToken("[")) { + var expr = parser.parseElement("expression", tokens); + tokens.requireOpToken("]"); + return { + type: "objectKey", + expr: expr, + args: [expr], + op: function (ctx, expr) { + return expr; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + var key = ""; + do { + token = tokens.matchTokenType("IDENTIFIER") || tokens.matchOpToken("-"); + if (token) key += token.value; + } while (token); + return { + type: "objectKey", + key: key, + evaluate: function () { + return this.key; + }, + }; + } + }); + + _parser.addLeafExpression("objectLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("{")) return; + var keyExpressions = []; + var valueExpressions = []; + if (!tokens.matchOpToken("}")) { + do { + var name = parser.requireElement("objectKey", tokens); + tokens.requireOpToken(":"); + var value = parser.requireElement("expression", tokens); + valueExpressions.push(value); + keyExpressions.push(name); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken("}"); + } + return { + type: "objectLiteral", + args: [keyExpressions, valueExpressions], + op: function (context, keys, values) { + var returnVal = {}; + for (var i = 0; i < keys.length; i++) { + returnVal[keys[i]] = values[i]; + } + return returnVal; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("namedArgumentList", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("(")) return; + var fields = []; + var valueExpressions = []; + if (!tokens.matchOpToken(")")) { + do { + var name = tokens.requireTokenType("IDENTIFIER"); + tokens.requireOpToken(":"); + var value = parser.requireElement("expression", tokens); + valueExpressions.push(value); + fields.push({ name: name, value: value }); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + return { + type: "namedArgumentList", + fields: fields, + args: [valueExpressions], + op: function (context, values) { + var returnVal = { _namedArgList_: true }; + for (var i = 0; i < values.length; i++) { + var field = fields[i]; + returnVal[field.name.value] = values[i]; + } + return returnVal; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("symbol", function (parser, runtime, tokens) { + var type = "default"; + if (tokens.matchToken("global")) { + type = "global"; + } else if (tokens.matchToken("element")) { + type = "element"; + // optional possessive + if (tokens.matchOpToken("'")) { + tokens.requireToken("s"); + } + } else if (tokens.matchToken("local")) { + type = "local"; + } + var identifier = tokens.matchTokenType("IDENTIFIER"); + if (identifier) { + return { + type: "symbol", + symbolType: type, + token: identifier, + name: identifier.value, + evaluate: function (context) { + return runtime.resolveSymbol(identifier.value, context, type); + }, + }; + } + }); + + _parser.addGrammarElement("implicitMeTarget", function (parser, runtime, tokens) { + return { + type: "implicitMeTarget", + evaluate: function (context) { + return context.beingTold || context.me; + }, + }; + }); + + _parser.addLeafExpression("boolean", function (parser, runtime, tokens) { + var booleanLiteral = tokens.matchToken("true") || tokens.matchToken("false"); + if (!booleanLiteral) return; + return { + type: "boolean", + evaluate: function (context) { + return booleanLiteral.value === "true"; + }, + }; + }); + + _parser.addLeafExpression("null", function (parser, runtime, tokens) { + if (tokens.matchToken("null")) { + return { + type: "null", + evaluate: function (context) { + return null; + }, + }; + } + }); + + _parser.addLeafExpression("arrayLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("[")) return; + var values = []; + if (!tokens.matchOpToken("]")) { + do { + var expr = parser.requireElement("expression", tokens); + values.push(expr); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken("]"); + } + return { + type: "arrayLiteral", + values: values, + args: [values], + op: function (context, values) { + return values; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addLeafExpression("blockLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("\\")) return; + var args = []; + var arg1 = tokens.matchTokenType("IDENTIFIER"); + if (arg1) { + args.push(arg1); + while (tokens.matchOpToken(",")) { + args.push(tokens.requireTokenType("IDENTIFIER")); + } + } + // TODO compound op token + tokens.requireOpToken("-"); + tokens.requireOpToken(">"); + var expr = parser.requireElement("expression", tokens); + return { + type: "blockLiteral", + args: args, + expr: expr, + evaluate: function (ctx) { + var returnFunc = function () { + //TODO - push scope + for (var i = 0; i < args.length; i++) { + ctx[args[i].value] = arguments[i]; + } + return expr.evaluate(ctx); //OK + }; + return returnFunc; + }, + }; + }); + + _parser.addGrammarElement("timeExpression", function (parser, runtime, tokens) { + var time = parser.requireElement("expression", tokens); + var factor = 1; + if (tokens.matchToken("s") || tokens.matchToken("seconds")) { + factor = 1000; + } else if (tokens.matchToken("ms") || tokens.matchToken("milliseconds")) { + // do nothing + } + return { + type: "timeExpression", + time: time, + factor: factor, + args: [time], + op: function (_context, val) { + return val * this.factor; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addIndirectExpression("propertyAccess", function (parser, runtime, tokens, root) { + if (!tokens.matchOpToken(".")) return; + var prop = tokens.requireTokenType("IDENTIFIER"); + var propertyAccess = { + type: "propertyAccess", + root: root, + prop: prop, + args: [root], + op: function (_context, rootVal) { + var value = runtime.resolveProperty(rootVal, prop.value); + return value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + }); + + _parser.addIndirectExpression("of", function (parser, runtime, tokens, root) { + if (!tokens.matchToken("of")) return; + var newRoot = parser.requireElement("expression", tokens); + // find the urroot + var childOfUrRoot = null; + var urRoot = root; + while (urRoot.root) { + childOfUrRoot = urRoot; + urRoot = urRoot.root; + } + if (urRoot.type !== "symbol" && urRoot.type !== "attributeRef") { + parser.raiseParseError(tokens, "Cannot take a property of a non-symbol: " + urRoot.type); + } + var attribute = urRoot.type === "attributeRef"; + var prop = urRoot.name; + var propertyAccess = { + type: "ofExpression", + prop: urRoot.token, + root: newRoot, + attribute: attribute, + expression: root, + args: [newRoot], + op: function (context, rootVal) { + return runtime.resolveProperty(rootVal, prop, attribute); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + + if (urRoot.type === "attributeRef") { + propertyAccess.attribute = urRoot; + } + if (childOfUrRoot) { + childOfUrRoot.root = propertyAccess; + childOfUrRoot.args = [propertyAccess]; + } else { + root = propertyAccess; + } + + return parser.parseElement("indirectExpression", tokens, root); + }); + + _parser.addIndirectExpression("possessive", function (parser, runtime, tokens, root) { + if (parser.possessivesDisabled) { + return; + } + var apostrophe = tokens.matchOpToken("'"); + if ( + apostrophe || + (root.type === "symbol" && + (root.name === "my" || root.name === "its" || root.name === "your") && + tokens.currentToken().type === "IDENTIFIER") + ) { + if (apostrophe) { + tokens.requireToken("s"); + } + var attribute = parser.parseElement("attributeRef", tokens); + if (attribute == null) { + var prop = tokens.requireTokenType("IDENTIFIER"); + } + var propertyAccess = { + type: "possessive", + root: root, + attribute: attribute, + prop: prop, + args: [root], + op: function (context, rootVal) { + if (attribute) { + var value = runtime.resolveProperty(rootVal, attribute.name, true); + } else { + var value = runtime.resolveProperty(rootVal, prop.value, false); + } + return value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + } + }); + + _parser.addIndirectExpression("inExpression", function (parser, runtime, tokens, root) { + if (!tokens.matchToken("in")) return; + if ((root.type !== "idRef" && root.type === "queryRef") || root.type === "classRef") { + var query = true; + } + var target = parser.requireElement("expression", tokens); + var propertyAccess = { + type: "inExpression", + root: root, + args: [query ? null : root, target], + op: function (context, rootVal, target) { + var returnArr = []; + if (query) { + runtime.forEach(target, function (targetElt) { + var results = targetElt.querySelectorAll(root.css); + for (var i = 0; i < results.length; i++) { + returnArr.push(results[i]); + } + }); + } else { + runtime.forEach(rootVal, function (rootElt) { + runtime.forEach(target, function (targetElt) { + if (rootElt === targetElt) { + returnArr.push(rootElt); + } + }); + }); + } + if (returnArr.length > 0) { + return returnArr; + } else { + return null; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + }); + + _parser.addIndirectExpression("asExpression", function (parser, runtime, tokens, root) { + if (!tokens.matchToken("as")) return; + var conversion = parser.requireElement("dotOrColonPath", tokens).evaluate(); // OK No promise + var propertyAccess = { + type: "asExpression", + root: root, + args: [root], + op: function (context, rootVal) { + return runtime.convertValue(rootVal, conversion); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + }); + + _parser.addIndirectExpression("functionCall", function (parser, runtime, tokens, root) { + if (!tokens.matchOpToken("(")) return; + var args = []; + if (!tokens.matchOpToken(")")) { + do { + args.push(parser.requireElement("expression", tokens)); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + + if (root.root) { + var functionCall = { + type: "functionCall", + root: root, + argExressions: args, + args: [root.root, args], + op: function (context, rootRoot, args) { + runtime.nullCheck(rootRoot, root.root); + var func = rootRoot[root.prop.value]; + runtime.nullCheck(func, root); + if (func.hyperfunc) { + args.push(context); + } + return func.apply(rootRoot, args); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + var functionCall = { + type: "functionCall", + root: root, + argExressions: args, + args: [root, args], + op: function (context, func, argVals) { + runtime.nullCheck(func, root); + if (func.hyperfunc) { + argVals.push(context); + } + var apply = func.apply(null, argVals); + return apply; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + return parser.parseElement("indirectExpression", tokens, functionCall); + }); + + _parser.addIndirectExpression("attributeRefAccess", function (parser, runtime, tokens, root) { + var attribute = parser.parseElement("attributeRef", tokens); + if (!attribute) return; + var attributeAccess = { + type: "attributeRefAccess", + root: root, + attribute: attribute, + args: [root], + op: function (_ctx, rootVal) { + var value = runtime.resolveProperty(rootVal, attribute.name, true); + return value; + }, + evaluate: function (context) { + return _runtime.unifiedEval(this, context); + }, + }; + return attributeAccess; + }); + + _parser.addIndirectExpression("arrayIndex", function (parser, runtime, tokens, root) { + if (!tokens.matchOpToken("[")) return; + var andBefore = false; + var andAfter = false; + var firstIndex = null; + var secondIndex = null; + + if (tokens.matchOpToken("..")) { + andBefore = true; + firstIndex = parser.requireElement("expression", tokens); + } else { + firstIndex = parser.requireElement("expression", tokens); + + if (tokens.matchOpToken("..")) { + andAfter = true; + var current = tokens.currentToken(); + if (current.type !== "R_BRACKET") { + secondIndex = parser.parseElement("expression", tokens); + } + } + } + tokens.requireOpToken("]"); + + var arrayIndex = { + type: "arrayIndex", + root: root, + firstIndex: firstIndex, + secondIndex: secondIndex, + args: [root, firstIndex, secondIndex], + op: function (_ctx, root, firstIndex, secondIndex) { + if (andBefore) { + return root.slice(0, firstIndex + 1); // returns all items from beginning to firstIndex (inclusive) + } else if (andAfter) { + if (secondIndex != null) { + return root.slice(firstIndex, secondIndex + 1); // returns all items from firstIndex to secondIndex (inclusive) + } else { + return root.slice(firstIndex); // returns from firstIndex to end of array + } + } else { + return root[firstIndex]; + } + }, + evaluate: function (context) { + return _runtime.unifiedEval(this, context); + }, + }; + + return _parser.parseElement("indirectExpression", tokens, arrayIndex); + }); + + _parser.addGrammarElement("postfixExpression", function (parser, runtime, tokens) { + var root = parser.parseElement("primaryExpression", tokens); + if (tokens.matchOpToken(":")) { + var typeName = tokens.requireTokenType("IDENTIFIER"); + var nullOk = !tokens.matchOpToken("!"); + return { + type: "typeCheck", + typeName: typeName, + root: root, + nullOk: nullOk, + args: [root], + op: function (context, val) { + var passed = runtime.typeCheck(val, this.typeName.value, this.nullOk); + if (passed) { + return val; + } else { + throw new Error("Typecheck failed! Expected: " + this.typeName.value); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + return root; + } + }); + + _parser.addGrammarElement("logicalNot", function (parser, runtime, tokens) { + if (!tokens.matchToken("not")) return; + var root = parser.requireElement("unaryExpression", tokens); + return { + type: "logicalNot", + root: root, + args: [root], + op: function (context, val) { + return !val; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("noExpression", function (parser, runtime, tokens) { + if (!tokens.matchToken("no")) return; + var root = parser.requireElement("unaryExpression", tokens); + return { + type: "noExpression", + root: root, + args: [root], + op: function (_context, val) { + return runtime.isEmpty(val); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("negativeNumber", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("-")) return; + var root = parser.requireElement("unaryExpression", tokens); + return { + type: "negativeNumber", + root: root, + args: [root], + op: function (context, value) { + return -1 * value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("unaryExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf( + ["logicalNot", "positionalExpression", "noExpression", "negativeNumber", "postfixExpression"], + tokens + ); + }); + + _parser.addGrammarElement("positionalExpression", function (parser, runtime, tokens) { + var op = tokens.matchAnyToken("first", "last", "random"); + if (!op) return; + tokens.matchAnyToken("in", "from", "of"); + var rhs = parser.requireElement("unaryExpression", tokens); + return { + type: "positionalExpression", + rhs: rhs, + operator: op.value, + args: [rhs], + op: function (context, rhsVal) { + if (rhsVal && !Array.isArray(rhsVal)) { + if (rhsVal.children) { + rhsVal = rhsVal.children; + } else { + rhsVal = Array.from(rhsVal); + } + } + if (rhsVal) { + if (this.operator === "first") { + return rhsVal[0]; + } else if (this.operator === "last") { + return rhsVal[rhsVal.length - 1]; + } else if (this.operator === "random") { + return rhsVal[Math.floor(Math.random() * rhsVal.length)]; + } + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + _parser.addGrammarElement("mathOperator", function (parser, runtime, tokens) { + var expr = parser.parseElement("unaryExpression", tokens); + var mathOp, + initialMathOp = null; + mathOp = tokens.matchAnyOpToken("+", "-", "*", "/", "%"); + while (mathOp) { + initialMathOp = initialMathOp || mathOp; + var operator = mathOp.value; + if (initialMathOp.value !== operator) { + parser.raiseParseError(tokens, "You must parenthesize math operations with different operators"); + } + var rhs = parser.parseElement("unaryExpression", tokens); + expr = { + type: "mathOperator", + lhs: expr, + rhs: rhs, + operator: operator, + args: [expr, rhs], + op: function (context, lhsVal, rhsVal) { + if (this.operator === "+") { + return lhsVal + rhsVal; + } else if (this.operator === "-") { + return lhsVal - rhsVal; + } else if (this.operator === "*") { + return lhsVal * rhsVal; + } else if (this.operator === "/") { + return lhsVal / rhsVal; + } else if (this.operator === "%") { + return lhsVal % rhsVal; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + mathOp = tokens.matchAnyOpToken("+", "-", "*", "/", "%"); + } + return expr; + }); + + _parser.addGrammarElement("mathExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf(["mathOperator", "unaryExpression"], tokens); + }); + + _parser.addGrammarElement("comparisonOperator", function (parser, runtime, tokens) { + var expr = parser.parseElement("mathExpression", tokens); + var comparisonToken = tokens.matchAnyOpToken("<", ">", "<=", ">=", "==", "===", "!=", "!=="); + var comparisonStr = comparisonToken ? comparisonToken.value : null; + var hasRightValue = true; // By default, most comparisons require two values, but there are some exceptions. + var typeCheck = false; + + if (comparisonStr == null) { + if (tokens.matchToken("is") || tokens.matchToken("am")) { + if (tokens.matchToken("not")) { + if (tokens.matchToken("in")) { + comparisonStr = "not in"; + } else if (tokens.matchToken("a")) { + comparisonStr = "not a"; + typeCheck = true; + } else if (tokens.matchToken("empty")) { + comparisonStr = "not empty"; + hasRightValue = false; + } else { + comparisonStr = "!="; + } + } else if (tokens.matchToken("in")) { + comparisonStr = "in"; + } else if (tokens.matchToken("a")) { + comparisonStr = "a"; + typeCheck = true; + } else if (tokens.matchToken("empty")) { + comparisonStr = "empty"; + hasRightValue = false; + } else { + comparisonStr = "=="; + } + } else if (tokens.matchToken("matches") || tokens.matchToken("match")) { + comparisonStr = "match"; + } else if (tokens.matchToken("contains") || tokens.matchToken("contain")) { + comparisonStr = "contain"; + } else if (tokens.matchToken("do") || tokens.matchToken("does")) { + tokens.requireToken("not"); + if (tokens.matchToken("matches") || tokens.matchToken("match")) { + comparisonStr = "not match"; + } else if (tokens.matchToken("contains") || tokens.matchToken("contain")) { + comparisonStr = "not contain"; + } else { + parser.raiseParseError(tokens, "Expected matches or contains"); + } + } + } + + if (comparisonStr) { + // Do not allow chained comparisons, which is dumb + if (typeCheck) { + var typeName = tokens.requireTokenType("IDENTIFIER"); + var nullOk = !tokens.matchOpToken("!"); + } else if (hasRightValue) { + var rhs = parser.requireElement("mathExpression", tokens); + if (comparisonStr === "match" || comparisonStr === "not match") { + rhs = rhs.css ? rhs.css : rhs; + } + } + expr = { + type: "comparisonOperator", + operator: comparisonStr, + typeName: typeName, + nullOk: nullOk, + lhs: expr, + rhs: rhs, + args: [expr, rhs], + op: function (context, lhsVal, rhsVal) { + if (this.operator === "==") { + return lhsVal == rhsVal; + } else if (this.operator === "!=") { + return lhsVal != rhsVal; + } + if (this.operator === "in") { + return rhsVal != null && Array.from(rhsVal).indexOf(lhsVal) >= 0; + } + if (this.operator === "not in") { + return rhsVal == null || Array.from(rhsVal).indexOf(lhsVal) < 0; + } + if (this.operator === "match") { + return lhsVal != null && lhsVal.matches(rhsVal); + } + if (this.operator === "not match") { + return lhsVal == null || !lhsVal.matches(rhsVal); + } + if (this.operator === "contain") { + return lhsVal != null && lhsVal.contains(rhsVal); + } + if (this.operator === "not contain") { + return lhsVal == null || !lhsVal.contains(rhsVal); + } + if (this.operator === "===") { + return lhsVal === rhsVal; + } else if (this.operator === "!==") { + return lhsVal !== rhsVal; + } else if (this.operator === "<") { + return lhsVal < rhsVal; + } else if (this.operator === ">") { + return lhsVal > rhsVal; + } else if (this.operator === "<=") { + return lhsVal <= rhsVal; + } else if (this.operator === ">=") { + return lhsVal >= rhsVal; + } else if (this.operator === "empty") { + return runtime.isEmpty(lhsVal); + } else if (this.operator === "not empty") { + return !runtime.isEmpty(lhsVal); + } else if (this.operator === "a") { + return runtime.typeCheck(lhsVal, this.typeName.value, this.nullOk); + } else if (this.operator === "not a") { + return !runtime.typeCheck(lhsVal, this.typeName.value, this.nullOk); + } else { + throw "Unknown comparison : " + this.operator; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + return expr; + }); + + _parser.addGrammarElement("comparisonExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf(["comparisonOperator", "mathExpression"], tokens); + }); + + _parser.addGrammarElement("logicalOperator", function (parser, runtime, tokens) { + var expr = parser.parseElement("comparisonExpression", tokens); + var logicalOp, + initialLogicalOp = null; + logicalOp = tokens.matchToken("and") || tokens.matchToken("or"); + while (logicalOp) { + initialLogicalOp = initialLogicalOp || logicalOp; + if (initialLogicalOp.value !== logicalOp.value) { + parser.raiseParseError(tokens, "You must parenthesize logical operations with different operators"); + } + var rhs = parser.requireElement("comparisonExpression", tokens); + expr = { + type: "logicalOperator", + operator: logicalOp.value, + lhs: expr, + rhs: rhs, + args: [expr, rhs], + op: function (context, lhsVal, rhsVal) { + if (this.operator === "and") { + return lhsVal && rhsVal; + } else { + return lhsVal || rhsVal; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + logicalOp = tokens.matchToken("and") || tokens.matchToken("or"); + } + return expr; + }); + + _parser.addGrammarElement("logicalExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf(["logicalOperator", "mathExpression"], tokens); + }); + + _parser.addGrammarElement("asyncExpression", function (parser, runtime, tokens) { + if (tokens.matchToken("async")) { + var value = parser.requireElement("logicalExpression", tokens); + var expr = { + type: "asyncExpression", + value: value, + evaluate: function (context) { + return { + asyncWrapper: true, + value: this.value.evaluate(context), //OK + }; + }, + }; + return expr; + } else { + return parser.parseElement("logicalExpression", tokens); + } + }); + + _parser.addGrammarElement("expression", function (parser, runtime, tokens) { + tokens.matchToken("the"); // optional the + return parser.parseElement("asyncExpression", tokens); + }); + + _parser.addGrammarElement("assignableExpression", function (parser, runtime, tokens) { + tokens.matchToken("the"); // optional the + + // TODO obviously we need to generalize this as a left hand side / targetable concept + var expr = parser.parseElement("primaryExpression", tokens); + if ( + expr.type === "symbol" || + expr.type === "ofExpression" || + expr.type === "propertyAccess" || + expr.type === "attributeRefAccess" || + expr.type === "attributeRef" || + expr.type === "possessive" + ) { + return expr; + } else { + _parser.raiseParseError( + tokens, + "A target expression must be writable. The expression type '" + expr.type + "' is not." + ); + } + return expr; + }); + + _parser.addGrammarElement("hyperscript", function (parser, runtime, tokens) { + var features = []; + + if (tokens.hasMore()) { + while (parser.featureStart(tokens.currentToken()) || tokens.currentToken().value === "(") { + var feature = parser.requireElement("feature", tokens); + features.push(feature); + tokens.matchToken("end"); // optional end + } + } + return { + type: "hyperscript", + features: features, + apply: function (target, source, args) { + // no op + _runtime.forEach(features, function (feature) { + feature.install(target, source, args); + }); + }, + }; + }); + + var parseEventArgs = function (tokens) { + var args = []; + // handle argument list (look ahead 3) + if ( + tokens.token(0).value === "(" && + (tokens.token(1).value === ")" || tokens.token(2).value === "," || tokens.token(2).value === ")") + ) { + tokens.matchOpToken("("); + do { + args.push(tokens.requireTokenType("IDENTIFIER")); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + return args; + }; + + _parser.addFeature("on", function (parser, runtime, tokens) { + if (!tokens.matchToken("on")) return; + var every = false; + if (tokens.matchToken("every")) { + every = true; + } + var events = []; + var displayName = null; + do { + var on = parser.requireElement("eventName", tokens, "Expected event name"); + + var eventName = on.evaluate(); // OK No Promise + + if (displayName) { + displayName = displayName + " or " + eventName; + } else { + displayName = "on " + eventName; + } + var args = parseEventArgs(tokens); + + var filter = null; + if (tokens.matchOpToken("[")) { + filter = parser.requireElement("expression", tokens); + tokens.requireOpToken("]"); + } + + if (tokens.currentToken().type === "NUMBER") { + var startCountToken = tokens.consumeToken(); + var startCount = parseInt(startCountToken.value); + if (tokens.matchToken("to")) { + var endCountToken = tokens.consumeToken(); + var endCount = parseInt(endCountToken.value); + } else if (tokens.matchToken("and")) { + var unbounded = true; + tokens.requireToken("on"); + } + } + + if (eventName === "intersection") { + var intersectionSpec = {}; + if (tokens.matchToken("with")) { + intersectionSpec["with"] = parser.parseElement("expression", tokens).evaluate(); + } + if (tokens.matchToken("having")) { + do { + if (tokens.matchToken("margin")) { + intersectionSpec["rootMargin"] = parser.parseElement("stringLike", tokens).evaluate(); + } else if (tokens.matchToken("threshold")) { + intersectionSpec["threshold"] = parser.parseElement("expression", tokens).evaluate(); + } else { + parser.raiseParseError(tokens, "Unknown intersection config specification"); + } + } while (tokens.matchToken("and")); + } + } else if (eventName === "mutation") { + var mutationSpec = {}; + if (tokens.matchToken("of")) { + do { + if (tokens.matchToken("anything")) { + mutationSpec["attributes"] = true; + mutationSpec["subtree"] = true; + mutationSpec["characterData"] = true; + mutationSpec["childList"] = true; + } else if (tokens.matchToken("childList")) { + mutationSpec["childList"] = true; + } else if (tokens.matchToken("attributes")) { + mutationSpec["attributes"] = true; + mutationSpec["attributeOldValue"] = true; + } else if (tokens.matchToken("subtree")) { + mutationSpec["subtree"] = true; + } else if (tokens.matchToken("characterData")) { + mutationSpec["characterData"] = true; + mutationSpec["characterDataOldValue"] = true; + } else if (tokens.currentToken().type === "ATTRIBUTE_REF") { + var attribute = tokens.consumeToken(); + if (mutationSpec["attributeFilter"] == null) { + mutationSpec["attributeFilter"] = []; + } + if (attribute.value.indexOf("@") == 0) { + mutationSpec["attributeFilter"].push(attribute.value.substring(1)); + } else { + parser.raiseParseError( + tokens, + "Only shorthand attribute references are allowed here" + ); + } + } else { + parser.raiseParseError(tokens, "Unknown mutation config specification"); + } + } while (tokens.matchToken("or")); + } else { + mutationSpec["attributes"] = true; + mutationSpec["characterData"] = true; + mutationSpec["childList"] = true; + } + } + + var from = null; + var elsewhere = false; + if (tokens.matchToken("from")) { + if (tokens.matchToken("elsewhere")) { + elsewhere = true; + } else { + from = parser.parseElement("expression", tokens); + if (!from) { + parser.raiseParseError('Expected either target value or "elsewhere".', tokens); + } + } + } + // support both "elsewhere" and "from elsewhere" + if (from === null && elsewhere === false && tokens.matchToken("elsewhere")) { + elsewhere = true; + } + + if (tokens.matchToken("in")) { + var inExpr = parser.parseAnyOf(["idRef", "queryRef", "classRef"], tokens); + } + + if (tokens.matchToken("debounced")) { + tokens.requireToken("at"); + var timeExpr = parser.requireElement("timeExpression", tokens); + var debounceTime = timeExpr.evaluate({}); // OK No promise TODO make a literal time expr + } else if (tokens.matchToken("throttled")) { + tokens.requireToken("at"); + var timeExpr = parser.requireElement("timeExpression", tokens); + var throttleTime = timeExpr.evaluate({}); // OK No promise TODO make a literal time expr + } + + events.push({ + execCount: 0, + every: every, + on: eventName, + args: args, + filter: filter, + from: from, + inExpr: inExpr, + elsewhere: elsewhere, + startCount: startCount, + endCount: endCount, + unbounded: unbounded, + debounceTime: debounceTime, + throttleTime: throttleTime, + mutationSpec: mutationSpec, + intersectionSpec: intersectionSpec, + }); + } while (tokens.matchToken("or")); + + var queue = []; + var queueLast = true; + if (!every) { + if (tokens.matchToken("queue")) { + if (tokens.matchToken("all")) { + var queueAll = true; + var queueLast = false; + } else if (tokens.matchToken("first")) { + var queueFirst = true; + } else if (tokens.matchToken("none")) { + var queueNone = true; + } else { + tokens.requireToken("last"); + } + } + } + + var start = parser.requireElement("commandList", tokens); + + var implicitReturn = { + type: "implicitReturn", + op: function (context) { + // automatically resolve at the end of an event handler if nothing else does + context.meta.resolve(); + return runtime.HALT; + }, + execute: function (ctx) { + // do nothing + }, + }; + if (start) { + var end = start; + while (end.next) { + end = end.next; + } + end.next = implicitReturn; + } else { + start = implicitReturn; + } + + var onFeature = { + displayName: displayName, + events: events, + start: start, + every: every, + executing: false, + execCount: 0, + queue: queue, + execute: function (/** @type {Context} */ ctx) { + if (this.executing && this.every === false) { + if (queueNone || (queueFirst && queue.length > 0)) { + return; + } + if (queueLast) { + onFeature.queue.length = 0; + } + onFeature.queue.push(ctx); + return; + } + this.execCount++; + this.executing = true; + ctx.meta.resolve = function () { + onFeature.executing = false; + var queued = onFeature.queue.shift(); + if (queued) { + setTimeout(function () { + onFeature.execute(queued); + }, 1); + } + }; + ctx.meta.reject = function (err) { + console.error(err.message ? err.message : err); + var hypertrace = runtime.getHyperTrace(ctx, err); + if (hypertrace) { + hypertrace.print(); + } + runtime.triggerEvent(ctx.me, "exception", { + error: err, + }); + onFeature.executing = false; + var queued = onFeature.queue.shift(); + if (queued) { + setTimeout(function () { + onFeature.execute(queued); + }, 1); + } + }; + start.execute(ctx); + }, + install: function (elt, source) { + runtime.forEach(onFeature.events, function (eventSpec) { + var targets; + if (eventSpec.elsewhere) { + targets = [document]; + } else if (eventSpec.from) { + targets = eventSpec.from.evaluate({ + me: elt, + }); + } else { + targets = [elt]; + } + runtime.forEach(targets, function (target) { + // OK NO PROMISE + + var eventName = eventSpec.on; + if (eventSpec.mutationSpec) { + eventName = "hyperscript:mutation"; + var observer = new MutationObserver(function (mutationList, observer) { + console.log(target, mutationList); + if (!onFeature.executing) { + _runtime.triggerEvent(target, eventName, { + mutationList: mutationList, + observer: observer, + }); + } + }); + observer.observe(target, eventSpec.mutationSpec); + } + + if (eventSpec.intersectionSpec) { + eventName = "hyperscript:insersection"; + var observer = new IntersectionObserver(function (entries) { + _runtime.forEach(entries, function (entry) { + var detail = { + observer: observer, + }; + detail = mergeObjects(detail, entry); + detail["intersecting"] = entry.isIntersecting; + _runtime.triggerEvent(target, eventName, detail); + }); + }, eventSpec.intersectionSpec); + observer.observe(target); + } + + target.addEventListener(eventName, function listener(evt) { + // OK NO PROMISE + if (elt instanceof Node && target !== elt && elt.getRootNode() === null) { + target.removeEventListener(eventName, listener); + return; + } + + var ctx = runtime.makeContext(elt, onFeature, elt, evt); + if (eventSpec.elsewhere && elt.contains(evt.target)) { + return; + } + if (eventSpec.from) { + ctx.result = target; + } + + // establish context + runtime.forEach(eventSpec.args, function (arg) { + ctx[arg.value] = + ctx.event[arg.value] || (ctx.event.detail ? ctx.event.detail[arg.value] : null); + }); + + // apply filter + if (eventSpec.filter) { + var initialCtx = ctx.meta.context; + ctx.meta.context = ctx.event; + try { + var value = eventSpec.filter.evaluate(ctx); //OK NO PROMISE + if (value) { + // match the javascript semantics for if statements + } else { + return; + } + } finally { + ctx.meta.context = initialCtx; + } + } + + if (eventSpec.inExpr) { + var inElement = evt.target; + while (true) { + if (inElement.matches && inElement.matches(eventSpec.inExpr.css)) { + ctx.result = inElement; + break; + } else { + inElement = inElement.parentElement; + if (inElement == null) { + return; // no match found + } + } + } + } + + // verify counts + eventSpec.execCount++; + if (eventSpec.startCount) { + if (eventSpec.endCount) { + if ( + eventSpec.execCount < eventSpec.startCount || + eventSpec.execCount > eventSpec.endCount + ) { + return; + } + } else if (eventSpec.unbounded) { + if (eventSpec.execCount < eventSpec.startCount) { + return; + } + } else if (eventSpec.execCount !== eventSpec.startCount) { + return; + } + } + + //debounce + if (eventSpec.debounceTime) { + if (eventSpec.debounced) { + clearTimeout(eventSpec.debounced); + } + eventSpec.debounced = setTimeout(function () { + onFeature.execute(ctx); + }, eventSpec.debounceTime); + return; + } + + // throttle + if (eventSpec.throttleTime) { + if ( + eventSpec.lastExec && + Date.now() < eventSpec.lastExec + eventSpec.throttleTime + ) { + return; + } else { + eventSpec.lastExec = Date.now(); + } + } + + // apply execute + onFeature.execute(ctx); + }); + }); + }); + }, + }; + parser.setParent(start, onFeature); + return onFeature; + }); + + _parser.addFeature("def", function (parser, runtime, tokens) { + if (!tokens.matchToken("def")) return; + var functionName = parser.requireElement("dotOrColonPath", tokens); + var nameVal = functionName.evaluate(); // OK + var nameSpace = nameVal.split("."); + var funcName = nameSpace.pop(); + + var args = []; + if (tokens.matchOpToken("(")) { + if (tokens.matchOpToken(")")) { + // emtpy args list + } else { + do { + args.push(tokens.requireTokenType("IDENTIFIER")); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + } + + var start = parser.parseElement("commandList", tokens); + if (tokens.matchToken("catch")) { + var errorSymbol = tokens.requireTokenType("IDENTIFIER").value; + var errorHandler = parser.parseElement("commandList", tokens); + } + var functionFeature = { + displayName: + funcName + + "(" + + args + .map(function (arg) { + return arg.value; + }) + .join(", ") + + ")", + name: funcName, + args: args, + start: start, + errorHandler: errorHandler, + errorSymbol: errorSymbol, + install: function (target, source) { + var func = function () { + // null, worker + var ctx = runtime.makeContext(source, functionFeature, target, null); + + // install error handler if any + ctx.meta.errorHandler = errorHandler; + ctx.meta.errorSymmbol = errorSymbol; + + for (var i = 0; i < args.length; i++) { + var name = args[i]; + var argumentVal = arguments[i]; + if (name) { + ctx[name.value] = argumentVal; + } + } + ctx.meta.caller = arguments[args.length]; + if (ctx.meta.caller) { + ctx.meta.callingCommand = ctx.meta.caller.meta.command; + } + var resolve, + reject = null; + var promise = new Promise(function (theResolve, theReject) { + resolve = theResolve; + reject = theReject; + }); + start.execute(ctx); + if (ctx.meta.returned) { + return ctx.meta.returnValue; + } else { + ctx.meta.resolve = resolve; + ctx.meta.reject = reject; + return promise; + } + }; + func.hyperfunc = true; + func.hypername = nameVal; + runtime.assignToNamespace(target, nameSpace, funcName, func); + }, + }; + + var implicitReturn = { + type: "implicitReturn", + op: function (context) { + // automatically return at the end of the function if nothing else does + context.meta.returned = true; + if (context.meta.resolve) { + context.meta.resolve(); + } + return runtime.HALT; + }, + execute: function (context) { + // do nothing + }, + }; + // terminate body + if (start) { + var end = start; + while (end.next) { + end = end.next; + } + end.next = implicitReturn; + } else { + functionFeature.start = implicitReturn; + } + + // terminate error handler + if (errorHandler) { + var end = errorHandler; + while (end.next) { + end = end.next; + } + end.next = implicitReturn; + } + + parser.setParent(start, functionFeature); + return functionFeature; + }); + + _parser.addFeature("init", function (parser, runtime, tokens) { + if (!tokens.matchToken("init")) return; + + var start = parser.parseElement("commandList", tokens); + var initFeature = { + start: start, + install: function (target, source) { + setTimeout(function () { + start.execute(runtime.makeContext(target, this, target, null)); + }, 0); + }, + }; + + var implicitReturn = { + type: "implicitReturn", + op: function (context) { + return runtime.HALT; + }, + execute: function (context) { + // do nothing + }, + }; + // terminate body + if (start) { + var end = start; + while (end.next) { + end = end.next; + } + end.next = implicitReturn; + } else { + initFeature.start = implicitReturn; + } + parser.setParent(start, initFeature); + return initFeature; + }); + + _parser.addFeature("worker", function (parser, runtime, tokens) { + if (tokens.matchToken("worker")) { + parser.raiseParseError( + tokens, + "In order to use the 'worker' feature, include " + + "the _hyperscript worker plugin. See " + + "https://hyperscript.org/features/worker/ for " + + "more info." + ); + } + }); + + _parser.addFeature("behavior", function (parser, runtime, tokens) { + if (!tokens.matchToken("behavior")) return; + var path = parser.parseElement("dotOrColonPath", tokens).evaluate(); + var nameSpace = path.split("."); + var name = nameSpace.pop(); + + var formalParams = []; + if (tokens.matchOpToken("(") && !tokens.matchOpToken(")")) { + do { + formalParams.push(tokens.requireTokenType("IDENTIFIER").value); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + var hs = parser.parseElement("hyperscript", tokens); + for (var i = 0; i < hs.features.length; i++) { + var feature = hs.features[i]; + feature.behavior = path; + } + + return { + install: function (target, source) { + runtime.assignToNamespace( + globalScope.document && globalScope.document.body, + nameSpace, + name, + function (target, source, innerArgs) { + var internalData = runtime.getInternalData(target); + var elementScope = getOrInitObject(internalData, path + "Scope"); + for (var i = 0; i < formalParams.length; i++) { + elementScope[formalParams[i]] = innerArgs[formalParams[i]]; + } + hs.apply(target, source); + } + ); + }, + }; + }); + + _parser.addFeature("install", function (parser, runtime, tokens) { + if (!tokens.matchToken("install")) return; + var behaviorPath = parser.requireElement("dotOrColonPath", tokens).evaluate(); + var behaviorNamespace = behaviorPath.split("."); + var args = parser.parseElement("namedArgumentList", tokens); + + var installFeature; + return (installFeature = { + install: function (target, source) { + runtime.unifiedEval( + { + args: [args], + op: function (ctx, args) { + var behavior = globalScope; + for (var i = 0; i < behaviorNamespace.length; i++) { + behavior = behavior[behaviorNamespace[i]]; + if (typeof behavior !== "object" && typeof behavior !== "function") + throw new Error("No such behavior defined as " + behaviorPath); + } + + if (!(behavior instanceof Function)) + throw new Error(behaviorPath + " is not a behavior"); + + behavior(target, source, args); + }, + }, + runtime.makeContext(target, installFeature, target) + ); + }, + }); + }); + + _parser.addGrammarElement("jsBody", function (parser, runtime, tokens) { + var jsSourceStart = tokens.currentToken().start; + var jsLastToken = tokens.currentToken(); + + var funcNames = []; + var funcName = ""; + var expectFunctionDeclaration = false; + while (tokens.hasMore()) { + jsLastToken = tokens.consumeToken(); + var peek = tokens.currentToken(true); + if (peek.type === "IDENTIFIER" && peek.value === "end") { + break; + } + if (expectFunctionDeclaration) { + if (jsLastToken.type === "IDENTIFIER" || jsLastToken.type === "NUMBER") { + funcName += jsLastToken.value; + } else { + if (funcName !== "") funcNames.push(funcName); + funcName = ""; + expectFunctionDeclaration = false; + } + } else if (jsLastToken.type === "IDENTIFIER" && jsLastToken.value === "function") { + expectFunctionDeclaration = true; + } + } + var jsSourceEnd = jsLastToken.end + 1; + + return { + type: "jsBody", + exposedFunctionNames: funcNames, + jsSource: tokens.source.substring(jsSourceStart, jsSourceEnd), + }; + }); + + _parser.addFeature("js", function (parser, runtime, tokens) { + if (!tokens.matchToken("js")) return; + var jsBody = parser.parseElement("jsBody", tokens); + + var jsSource = + jsBody.jsSource + + "\nreturn { " + + jsBody.exposedFunctionNames + .map(function (name) { + return name + ":" + name; + }) + .join(",") + + " } "; + var func = new Function(jsSource); + + return { + jsSource: jsSource, + function: func, + exposedFunctionNames: jsBody.exposedFunctionNames, + install: function () { + mergeObjects(globalScope, func()); + }, + }; + }); + + _parser.addCommand("js", function (parser, runtime, tokens) { + if (!tokens.matchToken("js")) return; + // Parse inputs + var inputs = []; + if (tokens.matchOpToken("(")) { + if (tokens.matchOpToken(")")) { + // empty input list + } else { + do { + var inp = tokens.requireTokenType("IDENTIFIER"); + inputs.push(inp.value); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + } + + var jsBody = parser.parseElement("jsBody", tokens); + tokens.matchToken("end"); + + var func = varargConstructor(Function, inputs.concat([jsBody.jsSource])); + + return { + jsSource: jsBody.jsSource, + function: func, + inputs: inputs, + op: function (context) { + var args = []; + inputs.forEach(function (input) { + args.push(runtime.resolveSymbol(input, context)); + }); + var result = func.apply(globalScope, args); + if (result && typeof result.then === "function") { + return Promise(function (resolve) { + result.then(function (actualResult) { + context.result = actualResult; + resolve(runtime.findNext(this, context)); + }); + }); + } else { + context.result = result; + return runtime.findNext(this, context); + } + }, + }; + }); + + _parser.addCommand("async", function (parser, runtime, tokens) { + if (!tokens.matchToken("async")) return; + if (tokens.matchToken("do")) { + var body = parser.requireElement("commandList", tokens); + tokens.requireToken("end"); + } else { + var body = parser.requireElement("command", tokens); + } + return { + body: body, + op: function (context) { + setTimeout(function () { + body.execute(context); + }); + return runtime.findNext(this, context); + }, + }; + }); + + _parser.addCommand("tell", function (parser, runtime, tokens) { + var startToken = tokens.currentToken(); + if (!tokens.matchToken("tell")) return; + var value = parser.requireElement("expression", tokens); + var body = parser.requireElement("commandList", tokens); + if (tokens.hasMore()) { + tokens.requireToken("end"); + } + var slot = "tell_" + startToken.start; + var tellCmd = { + value: value, + body: body, + args: [value], + resolveNext: function (context) { + var iterator = context.meta.iterators[slot]; + if (iterator.index < iterator.value.length) { + context.beingTold = iterator.value[iterator.index++]; + return body; + } else { + // restore original me + context.beingTold = iterator.originalBeingTold; + if (this.next) { + return this.next; + } else { + return runtime.findNext(this.parent, context); + } + } + }, + op: function (context, value) { + if (value == null) { + value = []; + } else if (!(Array.isArray(value) || value instanceof NodeList)) { + value = [value]; + } + context.meta.iterators[slot] = { + originalBeingTold: context.beingTold, + index: 0, + value: value, + }; + return this.resolveNext(context); + }, + }; + parser.setParent(body, tellCmd); + return tellCmd; + }); + + _parser.addCommand("wait", function (parser, runtime, tokens) { + if (!tokens.matchToken("wait")) return; + // wait on event + if (tokens.matchToken("for")) { + tokens.matchToken("a"); // optional "a" + var events = []; + do { + events.push({ + name: _parser.requireElement("dotOrColonPath", tokens, "Expected event name").evaluate(), + args: parseEventArgs(tokens), + }); + } while (tokens.matchToken("or")); + + if (tokens.matchToken("from")) { + var on = parser.requireElement("expression", tokens); + } + + // wait on event + var waitCmd = { + event: events, + on: on, + args: [on], + op: function (context, on) { + var target = on ? on : context.me; + if (!(target instanceof EventTarget)) + throw new Error("Not a valid event target: " + this.on.sourceFor()); + return new Promise(function (resolve) { + var resolved = false; + runtime.forEach(events, function (eventInfo) { + var listener = function (event) { + context.result = event; + runtime.forEach(eventInfo.args, function (arg) { + context[arg.value] = + event[arg.value] || (event.detail ? event.detail[arg.value] : null); + }); + if (!resolved) { + resolved = true; + resolve(runtime.findNext(waitCmd, context)); + } + }; + target.addEventListener(eventInfo.name, listener, { once: true }); + }); + }); + }, + }; + } else { + if (tokens.matchToken("a")) { + tokens.requireToken("tick"); + time = 0; + } else { + var time = _parser.requireElement("timeExpression", tokens); + } + + var waitCmd = { + type: "waitCmd", + time: time, + args: [time], + op: function (context, timeValue) { + return new Promise(function (resolve) { + setTimeout(function () { + resolve(runtime.findNext(waitCmd, context)); + }, timeValue); + }); + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + } + return waitCmd; + }); + + // TODO - colon path needs to eventually become part of ruby-style symbols + _parser.addGrammarElement("dotOrColonPath", function (parser, runtime, tokens) { + var root = tokens.matchTokenType("IDENTIFIER"); + if (root) { + var path = [root.value]; + + var separator = tokens.matchOpToken(".") || tokens.matchOpToken(":"); + if (separator) { + do { + path.push(tokens.requireTokenType("IDENTIFIER").value); + } while (tokens.matchOpToken(separator.value)); + } + + return { + type: "dotOrColonPath", + path: path, + evaluate: function () { + return path.join(separator ? separator.value : ""); + }, + }; + } + }); + + _parser.addGrammarElement("eventName", function (parser, runtime, tokens) { + var token; + if ((token = tokens.matchTokenType("STRING"))) { + return { + evaluate: function() { + return token.value; + }, + }; + } + + return parser.parseElement("dotOrColonPath", tokens); + }); + + _parser.addCommand("send", function (parser, runtime, tokens) { + if (!tokens.matchToken("send")) return; + var eventName = parser.requireElement("eventName", tokens); + + var details = parser.parseElement("namedArgumentList", tokens); + if (tokens.matchToken("to")) { + var to = parser.requireElement("expression", tokens); + } else { + var to = parser.requireElement("implicitMeTarget", tokens); + } + + var sendCmd = { + eventName: eventName, + details: details, + to: to, + args: [to, eventName, details], + op: function (context, to, eventName, details) { + runtime.forEach(to, function (target) { + runtime.triggerEvent(target, eventName, details ? details : {}); + }); + return runtime.findNext(sendCmd, context); + }, + }; + return sendCmd; + }); + + var parseReturnFunction = function (parser, runtime, tokens, returnAValue) { + if (returnAValue) { + var value = parser.requireElement("expression", tokens); + } + + var returnCmd = { + value: value, + args: [value], + op: function (context, value) { + var resolve = context.meta.resolve; + context.meta.returned = true; + if (resolve) { + if (value) { + resolve(value); + } else { + resolve(); + } + } else { + context.meta.returned = true; + context.meta.returnValue = value; + } + return runtime.HALT; + }, + }; + return returnCmd; + }; + + _parser.addCommand("return", function (parser, runtime, tokens) { + if (tokens.matchToken("return")) { + return parseReturnFunction(parser, runtime, tokens, true); + } + }); + + _parser.addCommand("exit", function (parser, runtime, tokens) { + if (tokens.matchToken("exit")) { + return parseReturnFunction(parser, runtime, tokens, false); + } + }); + + _parser.addCommand("halt", function (parser, runtime, tokens) { + if (tokens.matchToken("halt")) { + if (tokens.matchToken("the")) { + tokens.requireToken("event"); + // optional possessive + if (tokens.matchOpToken("'")) { + tokens.requireToken("s"); + } + var keepExecuting = true; + } + if (tokens.matchToken("bubbling")) { + var bubbling = true; + } else if (tokens.matchToken("default")) { + var haltDefault = true; + } + var exit = parseReturnFunction(parser, runtime, tokens, false); + + var haltCmd = { + keepExecuting: true, + bubbling: bubbling, + haltDefault: haltDefault, + exit: exit, + op: function (ctx) { + if (ctx.event) { + if (bubbling) { + ctx.event.stopPropagation(); + } else if (haltDefault) { + ctx.event.preventDefault(); + } else { + ctx.event.stopPropagation(); + ctx.event.preventDefault(); + } + if (keepExecuting) { + return runtime.findNext(this, ctx); + } else { + return exit; + } + } + }, + }; + return haltCmd; + } + }); + + _parser.addCommand("log", function (parser, runtime, tokens) { + if (!tokens.matchToken("log")) return; + var exprs = [parser.parseElement("expression", tokens)]; + while (tokens.matchOpToken(",")) { + exprs.push(parser.requireElement("expression", tokens)); + } + if (tokens.matchToken("with")) { + var withExpr = parser.requireElement("expression", tokens); + } + var logCmd = { + exprs: exprs, + withExpr: withExpr, + args: [withExpr, exprs], + op: function (ctx, withExpr, values) { + if (withExpr) { + withExpr.apply(null, values); + } else { + console.log.apply(null, values); + } + return runtime.findNext(this, ctx); + }, + }; + return logCmd; + }); + + _parser.addCommand("throw", function (parser, runtime, tokens) { + if (!tokens.matchToken("throw")) return; + var expr = parser.requireElement("expression", tokens); + var throwCmd = { + expr: expr, + args: [expr], + op: function (ctx, expr) { + runtime.registerHyperTrace(ctx, expr); + var reject = ctx.meta && ctx.meta.reject; + if (reject) { + reject(expr); + return runtime.HALT; + } else { + throw expr; + } + }, + }; + return throwCmd; + }); + + var parseCallOrGet = function (parser, runtime, tokens) { + var expr = parser.requireElement("expression", tokens); + var callCmd = { + expr: expr, + args: [expr], + op: function (context, result) { + context.result = result; + return runtime.findNext(callCmd, context); + }, + }; + return callCmd; + }; + _parser.addCommand("call", function (parser, runtime, tokens) { + if (!tokens.matchToken("call")) return; + var call = parseCallOrGet(parser, runtime, tokens); + if (call.expr && call.expr.type !== "functionCall") { + parser.raiseParseError(tokens, "Must be a function invocation"); + } + return call; + }); + _parser.addCommand("get", function (parser, runtime, tokens) { + if (tokens.matchToken("get")) { + return parseCallOrGet(parser, runtime, tokens); + } + }); + + _parser.addCommand("make", function (parser, runtime, tokens) { + if (!tokens.matchToken("make")) return; + tokens.matchToken("a") || tokens.matchToken("an"); + + var expr = parser.requireElement("expression", tokens); + + var args = []; + if (expr.type !== "queryRef" && tokens.matchToken("from")) { + do { + args.push(parser.requireElement("expression", tokens)); + } while (tokens.matchOpToken(",")); + } + + if (tokens.matchToken("called")) { + var name = tokens.requireTokenType("IDENTIFIER").value; + } + + if (expr.type === "queryRef") + return { + op: function (ctx) { + var match, + tagname = "div", + id, + classes = []; + var re = /(?:(^|#|\.)([^#\. ]+))/g; + while ((match = re.exec(expr.css))) { + if (match[1] === "") tagname = match[2].trim(); + else if (match[1] === "#") id = match[2].trim(); + else classes.push(match[2].trim()); + } + + var result = document.createElement(tagname); + if (id !== undefined) result.id = id; + for (var i = 0; i < classes.length; i++) { + var cls = classes[i]; + result.classList.add(cls) + } + + ctx.result = result; + if (name) ctx[name] = result; + + return runtime.findNext(this, ctx); + }, + }; + else + return { + args: [expr, args], + op: function (ctx, expr, args) { + ctx.result = varargConstructor(expr, args); + if (name) ctx[name] = ctx.result; + + return runtime.findNext(this, ctx); + }, + }; + }); + + _parser.addGrammarElement("pseudoCommand", function (parser, runtime, tokens) { + var expr = parser.requireElement("primaryExpression", tokens); + if (expr.type !== "functionCall" && expr.root.type !== "symbol") { + parser.raiseParseError("Implicit function calls must start with a simple function", tokens); + } + // optional "on", "with", or "to" + if (!tokens.matchAnyToken("to", "on", "with") && parser.commandBoundary(tokens.currentToken())) { + var target = parser.requireElement("implicitMeTarget", tokens); + } else { + var target = parser.requireElement("expression", tokens); + } + var functionName = expr.root.name; + var functionArgs = expr.argExressions; + + /** @type {GrammarElement} */ + var pseudoCommand = { + type: "pseudoCommand", + expr: expr, + args: [target, functionArgs], + op: function (context, target, args) { + var func = target[functionName]; + if (func.hyperfunc) { + args.push(context); + } + var result = func.apply(target, args); + context.result = result; + return runtime.findNext(pseudoCommand, context); + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + + return pseudoCommand; + }); + + /** + * @param {ParserObject} parser + * @param {RuntimeObject} runtime + * @param {TokensObject} tokens + * @param {*} target + * @param {*} value + * @returns + */ + var makeSetter = function (parser, runtime, tokens, target, value) { + var symbolWrite = target.type === "symbol"; + var attributeWrite = target.type === "attributeRef"; + if (!attributeWrite && !symbolWrite && target.root == null) { + parser.raiseParseError(tokens, "Can only put directly into symbols, not references"); + } + + var root = null; + var prop = null; + if (symbolWrite) { + // root is null + } else if (attributeWrite) { + root = parser.requireElement("implicitMeTarget", tokens); + var attribute = target; + } else { + prop = target.prop ? target.prop.value : null; + var attribute = target.attribute; + root = target.root; + } + + /** @type {GrammarElement} */ + var setCmd = { + target: target, + symbolWrite: symbolWrite, + value: value, + args: [root, value], + op: function (context, root, valueToSet) { + if (symbolWrite) { + runtime.setSymbol(target.name, context, target.symbolType, valueToSet); + } else { + runtime.forEach(root, function (elt) { + if (attribute) { + if (valueToSet == null) { + elt.removeAttribute(attribute.name); + } else { + elt.setAttribute(attribute.name, valueToSet); + } + } else { + elt[prop] = valueToSet; + } + }); + } + return runtime.findNext(this, context); + }, + }; + return setCmd; + }; + + _parser.addCommand("default", function (parser, runtime, tokens) { + if (!tokens.matchToken("default")) return; + var target = parser.requireElement("assignableExpression", tokens); + tokens.requireToken("to"); + + var value = parser.requireElement("expression", tokens); + + /** @type {GrammarElement} */ + var setter = makeSetter(parser, runtime, tokens, target, value); + var defaultCmd = { + target: target, + value: value, + setter: setter, + args: [target], + op: function (context, target) { + if (target) { + return runtime.findNext(this, context); + } else { + return setter; + } + }, + }; + setter.parent = defaultCmd; + return defaultCmd; + }); + + _parser.addCommand("set", function (parser, runtime, tokens) { + if (!tokens.matchToken("set")) return; + if (tokens.currentToken().type === "L_BRACE") { + var obj = parser.requireElement("objectLiteral", tokens); + tokens.requireToken("on"); + var target = parser.requireElement("expression", tokens); + + return { + objectLiteral: obj, + target: target, + args: [obj, target], + op: function (ctx, obj, target) { + mergeObjects(target, obj); + return runtime.findNext(this, ctx); + }, + }; + } + + try { + tokens.pushFollow("to"); + var target = parser.requireElement("assignableExpression", tokens); + } finally { + tokens.popFollow(); + } + tokens.requireToken("to"); + var value = parser.requireElement("expression", tokens); + return makeSetter(parser, runtime, tokens, target, value); + }); + + _parser.addCommand("if", function (parser, runtime, tokens) { + if (!tokens.matchToken("if")) return; + var expr = parser.requireElement("expression", tokens); + tokens.matchToken("then"); // optional 'then' + var trueBranch = parser.parseElement("commandList", tokens); + if (tokens.matchToken("else")) { + var falseBranch = parser.parseElement("commandList", tokens); + } + if (tokens.hasMore()) { + tokens.requireToken("end"); + } + + /** @type {GrammarElement} */ + var ifCmd = { + expr: expr, + trueBranch: trueBranch, + falseBranch: falseBranch, + args: [expr], + op: function (context, exprValue) { + if (exprValue) { + return trueBranch; + } else if (falseBranch) { + return falseBranch; + } else { + return runtime.findNext(this, context); + } + }, + }; + parser.setParent(trueBranch, ifCmd); + parser.setParent(falseBranch, ifCmd); + return ifCmd; + }); + + var parseRepeatExpression = function (parser, tokens, runtime, startedWithForToken) { + var innerStartToken = tokens.currentToken(); + if (tokens.matchToken("for") || startedWithForToken) { + var identifierToken = tokens.requireTokenType("IDENTIFIER"); + var identifier = identifierToken.value; + tokens.requireToken("in"); + var expression = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("in")) { + var identifier = "it"; + var expression = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("while")) { + var whileExpr = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("until")) { + var isUntil = true; + if (tokens.matchToken("event")) { + var evt = _parser.requireElement("dotOrColonPath", tokens, "Expected event name"); + if (tokens.matchToken("from")) { + var on = parser.requireElement("expression", tokens); + } + } else { + var whileExpr = parser.requireElement("expression", tokens); + } + } else if (tokens.matchTokenType("NUMBER")) { + var times = parseFloat(innerStartToken.value); + tokens.requireToken("times"); + } else { + tokens.matchToken("forever"); // consume optional forever + var forever = true; + } + + if (tokens.matchToken("index")) { + var identifierToken = tokens.requireTokenType("IDENTIFIER"); + var indexIdentifier = identifierToken.value; + } + + var loop = parser.parseElement("commandList", tokens); + if (loop && evt) { + // if this is an event based loop, wait a tick at the end of the loop so that + // events have a chance to trigger in the loop condition o_O))) + var last = loop; + while (last.next) { + last = last.next; + } + var waitATick = { + type: "waitATick", + op: function () { + return new Promise(function (resolve) { + setTimeout(function () { + resolve(runtime.findNext(waitATick)); + }, 0); + }); + }, + }; + last.next = waitATick; + } + if (tokens.hasMore()) { + tokens.requireToken("end"); + } + + if (identifier == null) { + identifier = "_implicit_repeat_" + innerStartToken.start; + var slot = identifier; + } else { + var slot = identifier + "_" + innerStartToken.start; + } + + var repeatCmd = { + identifier: identifier, + indexIdentifier: indexIdentifier, + slot: slot, + expression: expression, + forever: forever, + times: times, + until: isUntil, + event: evt, + on: on, + whileExpr: whileExpr, + resolveNext: function () { + return this; + }, + loop: loop, + args: [whileExpr], + op: function (context, whileValue) { + var iterator = context.meta.iterators[slot]; + var keepLooping = false; + if (this.forever) { + keepLooping = true; + } else if (this.until) { + if (evt) { + keepLooping = context.meta.iterators[slot].eventFired === false; + } else { + keepLooping = whileValue !== true; + } + } else if (whileValue) { + keepLooping = true; + } else if (times) { + keepLooping = iterator.index < this.times; + } else { + keepLooping = iterator.value !== null && iterator.index < iterator.value.length; + } + + if (keepLooping) { + if (iterator.value) { + context[identifier] = iterator.value[iterator.index]; + context.result = iterator.value[iterator.index]; + } else { + context.result = iterator.index; + } + if (indexIdentifier) { + context[indexIdentifier] = iterator.index; + } + iterator.index++; + return loop; + } else { + context.meta.iterators[slot] = null; + return runtime.findNext(this.parent, context); + } + }, + }; + parser.setParent(loop, repeatCmd); + var repeatInit = { + name: "repeatInit", + args: [expression, evt, on], + op: function (context, value, event, on) { + context.meta.iterators[slot] = { + index: 0, + value: value, + eventFired: false, + }; + if (evt) { + var target = on || context.me; + target.addEventListener( + event, + function (e) { + context.meta.iterators[slot].eventFired = true; + }, + { once: true } + ); + } + return repeatCmd; // continue to loop + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + parser.setParent(repeatCmd, repeatInit); + return repeatInit; + }; + + _parser.addCommand("repeat", function (parser, runtime, tokens) { + if (tokens.matchToken("repeat")) { + return parseRepeatExpression(parser, tokens, runtime, false); + } + }); + + _parser.addCommand("for", function (parser, runtime, tokens) { + if (tokens.matchToken("for")) { + return parseRepeatExpression(parser, tokens, runtime, true); + } + }); + + _parser.addGrammarElement("stringLike", function (parser, runtime, tokens) { + return _parser.parseAnyOf(["string", "nakedString"], tokens); + }); + + _parser.addCommand("append", function (parser, runtime, tokens) { + if (!tokens.matchToken("append")) return; + var target = null; + var prop = null; + + var value = parser.requireElement("expression", tokens); + + if (tokens.matchToken("to")) { + target = parser.requireElement("expression", tokens); + } + + if (target == null) { + prop = "result"; + } else if (target.type === "symbol") { + prop = target.name; + } else if (target.type === "propertyAccess") { + prop = target.prop.value; + } else { + throw "Unable to append to " + target.type; + } + + return { + value: value, + target: target, + args: [value], + op: function (context, value) { + if (Array.isArray(context[prop])) { + context[prop].push(value); + } else if (context[prop] instanceof Element) { + if (typeof value == "string") { + context[prop].innerHTML += value; + } else { + throw "Don't know how to append non-strings to an HTML Element yet."; + } + } else { + context[prop] += value; + } + + return runtime.findNext(this, context); + }, + execute: function (context) { + return runtime.unifiedExec(this, context, value, target); + }, + }; + }); + + _parser.addCommand("increment", function (parser, runtime, tokens) { + if (!tokens.matchToken("increment")) return; + var amount; + + // This is optional. Defaults to "result" + var target = parser.parseElement("assignableExpression", tokens); + + // This is optional. Defaults to 1. + if (tokens.matchToken("by")) { + amount = parser.requireElement("expression", tokens); + } + + return { + target: target, + args: [target, amount], + op: function (context, targetValue, amount) { + targetValue = targetValue ? parseFloat(targetValue) : 0; + amount = amount ? parseFloat(amount) : 1; + var newValue = targetValue + amount; + var setter = makeSetter(parser, runtime, tokens, target, newValue); + context.result = newValue; + setter.parent = this; + return setter; + }, + execute: function (context) { + return runtime.unifiedExec(this, context, target, amount); + }, + }; + }); + + _parser.addCommand("decrement", function (parser, runtime, tokens) { + if (!tokens.matchToken("decrement")) return; + var amount; + + // This is optional. Defaults to "result" + var target = parser.parseElement("assignableExpression", tokens); + + // This is optional. Defaults to 1. + if (tokens.matchToken("by")) { + amount = parser.requireElement("expression", tokens); + } + + return { + target: target, + args: [target, amount], + op: function (context, targetValue, amount) { + targetValue = targetValue ? parseFloat(targetValue) : 0; + amount = amount ? parseFloat(amount) : 1; + var newValue = targetValue - amount; + var setter = makeSetter(parser, runtime, tokens, target, newValue); + context.result = newValue; + setter.parent = this; + return setter; + }, + execute: function (context) { + return runtime.unifiedExec(this, context, target, amount); + }, + }; + }); + + _parser.addCommand("fetch", function (parser, runtime, tokens) { + if (!tokens.matchToken("fetch")) return; + var url = parser.requireElement("stringLike", tokens); + var args = parser.parseElement("objectLiteral", tokens); + + var type = "text"; + var conversion; + if (tokens.matchToken("as")) { + if (tokens.matchToken("json")) { + type = "json"; + } else if (tokens.matchToken("response")) { + type = "response"; + } else if (tokens.matchToken("html")) { + type = "html"; + } else if (tokens.matchToken("text")) { + // default, ignore + } else { + conversion = parser.requireElement("dotOrColonPath", tokens).evaluate(); + } + } + + /** @type {GrammarElement} */ + var fetchCmd = { + url: url, + argExpressions: args, + args: [url, args], + op: function (context, url, args) { + return fetch(url, args) + .then(function (resp) { + if (type === "response") { + context.result = resp; + return runtime.findNext(fetchCmd, context); + } + if (type === "json") { + return resp.json().then(function (result) { + context.result = result; + return runtime.findNext(fetchCmd, context); + }); + } + return resp.text().then(function (result) { + if (conversion) result = runtime.convertValue(result, conversion); + + if (type === "html") result = runtime.convertValue(result, "Fragment"); + + context.result = result; + return runtime.findNext(fetchCmd, context); + }); + }) + .catch(function (reason) { + runtime.triggerEvent(context.me, "fetch:error", { + reason: reason, + }); + throw reason; + }); + }, + }; + return fetchCmd; + }); + } + + //==================================================================== + // Initialization + //==================================================================== + function ready(fn) { + if (document.readyState !== "loading") { + setTimeout(fn); + } else { + document.addEventListener("DOMContentLoaded", fn); + } + } + + function getMetaConfig() { + var element = document.querySelector('meta[name="htmx-config"]'); + if (element) { + return parseJSON(element.content); + } else { + return null; + } + } + + function mergeMetaConfig() { + var metaConfig = getMetaConfig(); + if (metaConfig) { + _hyperscript.config = mergeObjects(_hyperscript.config, metaConfig); + } + } + + if ("document" in globalScope) { + Promise.all( + Array.from(document.querySelectorAll("script[type='text/hyperscript'][src]")).map(function (script) { + return fetch(script.src) + .then(function (res) { + return res.text(); + }) + .then(function (code) { + return _runtime.evaluate(code); + }); + }) + ).then(function () { + ready(function () { + mergeMetaConfig(); + _runtime.processNode(document.documentElement); + document.addEventListener("htmx:load", function (evt) { + _runtime.processNode(evt.detail.elt); + }); + }); + }); + } + + //==================================================================== + // API + //==================================================================== + return mergeObjects( + function (str, ctx) { + return _runtime.evaluate(str, ctx); //OK + }, + { + internals: { + lexer: _lexer, + parser: _parser, + runtime: _runtime, + }, + addFeature: function (keyword, definition) { + _parser.addFeature(keyword, definition); + }, + addCommand: function (keyword, definition) { + _parser.addCommand(keyword, definition); + }, + addLeafExpression: function (name, definition) { + _parser.addLeafExpression(name, definition); + }, + addIndirectExpression: function (name, definition) { + _parser.addIndirectExpression(name, definition); + }, + evaluate: function (str, ctx) { + //OK + return _runtime.evaluate(str, ctx); //OK + }, + parse: function (str) { + //OK + return _runtime.parse(str); //OK + }, + processNode: function (elt) { + _runtime.processNode(elt); + }, + config: { + attributes: "_, script, data-script", + defaultTransition: "all 500ms ease-in", + disableSelector: "[disable-scripting], [data-disable-scripting]", + conversions: CONVERSIONS, + }, + } + ); +}); + +///========================================================================= +/// This module provides the core web functionality for hyperscript +///========================================================================= +(function () { + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + _hyperscript.addCommand("settle", function (parser, runtime, tokens) { + if (tokens.matchToken("settle")) { + if (!parser.commandBoundary(tokens.currentToken())) { + var on = parser.requireElement("expression", tokens); + } else { + var on = parser.requireElement("implicitMeTarget", tokens); + } + + var settleCommand = { + type: "settleCmd", + args: [on], + op: function (context, on) { + var resolve = null; + var resolved = false; + var transitionStarted = false; + + var promise = new Promise(function (r) { + resolve = r; + }); + + // listen for a transition begin + on.addEventListener( + "transitionstart", + function () { + transitionStarted = true; + }, + { once: true } + ); + + // if no transition begins in 500ms, cancel + setTimeout(function () { + if (!transitionStarted && !resolved) { + resolve(runtime.findNext(settleCommand, context)); + } + }, 500); + + // continue on a transition emd + on.addEventListener( + "transitionend", + function () { + if (!resolved) { + resolve(runtime.findNext(settleCommand, context)); + } + }, + { once: true } + ); + return promise; + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + return settleCommand; + } + }); + + _hyperscript.addCommand("add", function (parser, runtime, tokens) { + if (tokens.matchToken("add")) { + var classRef = parser.parseElement("classRef", tokens); + var attributeRef = null; + var cssDeclaration = null; + if (classRef == null) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + cssDeclaration = parser.parseElement("objectLiteral", tokens); + if (cssDeclaration == null) { + parser.raiseParseError(tokens, "Expected either a class reference or attribute expression"); + } + } + } else { + var classRefs = [classRef]; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + } + + if (tokens.matchToken("to")) { + var to = parser.requireElement("expression", tokens); + } else { + var to = parser.parseElement("implicitMeTarget", tokens); + } + + if (classRefs) { + var addCmd = { + classRefs: classRefs, + to: to, + args: [to], + op: function (context, to) { + runtime.forEach(classRefs, function (classRef) { + runtime.forEach(to, function (target) { + if (target instanceof Element) target.classList.add(classRef.className()); + }); + }); + return runtime.findNext(this, context); + }, + }; + } else if (attributeRef) { + var addCmd = { + type: "addCmd", + attributeRef: attributeRef, + to: to, + args: [to], + op: function (context, to, attrRef) { + runtime.forEach(to, function (target) { + target.setAttribute(attributeRef.name, attributeRef.value); + }); + return runtime.findNext(addCmd, context); + }, + execute: function (ctx) { + return runtime.unifiedExec(this, ctx); + }, + }; + } else { + var addCmd = { + type: "addCmd", + cssDeclaration: cssDeclaration, + to: to, + args: [to, cssDeclaration], + op: function (context, to, css) { + runtime.forEach(to, function (target) { + for (var key in css) { + if (css.hasOwnProperty(key)) { + target.style.setProperty(key, css[key]); + } + } + }); + return runtime.findNext(addCmd, context); + }, + execute: function (ctx) { + return runtime.unifiedExec(this, ctx); + }, + }; + } + return addCmd; + } + }); + + _hyperscript.addCommand("remove", function (parser, runtime, tokens) { + if (tokens.matchToken("remove")) { + var classRef = parser.parseElement("classRef", tokens); + var attributeRef = null; + var elementExpr = null; + if (classRef == null) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + elementExpr = parser.parseElement("expression", tokens); + if (elementExpr == null) { + parser.raiseParseError( + tokens, + "Expected either a class reference, attribute expression or value expression" + ); + } + } + } else { + var classRefs = [classRef]; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + } + + if (tokens.matchToken("from")) { + var from = parser.requireElement("expression", tokens); + } else { + var from = parser.requireElement("implicitMeTarget", tokens); + } + + if (elementExpr) { + var removeCmd = { + elementExpr: elementExpr, + from: from, + args: [elementExpr], + op: function (context, element) { + runtime.forEach(element, function (target) { + if (target.parentElement) { + target.parentElement.removeChild(target); + } + }); + return runtime.findNext(this, context); + }, + }; + } else { + var removeCmd = { + classRefs: classRefs, + attributeRef: attributeRef, + elementExpr: elementExpr, + from: from, + args: [from], + op: function (context, from) { + if (this.classRefs) { + runtime.forEach(classRefs, function (classRef) { + runtime.forEach(from, function (target) { + target.classList.remove(classRef.className()); + }); + }); + } else { + runtime.forEach(from, function (target) { + target.removeAttribute(attributeRef.name); + }); + } + return runtime.findNext(this, context); + }, + }; + } + return removeCmd; + } + }); + + _hyperscript.addCommand("toggle", function (parser, runtime, tokens) { + if (tokens.matchToken("toggle")) { + if (tokens.matchToken("between")) { + var between = true; + var classRef = parser.parseElement("classRef", tokens); + tokens.requireToken("and"); + var classRef2 = parser.requireElement("classRef", tokens); + } else { + var classRef = parser.parseElement("classRef", tokens); + var attributeRef = null; + if (classRef == null) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + parser.raiseParseError(tokens, "Expected either a class reference or attribute expression"); + } + } else { + var classRefs = [classRef]; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + } + } + + if (tokens.matchToken("on")) { + var on = parser.requireElement("expression", tokens); + } else { + var on = parser.requireElement("implicitMeTarget", tokens); + } + + if (tokens.matchToken("for")) { + var time = parser.requireElement("timeExpression", tokens); + } else if (tokens.matchToken("until")) { + var evt = parser.requireElement("dotOrColonPath", tokens, "Expected event name"); + if (tokens.matchToken("from")) { + var from = parser.requireElement("expression", tokens); + } + } + + var toggleCmd = { + classRef: classRef, + classRef2: classRef2, + classRefs: classRefs, + attributeRef: attributeRef, + on: on, + time: time, + evt: evt, + from: from, + toggle: function (on) { + if (between) { + runtime.forEach(on, function (target) { + if (target.classList.contains(classRef.className())) { + target.classList.remove(classRef.className()); + target.classList.add(classRef2.className()); + } else { + target.classList.add(classRef.className()); + target.classList.remove(classRef2.className()); + } + }); + } else if (this.classRefs) { + runtime.forEach(this.classRefs, function (classRef) { + runtime.forEach(on, function (target) { + target.classList.toggle(classRef.className()); + }); + }); + } else { + runtime.forEach(on, function (target) { + if (target.hasAttribute(attributeRef.name)) { + target.removeAttribute(attributeRef.name); + } else { + target.setAttribute(attributeRef.name, attributeRef.value); + } + }); + } + }, + args: [on, time, evt, from], + op: function (context, on, time, evt, from) { + if (time) { + return new Promise(function (resolve) { + toggleCmd.toggle(on); + setTimeout(function () { + toggleCmd.toggle(on); + resolve(runtime.findNext(toggleCmd, context)); + }, time); + }); + } else if (evt) { + return new Promise(function (resolve) { + var target = from || context.me; + target.addEventListener( + evt, + function () { + toggleCmd.toggle(on); + resolve(runtime.findNext(toggleCmd, context)); + }, + { once: true } + ); + toggleCmd.toggle(on); + }); + } else { + this.toggle(on); + return runtime.findNext(toggleCmd, context); + } + }, + }; + return toggleCmd; + } + }); + + var HIDE_SHOW_STRATEGIES = { + display: function (op, element, arg) { + if (arg) { + element.style.display = arg; + } else if (op === "hide") { + element.style.display = "none"; + } else { + element.style.display = "block"; + } + }, + visibility: function (op, element, arg) { + if (arg) { + element.style.visibility = arg; + } else if (op === "hide") { + element.style.visibility = "hidden"; + } else { + element.style.visibility = "visible"; + } + }, + opacity: function (op, element, arg) { + if (arg) { + element.style.opacity = arg; + } else if (op === "hide") { + element.style.opacity = "0"; + } else { + element.style.opacity = "1"; + } + }, + }; + + var parseShowHideTarget = function (parser, runtime, tokens) { + var target; + var currentTokenValue = tokens.currentToken(); + if (currentTokenValue.value === "with" || parser.commandBoundary(currentTokenValue)) { + target = parser.parseElement("implicitMeTarget", tokens); + } else { + target = parser.parseElement("expression", tokens); + } + return target; + }; + + var resolveStrategy = function (parser, tokens, name) { + var configDefault = _hyperscript.config.defaultHideShowStrategy; + var strategies = HIDE_SHOW_STRATEGIES; + if (_hyperscript.config.hideShowStrategies) { + strategies = mergeObjects(strategies, _hyperscript.config.hideShowStrategies); // merge in user provided strategies + } + name = name || configDefault || "display"; + var value = strategies[name]; + if (value == null) { + parser.raiseParseError(tokens, "Unknown show/hide strategy : " + name); + } + return value; + }; + + _hyperscript.addCommand("hide", function (parser, runtime, tokens) { + if (tokens.matchToken("hide")) { + var target = parseShowHideTarget(parser, runtime, tokens); + + var name = null; + if (tokens.matchToken("with")) { + name = tokens.requireTokenType("IDENTIFIER").value; + } + var hideShowStrategy = resolveStrategy(parser, tokens, name); + + return { + target: target, + args: [target], + op: function (ctx, target) { + runtime.forEach(target, function (elt) { + hideShowStrategy("hide", elt); + }); + return runtime.findNext(this, ctx); + }, + }; + } + }); + + _hyperscript.addCommand("show", function (parser, runtime, tokens) { + if (tokens.matchToken("show")) { + var target = parseShowHideTarget(parser, runtime, tokens); + + var name = null; + if (tokens.matchToken("with")) { + name = tokens.requireTokenType("IDENTIFIER").value; + } + var arg = null; + if (tokens.matchOpToken(":")) { + var tokenArr = tokens.consumeUntilWhitespace(); + tokens.matchTokenType("WHITESPACE"); + arg = tokenArr + .map(function (t) { + return t.value; + }) + .join(""); + } + var hideShowStrategy = resolveStrategy(parser, tokens, name); + + return { + target: target, + args: [target], + op: function (ctx, target) { + runtime.forEach(target, function (elt) { + hideShowStrategy("show", elt, arg); + }); + return runtime.findNext(this, ctx); + }, + }; + } + }); + + _hyperscript.addCommand("trigger", function (parser, runtime, tokens) { + if (tokens.matchToken("trigger")) { + var eventName = parser.requireElement("eventName", tokens); + var details = parser.parseElement("namedArgumentList", tokens); + + var triggerCmd = { + eventName: eventName, + details: details, + args: [eventName, details], + op: function (context, eventNameStr, details) { + runtime.triggerEvent(context.me, eventNameStr, details ? details : {}); + return runtime.findNext(triggerCmd, context); + }, + }; + return triggerCmd; + } + }); + + _hyperscript.addCommand("take", function (parser, runtime, tokens) { + if (tokens.matchToken("take")) { + var classRef = parser.parseElement("classRef", tokens); + + if (tokens.matchToken("from")) { + var from = parser.requireElement("expression", tokens); + } else { + var from = classRef; + } + + if (tokens.matchToken("for")) { + var forElt = parser.requireElement("expression", tokens); + } else { + var forElt = parser.requireElement("implicitMeTarget", tokens); + } + + var takeCmd = { + classRef: classRef, + from: from, + forElt: forElt, + args: [from, forElt], + op: function (context, from, forElt) { + var clazz = this.classRef.css.substr(1); + runtime.forEach(from, function (target) { + target.classList.remove(clazz); + }); + runtime.forEach(forElt, function (target) { + target.classList.add(clazz); + }); + return runtime.findNext(this, context); + }, + }; + return takeCmd; + } + }); + + function putInto(context, prop, valueToPut) { + if (prop) { + var value = context[prop]; + } else { + var value = context; + } + if (value instanceof Element || value instanceof HTMLDocument) { + while (value.firstChild) value.removeChild(value.firstChild); + value.append(_hyperscript.internals.runtime.convertValue(valueToPut, "Fragment")); + } else { + if (prop) { + context[prop] = valueToPut; + } else { + throw "Don't know how to put a value into " + typeof context; + } + } + } + + _hyperscript.addCommand("put", function (parser, runtime, tokens) { + if (tokens.matchToken("put")) { + var value = parser.requireElement("expression", tokens); + + var operationToken = tokens.matchAnyToken("into", "before", "after"); + + if (operationToken == null && tokens.matchToken("at")) { + operationToken = tokens.matchAnyToken("start", "end"); + tokens.requireToken("of"); + } + + if (operationToken == null) { + parser.raiseParseError(tokens, "Expected one of 'into', 'before', 'at start of', 'at end of', 'after'"); + } + var target = parser.requireElement("expression", tokens); + + var operation = operationToken.value; + + var symbolWrite = false; + var root = null; + var prop = null; + if (target.type === "propertyAccess" && operation === "into") { + prop = target.prop.value; + root = target.root; + } else if (target.type === "symbol" && operation === "into") { + symbolWrite = true; + prop = target.name; + } else if (target.type === "attributeRef" && operation === "into") { + var attributeWrite = true; + prop = target.name; + root = parser.requireElement("implicitMeTarget", tokens); + } else if (target.type === "attributeRefAccess" && operation === "into") { + var attributeWrite = true; + prop = target.attribute.name; + root = target.root; + } else { + root = target; + } + + var putCmd = { + target: target, + operation: operation, + symbolWrite: symbolWrite, + value: value, + args: [root, value], + op: function (context, root, valueToPut) { + if (symbolWrite) { + putInto(context, prop, valueToPut); + } else { + if (operation === "into") { + if (attributeWrite) { + runtime.forEach(root, function (elt) { + elt.setAttribute(prop, valueToPut); + }); + } else { + runtime.forEach(root, function (elt) { + putInto(elt, prop, valueToPut); + }); + } + } else { + var op = + operation === "before" + ? Element.prototype.before + : operation === "after" + ? Element.prototype.after + : operation === "start" + ? Element.prototype.prepend + : operation === "end" + ? Element.prototype.append + : "unreachable"; + + runtime.forEach(root, function (elt) { + op.call( + elt, + valueToPut instanceof Node + ? valueToPut + : runtime.convertValue(valueToPut, "Fragment") + ); + }); + } + } + return runtime.findNext(this, context); + }, + }; + return putCmd; + } + }); + + function parsePseudopossessiveTarget(parser, runtime, tokens) { + if ( + tokens.matchToken("the") || + tokens.matchToken("element") || + tokens.matchToken("elements") || + tokens.currentToken().type === "CLASS_REF" || + tokens.currentToken().type === "ID_REF" || + (tokens.currentToken().op && tokens.currentToken().value === "<") + ) { + parser.possessivesDisabled = true; + try { + var targets = parser.parseElement("expression", tokens); + } finally { + delete parser.possessivesDisabled; + } + // optional possessive + if (tokens.matchOpToken("'")) { + tokens.requireToken("s"); + } + } else if (tokens.currentToken().type === "IDENTIFIER" && tokens.currentToken().value === "its") { + var identifier = tokens.matchToken("its"); + var targets = { + type: "pseudopossessiveIts", + token: identifier, + name: identifier.value, + evaluate: function (context) { + return runtime.resolveSymbol("it", context); + }, + }; + } else { + tokens.matchToken("my") || tokens.matchToken("me"); // consume optional 'my' + var targets = parser.parseElement("implicitMeTarget", tokens); + } + return targets; + } + + _hyperscript.addCommand("transition", function (parser, runtime, tokens) { + if (tokens.matchToken("transition")) { + var targets = parsePseudopossessiveTarget(parser, runtime, tokens); + + var properties = []; + var from = []; + var to = []; + var currentToken = tokens.currentToken(); + while ( + !parser.commandBoundary(currentToken) && + currentToken.value !== "over" && + currentToken.value !== "using" + ) { + properties.push(parser.requireElement("stringLike", tokens)); + + if (tokens.matchToken("from")) { + from.push(parser.requireElement("stringLike", tokens)); + } else { + from.push(null); + } + tokens.requireToken("to"); + to.push(parser.requireElement("stringLike", tokens)); + currentToken = tokens.currentToken(); + } + if (tokens.matchToken("over")) { + var over = parser.requireElement("timeExpression", tokens); + } else if (tokens.matchToken("using")) { + var using = parser.requireElement("expression", tokens); + } + + var transition = { + to: to, + args: [targets, properties, from, to, using, over], + op: function (context, targets, properties, from, to, using, over) { + var promises = []; + runtime.forEach(targets, function (target) { + var promise = new Promise(function (resolve, reject) { + var initialTransition = target.style.transition; + if (over) { + target.style.transition = "all " + over + "ms ease-in"; + } else if (using) { + target.style.transition = using; + } else { + target.style.transition = _hyperscript.config.defaultTransition; + } + var internalData = runtime.getInternalData(target); + var computedStyles = getComputedStyle(target); + + var initialStyles = {}; + for (var i = 0; i < computedStyles.length; i++) { + var name = computedStyles[i]; + var initialValue = computedStyles[name]; + initialStyles[name] = initialValue; + } + + // store intitial values + if (!internalData.initalStyles) { + internalData.initalStyles = initialStyles; + } + + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + var fromVal = from[i]; + if (fromVal == "computed" || fromVal == null) { + target.style[property] = initialStyles[property]; + } else { + target.style[property] = fromVal; + } + } + // console.log("transition started", transition); + setTimeout(function () { + var autoProps = []; + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + var toVal = to[i]; + if (toVal == "initial") { + var propertyValue = internalData.initalStyles[property]; + target.style[property] = propertyValue; + } else { + target.style[property] = toVal; + } + // console.log("set", property, "to", target.style[property], "on", target, "value passed in : ", toVal); + } + target.addEventListener( + "transitionend", + function () { + // console.log("transition ended", transition); + target.style.transition = initialTransition; + resolve(); + }, + { once: true } + ); + }, 5); + }); + promises.push(promise); + }); + return Promise.all(promises).then(function () { + return runtime.findNext(transition, context); + }); + }, + }; + return transition; + } + }); + + _hyperscript.addCommand("measure", function (parser, runtime, tokens) { + if (!tokens.matchToken("measure")) return; + + var target = parsePseudopossessiveTarget(parser, runtime, tokens); + + var propsToMeasure = []; + if (!parser.commandBoundary(tokens.currentToken())) + do { + propsToMeasure.push(tokens.matchTokenType("IDENTIFIER").value); + } while (tokens.matchOpToken(",")); + + return { + properties: propsToMeasure, + args: [target], + op: function (ctx, target) { + if (0 in target) target = target[0]; // not measuring multiple elts + var rect = target.getBoundingClientRect(); + var scroll = { + top: target.scrollTop, + left: target.scrollLeft, + topMax: target.scrollTopMax, + leftMax: target.scrollLeftMax, + height: target.scrollHeight, + width: target.scrollWidth, + }; + + ctx.result = { + x: rect.x, + y: rect.y, + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height, + bounds: rect, + + scrollLeft: scroll.left, + scrollTop: scroll.top, + scrollLeftMax: scroll.leftMax, + scrollTopMax: scroll.topMax, + scrollWidth: scroll.width, + scrollHeight: scroll.height, + scroll: scroll, + }; + + runtime.forEach(propsToMeasure, function (prop) { + if (prop in ctx.result) ctx[prop] = ctx.result[prop]; + else throw "No such measurement as " + prop; + }); + + return runtime.findNext(this, ctx); + }, + }; + }); + + _hyperscript.addLeafExpression("closestExpr", function (parser, runtime, tokens) { + if (tokens.matchToken("closest")) { + if (tokens.matchToken("parent")) { + var parentSearch = true; + } + + var css = null; + if (tokens.currentToken().type === "ATTRIBUTE_REF") { + var attributeRef = parser.parseElement("attributeRefAccess", tokens, null); + css = "[" + attributeRef.attribute.name + "]"; + } + + if (css == null) { + var expr = parser.parseElement("expression", tokens); + if (expr.css == null) { + parser.raiseParseError(tokens, "Expected a CSS expression"); + } else { + css = expr.css; + } + } + + if (tokens.matchToken("to")) { + var to = parser.parseElement("expression", tokens); + } else { + var to = parser.parseElement("implicitMeTarget", tokens); + } + + var closestExpr = { + type: "closestExpr", + parentSearch: parentSearch, + expr: expr, + css: css, + to: to, + args: [to], + op: function (ctx, to) { + if (to == null || !(to instanceof Element)) { + return null; + } else { + if (parentSearch) { + var node = to.parentElement ? to.parentElement.closest(css) : null; + } else { + var node = to.closest(css); + } + return node; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + + if (attributeRef) { + attributeRef.root = closestExpr; + attributeRef.args = [closestExpr]; + return attributeRef; + } else { + return closestExpr; + } + } + }); + + _hyperscript.addCommand("go", function (parser, runtime, tokens) { + if (tokens.matchToken("go")) { + if (tokens.matchToken("back")) { + var back = true; + } else { + tokens.matchToken("to"); + if (tokens.matchToken("url")) { + var target = parser.requireElement("stringLike", tokens); + var url = true; + if (tokens.matchToken("in")) { + tokens.requireToken("new"); + tokens.requireToken("window"); + var newWindow = true; + } + } else { + tokens.matchToken("the"); // optional the + var verticalPosition = tokens.matchAnyToken("top", "bottom", "middle"); + var horizontalPosition = tokens.matchAnyToken("left", "center", "right"); + if (verticalPosition || horizontalPosition) { + tokens.requireToken("of"); + } + var target = parser.requireElement("expression", tokens); + var smoothness = tokens.matchAnyToken("smoothly", "instantly"); + + var scrollOptions = {}; + if (verticalPosition) { + if (verticalPosition.value === "top") { + scrollOptions.block = "start"; + } else if (verticalPosition.value === "bottom") { + scrollOptions.block = "end"; + } else if (verticalPosition.value === "middle") { + scrollOptions.block = "center"; + } + } + + if (horizontalPosition) { + if (horizontalPosition.value === "left") { + scrollOptions.inline = "start"; + } else if (horizontalPosition.value === "center") { + scrollOptions.inline = "center"; + } else if (horizontalPosition.value === "right") { + scrollOptions.inline = "end"; + } + } + + if (smoothness) { + if (smoothness.value === "smoothly") { + scrollOptions.behavior = "smooth"; + } else if (smoothness.value === "instantly") { + scrollOptions.behavior = "instant"; + } + } + } + } + + var goCmd = { + target: target, + args: [target], + op: function (ctx, to) { + if (back) { + window.history.back(); + } else if (url) { + if (to) { + if (to.indexOf("#") === 0 && !newWindow) { + window.location.href = to; + } else { + window.open(to, newWindow ? "_blank" : null); + } + } + } else { + runtime.forEach(to, function (target) { + target.scrollIntoView(scrollOptions); + }); + } + return runtime.findNext(goCmd); + }, + }; + return goCmd; + } + }); + + _hyperscript.config.conversions["Values"] = function (/** @type {Node | NodeList} */ node) { + /** @type Object */ + var result = {}; + + var forEach = _hyperscript.internals.runtime.forEach; + + forEach(node, function (/** @type HTMLInputElement */ node) { + // Try to get a value directly from this node + var input = getInputInfo(node); + + if (input !== undefined) { + result[input.name] = input.value; + return; + } + + // Otherwise, try to query all child elements of this node that *should* contain values. + if (node.querySelectorAll != undefined) { + var children = node.querySelectorAll("input,select,textarea"); + forEach(children, appendValue); + } + }); + + return result; + + /** + * @param {HTMLInputElement} node + */ + function appendValue(node) { + var info = getInputInfo(node); + + if (info == undefined) { + return; + } + + // If there is no value already stored in this space. + if (result[info.name] == undefined) { + result[info.name] = info.value; + return; + } + + if (Array.isArray(result[info.name]) && Array.isArray(info.value)) { + result[info.name] = [].concat(result[info.name], info.value); + return; + } + } + + /** + * @param {HTMLInputElement} node + * @returns {{name:string, value:string | string[]} | undefined} + */ + function getInputInfo(node) { + try { + /** @type {{name: string, value: string | string[]}}*/ + var result = { + name: node.name, + value: node.value, + }; + + if (result.name == undefined || result.value == undefined) { + return undefined; + } + + if (node.type == "radio" && node.checked == false) { + return undefined; + } + + if (node.type == "checkbox") { + if (node.checked == false) { + result.value = undefined; + } else if (typeof result.value === "string") { + result.value = [result.value]; + } + } + + if (node.type == "select-multiple") { + /** @type {NodeListOf} */ + var selected = node.querySelectorAll("option[selected]"); + + result.value = []; + for (var index = 0; index < selected.length; index++) { + result.value.push(selected[index].value); + } + } + return result; + } catch (e) { + return undefined; + } + } + }; + + _hyperscript.config.conversions["HTML"] = function (value) { + var toHTML = /** @returns {string}*/ function (/** @type any*/ value) { + if (value instanceof Array) { + return value + .map(function (item) { + return toHTML(item); + }) + .join(""); + } + + if (value instanceof HTMLElement) { + return value.outerHTML; + } + + if (value instanceof NodeList) { + var result = ""; + for (var i = 0; i < value.length; i++) { + var node = value[i]; + if (node instanceof HTMLElement) { + result += node.outerHTML; + } + } + return result; + } + + if (value.toString) { + return value.toString(); + } + + return ""; + }; + + return toHTML(value); + }; + + _hyperscript.config.conversions["Fragment"] = function (val) { + var frag = document.createDocumentFragment(); + _hyperscript.internals.runtime.forEach(val, function (val) { + if (val instanceof Node) frag.append(val); + else { + var temp = document.createElement("template"); + temp.innerHTML = val; + frag.append(temp.content); + } + }); + return frag; + }; +})(); diff --git a/www/static/test/1.9.2/test/lib/handlebars-v4.7.6.js b/www/static/test/1.9.2/test/lib/handlebars-v4.7.6.js new file mode 100644 index 000000000..05d9f6141 --- /dev/null +++ b/www/static/test/1.9.2/test/lib/handlebars-v4.7.6.js @@ -0,0 +1,5210 @@ +/**! + + @license + handlebars v4.7.6 + +Copyright (C) 2011-2019 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Handlebars"] = factory(); + else + root["Handlebars"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _handlebarsRuntime = __webpack_require__(2); + + var _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime); + + // Compiler imports + + var _handlebarsCompilerAst = __webpack_require__(45); + + var _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst); + + var _handlebarsCompilerBase = __webpack_require__(46); + + var _handlebarsCompilerCompiler = __webpack_require__(51); + + var _handlebarsCompilerJavascriptCompiler = __webpack_require__(52); + + var _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler); + + var _handlebarsCompilerVisitor = __webpack_require__(49); + + var _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor); + + var _handlebarsNoConflict = __webpack_require__(44); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + var _create = _handlebarsRuntime2['default'].create; + function create() { + var hb = _create(); + + hb.compile = function (input, options) { + return _handlebarsCompilerCompiler.compile(input, options, hb); + }; + hb.precompile = function (input, options) { + return _handlebarsCompilerCompiler.precompile(input, options, hb); + }; + + hb.AST = _handlebarsCompilerAst2['default']; + hb.Compiler = _handlebarsCompilerCompiler.Compiler; + hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default']; + hb.Parser = _handlebarsCompilerBase.parser; + hb.parse = _handlebarsCompilerBase.parse; + hb.parseWithoutProcessing = _handlebarsCompilerBase.parseWithoutProcessing; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst.Visitor = _handlebarsCompilerVisitor2['default']; + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; + }; + + exports.__esModule = true; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _handlebarsBase = __webpack_require__(4); + + var base = _interopRequireWildcard(_handlebarsBase); + + // Each of these augment the Handlebars object. No need to setup here. + // (This is done to easily share code between commonjs and browse envs) + + var _handlebarsSafeString = __webpack_require__(37); + + var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); + + var _handlebarsException = __webpack_require__(6); + + var _handlebarsException2 = _interopRequireDefault(_handlebarsException); + + var _handlebarsUtils = __webpack_require__(5); + + var Utils = _interopRequireWildcard(_handlebarsUtils); + + var _handlebarsRuntime = __webpack_require__(38); + + var runtime = _interopRequireWildcard(_handlebarsRuntime); + + var _handlebarsNoConflict = __webpack_require__(44); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + // For compatibility and usage outside of module systems, make the Handlebars object a namespace + function create() { + var hb = new base.HandlebarsEnvironment(); + + Utils.extend(hb, base); + hb.SafeString = _handlebarsSafeString2['default']; + hb.Exception = _handlebarsException2['default']; + hb.Utils = Utils; + hb.escapeExpression = Utils.escapeExpression; + + hb.VM = runtime; + hb.template = function (spec) { + return runtime.template(spec, hb); + }; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; + } + } + + newObj["default"] = obj; + return newObj; + } + }; + + exports.__esModule = true; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.HandlebarsEnvironment = HandlebarsEnvironment; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _helpers = __webpack_require__(10); + + var _decorators = __webpack_require__(30); + + var _logger = __webpack_require__(32); + + var _logger2 = _interopRequireDefault(_logger); + + var _internalProtoAccess = __webpack_require__(33); + + var VERSION = '4.7.6'; + exports.VERSION = VERSION; + var COMPILER_REVISION = 8; + exports.COMPILER_REVISION = COMPILER_REVISION; + var LAST_COMPATIBLE_COMPILER_REVISION = 7; + + exports.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION; + var REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '== 1.x.x', + 5: '== 2.0.0-alpha.x', + 6: '>= 2.0.0-beta.1', + 7: '>= 4.0.0 <4.3.0', + 8: '>= 4.3.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + }, + /** + * Reset the memory of illegal property accesses that have already been logged. + * @deprecated should only be used in handlebars test-cases + */ + resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() { + _internalProtoAccess.resetLoggedProperties(); + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$defineProperty = __webpack_require__(7)['default']; + + exports.__esModule = true; + var errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + endLineNumber = undefined, + column = undefined, + endColumn = undefined; + + if (loc) { + line = loc.start.line; + endLineNumber = loc.end.line; + column = loc.start.column; + endColumn = loc.end.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + try { + if (loc) { + this.lineNumber = line; + this.endLineNumber = endLineNumber; + + // Work around issue under safari where we can't directly set the column value + /* istanbul ignore next */ + if (_Object$defineProperty) { + Object.defineProperty(this, 'column', { + value: column, + enumerable: true + }); + Object.defineProperty(this, 'endColumn', { + value: endColumn, + enumerable: true + }); + } else { + this.column = column; + this.endColumn = endColumn; + } + } + } catch (nop) { + /* Ignore if the browser is very particular */ + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(8), __esModule: true }; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(9); + module.exports = function defineProperty(it, key, desc){ + return $.setDesc(it, key, desc); + }; + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + var $Object = Object; + module.exports = { + create: $Object.create, + getProto: $Object.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: $Object.getOwnPropertyDescriptor, + setDesc: $Object.defineProperty, + setDescs: $Object.defineProperties, + getKeys: $Object.keys, + getNames: $Object.getOwnPropertyNames, + getSymbols: $Object.getOwnPropertySymbols, + each: [].forEach + }; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + exports.moveHelperToHooks = moveHelperToHooks; + + var _helpersBlockHelperMissing = __webpack_require__(11); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(12); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(25); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(26); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(27); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(28); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(29); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + + function moveHelperToHooks(instance, helperName, keepHelper) { + if (instance.helpers[helperName]) { + instance.hooks[helperName] = instance.helpers[helperName]; + if (!keepHelper) { + delete instance.helpers[helperName]; + } + } + } + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(global) {'use strict'; + + var _Object$keys = __webpack_require__(13)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else if (global.Symbol && context[global.Symbol.iterator]) { + var newContext = []; + var iterator = context[global.Symbol.iterator](); + for (var it = iterator.next(); !it.done; it = iterator.next()) { + newContext.push(it.value); + } + context = newContext; + for (var j = context.length; i < j; i++) { + execIteration(i, i, i === context.length - 1); + } + } else { + (function () { + var priorKey = undefined; + + _Object$keys(context).forEach(function (key) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + }); + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + })(); + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(14), __esModule: true }; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(15); + module.exports = __webpack_require__(21).Object.keys; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + + // 19.1.2.14 Object.keys(O) + var toObject = __webpack_require__(16); + + __webpack_require__(18)('keys', function($keys){ + return function keys(it){ + return $keys(toObject(it)); + }; + }); + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + + // 7.1.13 ToObject(argument) + var defined = __webpack_require__(17); + module.exports = function(it){ + return Object(defined(it)); + }; + +/***/ }), +/* 17 */ +/***/ (function(module, exports) { + + // 7.2.1 RequireObjectCoercible(argument) + module.exports = function(it){ + if(it == undefined)throw TypeError("Can't call method on " + it); + return it; + }; + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + + // most Object methods by ES6 should accept primitives + var $export = __webpack_require__(19) + , core = __webpack_require__(21) + , fails = __webpack_require__(24); + module.exports = function(KEY, exec){ + var fn = (core.Object || {})[KEY] || Object[KEY] + , exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); + }; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + + var global = __webpack_require__(20) + , core = __webpack_require__(21) + , ctx = __webpack_require__(22) + , PROTOTYPE = 'prototype'; + + var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , IS_WRAP = type & $export.W + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] + , key, own, out; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && key in target; + if(own && key in exports)continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function(C){ + var F = function(param){ + return this instanceof C ? new C(param) : C(param); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; + } + }; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + module.exports = $export; + +/***/ }), +/* 20 */ +/***/ (function(module, exports) { + + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); + if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef + +/***/ }), +/* 21 */ +/***/ (function(module, exports) { + + var core = module.exports = {version: '1.2.6'}; + if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + + // optional / simple context binding + var aFunction = __webpack_require__(23); + module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; + } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; + }; + +/***/ }), +/* 23 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; + }; + +/***/ }), +/* 24 */ +/***/ (function(module, exports) { + + module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; + } + }; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (arguments.length != 2) { + throw new _exception2['default']('#if requires exactly one argument'); + } + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + if (arguments.length != 2) { + throw new _exception2['default']('#unless requires exactly one argument'); + } + return instance.helpers['if'].call(this, conditional, { + fn: options.inverse, + inverse: options.fn, + hash: options.hash + }); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 27 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 28 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field, options) { + if (!obj) { + // Note for 5.0: Change to "obj == null" in 5.0 + return obj; + } + return options.lookupProperty(obj, field); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (arguments.length != 2) { + throw new _exception2['default']('#with requires exactly one argument'); + } + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(31); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + // eslint-disable-next-line no-console + if (!console[method]) { + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$create = __webpack_require__(34)['default']; + + var _Object$keys = __webpack_require__(13)['default']; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + exports.__esModule = true; + exports.createProtoAccessControl = createProtoAccessControl; + exports.resultIsAllowed = resultIsAllowed; + exports.resetLoggedProperties = resetLoggedProperties; + + var _createNewLookupObject = __webpack_require__(36); + + var _logger = __webpack_require__(32); + + var logger = _interopRequireWildcard(_logger); + + var loggedProperties = _Object$create(null); + + function createProtoAccessControl(runtimeOptions) { + var defaultMethodWhiteList = _Object$create(null); + defaultMethodWhiteList['constructor'] = false; + defaultMethodWhiteList['__defineGetter__'] = false; + defaultMethodWhiteList['__defineSetter__'] = false; + defaultMethodWhiteList['__lookupGetter__'] = false; + + var defaultPropertyWhiteList = _Object$create(null); + // eslint-disable-next-line no-proto + defaultPropertyWhiteList['__proto__'] = false; + + return { + properties: { + whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties), + defaultValue: runtimeOptions.allowProtoPropertiesByDefault + }, + methods: { + whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods), + defaultValue: runtimeOptions.allowProtoMethodsByDefault + } + }; + } + + function resultIsAllowed(result, protoAccessControl, propertyName) { + if (typeof result === 'function') { + return checkWhiteList(protoAccessControl.methods, propertyName); + } else { + return checkWhiteList(protoAccessControl.properties, propertyName); + } + } + + function checkWhiteList(protoAccessControlForType, propertyName) { + if (protoAccessControlForType.whitelist[propertyName] !== undefined) { + return protoAccessControlForType.whitelist[propertyName] === true; + } + if (protoAccessControlForType.defaultValue !== undefined) { + return protoAccessControlForType.defaultValue; + } + logUnexpecedPropertyAccessOnce(propertyName); + return false; + } + + function logUnexpecedPropertyAccessOnce(propertyName) { + if (loggedProperties[propertyName] !== true) { + loggedProperties[propertyName] = true; + logger.log('error', 'Handlebars: Access has been denied to resolve the property "' + propertyName + '" because it is not an "own property" of its parent.\n' + 'You can add a runtime option to disable the check or this warning:\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details'); + } + } + + function resetLoggedProperties() { + _Object$keys(loggedProperties).forEach(function (propertyName) { + delete loggedProperties[propertyName]; + }); + } + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(35), __esModule: true }; + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(9); + module.exports = function create(P, D){ + return $.create(P, D); + }; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$create = __webpack_require__(34)['default']; + + exports.__esModule = true; + exports.createNewLookupObject = createNewLookupObject; + + var _utils = __webpack_require__(5); + + /** + * Create a new object with "null"-prototype to avoid truthy results on prototype properties. + * The resulting object can be used with "object[property]" to check if a property exists + * @param {...object} sources a varargs parameter of source objects that will be merged + * @returns {object} + */ + + function createNewLookupObject() { + for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) { + sources[_key] = arguments[_key]; + } + + return _utils.extend.apply(undefined, [_Object$create(null)].concat(sources)); + } + +/***/ }), +/* 37 */ +/***/ (function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$seal = __webpack_require__(39)['default']; + + var _Object$keys = __webpack_require__(13)['default']; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(5); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(4); + + var _helpers = __webpack_require__(10); + + var _internalWrapHelper = __webpack_require__(43); + + var _internalProtoAccess = __webpack_require__(33); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) { + return; + } + + if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as pseudo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0) + var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7; + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + partial = env.VM.resolvePartial.call(this, partial, context, options); + + var extendedOptions = Utils.extend({}, options, { + hooks: this.hooks, + protoAccessControl: this.protoAccessControl + }); + + var result = env.VM.invokePartial.call(this, partial, context, extendedOptions); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, extendedOptions); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name, loc) { + if (!obj || !(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj, { + loc: loc + }); + } + return obj[name]; + }, + lookupProperty: function lookupProperty(parent, propertyName) { + var result = parent[propertyName]; + if (result == null) { + return result; + } + if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { + return result; + } + + if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) { + return result; + } + return undefined; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + var result = depths[i] && container.lookupProperty(depths[i], name); + if (result != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + mergeIfNeeded: function mergeIfNeeded(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + // An empty object to use as replacement for null-contexts + nullContext: _Object$seal({}), + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + var mergedHelpers = Utils.extend({}, env.helpers, options.helpers); + wrapHelpersToPassLookupProperty(mergedHelpers, container); + container.helpers = mergedHelpers; + + if (templateSpec.usePartial) { + // Use mergeIfNeeded here to prevent compiling global partials multiple times + container.partials = container.mergeIfNeeded(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = Utils.extend({}, env.decorators, options.decorators); + } + + container.hooks = {}; + container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options); + + var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7; + _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers); + _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers); + } else { + container.protoAccessControl = options.protoAccessControl; // internal option + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + container.hooks = options.hooks; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + /** + * This is currently part of the official API, therefore implementation details should not be changed. + */ + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + // Use the current closure context to save the partial-block if this partial + var currentPartialBlock = options.data && options.data['partial-block']; + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + (function () { + options.data = _base.createFrame(options.data); + // Wrapper function to get access to currentPartialBlock from the closure + var fn = options.fn; + partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // Restore the partial-block from the closure for the execution of the block + // i.e. the part inside the block of the partial call. + options.data = _base.createFrame(options.data); + options.data['partial-block'] = currentPartialBlock; + return fn(context, options); + }; + if (fn.partials) { + options.partials = Utils.extend({}, options.partials, fn.partials); + } + })(); + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + + function wrapHelpersToPassLookupProperty(mergedHelpers, container) { + _Object$keys(mergedHelpers).forEach(function (helperName) { + var helper = mergedHelpers[helperName]; + mergedHelpers[helperName] = passLookupPropertyOption(helper, container); + }); + } + + function passLookupPropertyOption(helper, container) { + var lookupProperty = container.lookupProperty; + return _internalWrapHelper.wrapHelper(helper, function (options) { + return Utils.extend({ lookupProperty: lookupProperty }, options); + }); + } + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(40), __esModule: true }; + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(41); + module.exports = __webpack_require__(21).Object.seal; + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + + // 19.1.2.17 Object.seal(O) + var isObject = __webpack_require__(42); + + __webpack_require__(18)('seal', function($seal){ + return function seal(it){ + return $seal && isObject(it) ? $seal(it) : it; + }; + }); + +/***/ }), +/* 42 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + +/***/ }), +/* 43 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.wrapHelper = wrapHelper; + + function wrapHelper(helper, transformOptionsFn) { + if (typeof helper !== 'function') { + // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639 + // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function. + return helper; + } + var wrapper = function wrapper() /* dynamic arguments */{ + var options = arguments[arguments.length - 1]; + arguments[arguments.length - 1] = transformOptionsFn(options); + return helper.apply(this, arguments); + }; + return wrapper; + } + +/***/ }), +/* 44 */ +/***/ (function(module, exports) { + + /* WEBPACK VAR INJECTION */(function(global) {'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }), +/* 45 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + var AST = { + // Public API used to evaluate derived attributes regarding AST nodes + helpers: { + // a mustache is definitely a helper if: + // * it is an eligible helper, and + // * it has at least one parameter or hash segment + helperExpression: function helperExpression(node) { + return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash); + }, + + scopedId: function scopedId(path) { + return (/^\.|this\b/.test(path.original) + ); + }, + + // an ID is simple if it only has one part, and that part is not + // `..` or `this`. + simpleId: function simpleId(path) { + return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; + } + } + }; + + // Must be exported as an object rather than the root of the module as the jison lexer + // must modify the object to operate properly. + exports['default'] = AST; + module.exports = exports['default']; + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + exports.__esModule = true; + exports.parseWithoutProcessing = parseWithoutProcessing; + exports.parse = parse; + + var _parser = __webpack_require__(47); + + var _parser2 = _interopRequireDefault(_parser); + + var _whitespaceControl = __webpack_require__(48); + + var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl); + + var _helpers = __webpack_require__(50); + + var Helpers = _interopRequireWildcard(_helpers); + + var _utils = __webpack_require__(5); + + exports.parser = _parser2['default']; + + var yy = {}; + _utils.extend(yy, Helpers); + + function parseWithoutProcessing(input, options) { + // Just return if an already-compiled AST was passed in. + if (input.type === 'Program') { + return input; + } + + _parser2['default'].yy = yy; + + // Altering the shared object here, but this is ok as parser is a sync operation + yy.locInfo = function (locInfo) { + return new yy.SourceLocation(options && options.srcName, locInfo); + }; + + var ast = _parser2['default'].parse(input); + + return ast; + } + + function parse(input, options) { + var ast = parseWithoutProcessing(input, options); + var strip = new _whitespaceControl2['default'](options); + + return strip.accept(ast); + } + +/***/ }), +/* 47 */ +/***/ (function(module, exports) { + + // File ignored in coverage tests via setting in .istanbul.yml + /* Jison generated parser */ + "use strict"; + + exports.__esModule = true; + var handlebars = (function () { + var parser = { trace: function trace() {}, + yy: {}, + symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" }, + productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 0], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + break; + case 2: + this.$ = yy.prepareProgram($$[$0]); + break; + case 3: + this.$ = $$[$0]; + break; + case 4: + this.$ = $$[$0]; + break; + case 5: + this.$ = $$[$0]; + break; + case 6: + this.$ = $$[$0]; + break; + case 7: + this.$ = $$[$0]; + break; + case 8: + this.$ = $$[$0]; + break; + case 9: + this.$ = { + type: 'CommentStatement', + value: yy.stripComment($$[$0]), + strip: yy.stripFlags($$[$0], $$[$0]), + loc: yy.locInfo(this._$) + }; + + break; + case 10: + this.$ = { + type: 'ContentStatement', + original: $$[$0], + value: $$[$0], + loc: yy.locInfo(this._$) + }; + + break; + case 11: + this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); + break; + case 12: + this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; + break; + case 13: + this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); + break; + case 14: + this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); + break; + case 15: + this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 16: + this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 17: + this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 18: + this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; + break; + case 19: + var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), + program = yy.prepareProgram([inverse], $$[$0 - 1].loc); + program.chained = true; + + this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; + + break; + case 20: + this.$ = $$[$0]; + break; + case 21: + this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; + break; + case 22: + this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); + break; + case 23: + this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); + break; + case 24: + this.$ = { + type: 'PartialStatement', + name: $$[$0 - 3], + params: $$[$0 - 2], + hash: $$[$0 - 1], + indent: '', + strip: yy.stripFlags($$[$0 - 4], $$[$0]), + loc: yy.locInfo(this._$) + }; + + break; + case 25: + this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); + break; + case 26: + this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) }; + break; + case 27: + this.$ = $$[$0]; + break; + case 28: + this.$ = $$[$0]; + break; + case 29: + this.$ = { + type: 'SubExpression', + path: $$[$0 - 3], + params: $$[$0 - 2], + hash: $$[$0 - 1], + loc: yy.locInfo(this._$) + }; + + break; + case 30: + this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 31: + this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 32: + this.$ = yy.id($$[$0 - 1]); + break; + case 33: + this.$ = $$[$0]; + break; + case 34: + this.$ = $$[$0]; + break; + case 35: + this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 36: + this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) }; + break; + case 37: + this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) }; + break; + case 38: + this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) }; + break; + case 39: + this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) }; + break; + case 40: + this.$ = $$[$0]; + break; + case 41: + this.$ = $$[$0]; + break; + case 42: + this.$ = yy.preparePath(true, $$[$0], this._$); + break; + case 43: + this.$ = yy.preparePath(false, $$[$0], this._$); + break; + case 44: + $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; + break; + case 45: + this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; + break; + case 46: + this.$ = []; + break; + case 47: + $$[$0 - 1].push($$[$0]); + break; + case 48: + this.$ = []; + break; + case 49: + $$[$0 - 1].push($$[$0]); + break; + case 50: + this.$ = []; + break; + case 51: + $$[$0 - 1].push($$[$0]); + break; + case 58: + this.$ = []; + break; + case 59: + $$[$0 - 1].push($$[$0]); + break; + case 64: + this.$ = []; + break; + case 65: + $$[$0 - 1].push($$[$0]); + break; + case 70: + this.$ = []; + break; + case 71: + $$[$0 - 1].push($$[$0]); + break; + case 78: + this.$ = []; + break; + case 79: + $$[$0 - 1].push($$[$0]); + break; + case 82: + this.$ = []; + break; + case 83: + $$[$0 - 1].push($$[$0]); + break; + case 86: + this.$ = []; + break; + case 87: + $$[$0 - 1].push($$[$0]); + break; + case 90: + this.$ = []; + break; + case 91: + $$[$0 - 1].push($$[$0]); + break; + case 94: + this.$ = []; + break; + case 95: + $$[$0 - 1].push($$[$0]); + break; + case 98: + this.$ = [$$[$0]]; + break; + case 99: + $$[$0 - 1].push($$[$0]); + break; + case 100: + this.$ = [$$[$0]]; + break; + case 101: + $$[$0 - 1].push($$[$0]); + break; + } + }, + table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 15: [2, 48], 17: 39, 18: [2, 48] }, { 20: 41, 56: 40, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 44, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 45, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 41, 56: 48, 64: 42, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 49, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 50] }, { 72: [1, 35], 86: 51 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 52, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 53, 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 54, 47: [2, 54] }, { 28: 59, 43: 60, 44: [1, 58], 47: [2, 56] }, { 13: 62, 15: [1, 20], 18: [1, 61] }, { 33: [2, 86], 57: 63, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 64, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 65, 47: [1, 66] }, { 30: 67, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 68, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 69, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 70, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 74, 33: [2, 80], 50: 71, 63: 72, 64: 75, 65: [1, 43], 69: 73, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 79] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 50] }, { 20: 74, 53: 80, 54: [2, 84], 63: 81, 64: 75, 65: [1, 43], 69: 82, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 83, 47: [1, 66] }, { 47: [2, 55] }, { 4: 84, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 85, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 86, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 87, 47: [1, 66] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 74, 33: [2, 88], 58: 88, 63: 89, 64: 75, 65: [1, 43], 69: 90, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 91, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 92, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 31: 93, 33: [2, 60], 63: 94, 64: 75, 65: [1, 43], 69: 95, 70: 76, 71: 77, 72: [1, 78], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 66], 36: 96, 63: 97, 64: 75, 65: [1, 43], 69: 98, 70: 76, 71: 77, 72: [1, 78], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 22: 99, 23: [2, 52], 63: 100, 64: 75, 65: [1, 43], 69: 101, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 74, 33: [2, 92], 62: 102, 63: 103, 64: 75, 65: [1, 43], 69: 104, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 105] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 106, 72: [1, 107], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 108], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 109] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 55, 39: [1, 57], 43: 56, 44: [1, 58], 45: 111, 46: 110, 47: [2, 76] }, { 33: [2, 70], 40: 112, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 113] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 74, 63: 115, 64: 75, 65: [1, 43], 67: 114, 68: [2, 96], 69: 116, 70: 76, 71: 77, 72: [1, 78], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 117] }, { 32: 118, 33: [2, 62], 74: 119, 75: [1, 120] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 121, 74: 122, 75: [1, 120] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 123] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 124] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 108] }, { 20: 74, 63: 125, 64: 75, 65: [1, 43], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 74, 33: [2, 72], 41: 126, 63: 127, 64: 75, 65: [1, 43], 69: 128, 70: 76, 71: 77, 72: [1, 78], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 129] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 130] }, { 33: [2, 63] }, { 72: [1, 132], 76: 131 }, { 33: [1, 133] }, { 33: [2, 69] }, { 15: [2, 12], 18: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 134, 74: 135, 75: [1, 120] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 137], 77: [1, 136] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 138] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }], + defaultActions: { 4: [2, 1], 54: [2, 55], 56: [2, 20], 60: [2, 57], 73: [2, 81], 82: [2, 85], 86: [2, 18], 90: [2, 89], 101: [2, 53], 104: [2, 93], 110: [2, 19], 111: [2, 77], 116: [2, 97], 119: [2, 63], 122: [2, 69], 135: [2, 75], 136: [2, 32] }, + parseError: function parseError(str, hash) { + throw new Error(str); + }, + parse: function parse(input) { + var self = this, + stack = [0], + vstack = [null], + lstack = [], + table = this.table, + yytext = "", + yylineno = 0, + yyleng = 0, + recovering = 0, + TERROR = 2, + EOF = 1; + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + this.yy.parser = this; + if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + var ranges = this.lexer.options && this.lexer.options.ranges; + if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + function lex() { + var token; + token = self.lexer.lex() || 1; + if (typeof token !== "number") { + token = self.symbols_[token] || token; + } + return token; + } + var symbol, + preErrorSymbol, + state, + action, + a, + r, + yyval = {}, + p, + len, + newState, + expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + if (!recovering) { + expected = []; + for (p in table[state]) if (this.terminals_[p] && p > 2) { + expected.push("'" + this.terminals_[p] + "'"); + } + if (this.lexer.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); + } + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) recovering--; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; + if (ranges) { + yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; + } + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + /* Jison generated lexer */ + var lexer = (function () { + var lexer = { EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + setInput: function setInput(input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; + if (this.options.ranges) this.yylloc.range = [0, 0]; + this.offset = 0; + return this; + }, + input: function input() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) this.yylloc.range[1]++; + + this._input = this._input.slice(1); + return ch; + }, + unput: function unput(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) this.yylineno -= lines.length - 1; + var r = this.yylloc.range; + + this.yylloc = { first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + return this; + }, + more: function more() { + this._more = true; + return this; + }, + less: function less(n) { + this.unput(this.match.slice(n)); + }, + pastInput: function pastInput() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, ""); + }, + upcomingInput: function upcomingInput() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + showPosition: function showPosition() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + next: function next() { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, match, tempMatch, index, col, lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = { first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) this.done = false; + if (token) return token;else return; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno }); + } + }, + lex: function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + popState: function popState() { + return this.conditionStack.pop(); + }, + _currentRules: function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + }, + topState: function topState() { + return this.conditionStack[this.conditionStack.length - 2]; + }, + pushState: function begin(condition) { + this.begin(condition); + } }; + lexer.options = {}; + lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + + function strip(start, end) { + return yy_.yytext = yy_.yytext.substring(start, yy_.yyleng - end + start); + } + + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + if (yy_.yytext.slice(-2) === "\\\\") { + strip(0, 1); + this.begin("mu"); + } else if (yy_.yytext.slice(-1) === "\\") { + strip(0, 1); + this.begin("emu"); + } else { + this.begin("mu"); + } + if (yy_.yytext) return 15; + + break; + case 1: + return 15; + break; + case 2: + this.popState(); + return 15; + + break; + case 3: + this.begin('raw');return 15; + break; + case 4: + this.popState(); + // Should be using `this.topState()` below, but it currently + // returns the second top instead of the first top. Opened an + // issue about it at https://github.com/zaach/jison/issues/291 + if (this.conditionStack[this.conditionStack.length - 1] === 'raw') { + return 15; + } else { + strip(5, 9); + return 'END_RAW_BLOCK'; + } + + break; + case 5: + return 15; + break; + case 6: + this.popState(); + return 14; + + break; + case 7: + return 65; + break; + case 8: + return 68; + break; + case 9: + return 19; + break; + case 10: + this.popState(); + this.begin('raw'); + return 23; + + break; + case 11: + return 55; + break; + case 12: + return 60; + break; + case 13: + return 29; + break; + case 14: + return 47; + break; + case 15: + this.popState();return 44; + break; + case 16: + this.popState();return 44; + break; + case 17: + return 34; + break; + case 18: + return 39; + break; + case 19: + return 51; + break; + case 20: + return 48; + break; + case 21: + this.unput(yy_.yytext); + this.popState(); + this.begin('com'); + + break; + case 22: + this.popState(); + return 14; + + break; + case 23: + return 48; + break; + case 24: + return 73; + break; + case 25: + return 72; + break; + case 26: + return 72; + break; + case 27: + return 87; + break; + case 28: + // ignore whitespace + break; + case 29: + this.popState();return 54; + break; + case 30: + this.popState();return 33; + break; + case 31: + yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80; + break; + case 32: + yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80; + break; + case 33: + return 85; + break; + case 34: + return 82; + break; + case 35: + return 82; + break; + case 36: + return 83; + break; + case 37: + return 84; + break; + case 38: + return 81; + break; + case 39: + return 75; + break; + case 40: + return 77; + break; + case 41: + return 72; + break; + case 42: + yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72; + break; + case 43: + return 'INVALID'; + break; + case 44: + return 5; + break; + } + }; + lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^\/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]+?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/]; + lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } }; + return lexer; + })(); + parser.lexer = lexer; + function Parser() { + this.yy = {}; + }Parser.prototype = parser;parser.Parser = Parser; + return new Parser(); + })();exports["default"] = handlebars; + module.exports = exports["default"]; + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _visitor = __webpack_require__(49); + + var _visitor2 = _interopRequireDefault(_visitor); + + function WhitespaceControl() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + this.options = options; + } + WhitespaceControl.prototype = new _visitor2['default'](); + + WhitespaceControl.prototype.Program = function (program) { + var doStandalone = !this.options.ignoreStandalone; + + var isRoot = !this.isRootSeen; + this.isRootSeen = true; + + var body = program.body; + for (var i = 0, l = body.length; i < l; i++) { + var current = body[i], + strip = this.accept(current); + + if (!strip) { + continue; + } + + var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), + _isNextWhitespace = isNextWhitespace(body, i, isRoot), + openStandalone = strip.openStandalone && _isPrevWhitespace, + closeStandalone = strip.closeStandalone && _isNextWhitespace, + inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; + + if (strip.close) { + omitRight(body, i, true); + } + if (strip.open) { + omitLeft(body, i, true); + } + + if (doStandalone && inlineStandalone) { + omitRight(body, i); + + if (omitLeft(body, i)) { + // If we are on a standalone node, save the indent info for partials + if (current.type === 'PartialStatement') { + // Pull out the whitespace from the final line + current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; + } + } + } + if (doStandalone && openStandalone) { + omitRight((current.program || current.inverse).body); + + // Strip out the previous content node if it's whitespace only + omitLeft(body, i); + } + if (doStandalone && closeStandalone) { + // Always strip the next node + omitRight(body, i); + + omitLeft((current.inverse || current.program).body); + } + } + + return program; + }; + + WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) { + this.accept(block.program); + this.accept(block.inverse); + + // Find the inverse program that is involed with whitespace stripping. + var program = block.program || block.inverse, + inverse = block.program && block.inverse, + firstInverse = inverse, + lastInverse = inverse; + + if (inverse && inverse.chained) { + firstInverse = inverse.body[0].program; + + // Walk the inverse chain to find the last inverse that is actually in the chain. + while (lastInverse.chained) { + lastInverse = lastInverse.body[lastInverse.body.length - 1].program; + } + } + + var strip = { + open: block.openStrip.open, + close: block.closeStrip.close, + + // Determine the standalone candiacy. Basically flag our content as being possibly standalone + // so our parent can determine if we actually are standalone + openStandalone: isNextWhitespace(program.body), + closeStandalone: isPrevWhitespace((firstInverse || program).body) + }; + + if (block.openStrip.close) { + omitRight(program.body, null, true); + } + + if (inverse) { + var inverseStrip = block.inverseStrip; + + if (inverseStrip.open) { + omitLeft(program.body, null, true); + } + + if (inverseStrip.close) { + omitRight(firstInverse.body, null, true); + } + if (block.closeStrip.open) { + omitLeft(lastInverse.body, null, true); + } + + // Find standalone else statments + if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { + omitLeft(program.body); + omitRight(firstInverse.body); + } + } else if (block.closeStrip.open) { + omitLeft(program.body, null, true); + } + + return strip; + }; + + WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) { + return mustache.strip; + }; + + WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { + /* istanbul ignore next */ + var strip = node.strip || {}; + return { + inlineStandalone: true, + open: strip.open, + close: strip.close + }; + }; + + function isPrevWhitespace(body, i, isRoot) { + if (i === undefined) { + i = body.length; + } + + // Nodes that end with newlines are considered whitespace (but are special + // cased for strip operations) + var prev = body[i - 1], + sibling = body[i - 2]; + if (!prev) { + return isRoot; + } + + if (prev.type === 'ContentStatement') { + return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); + } + } + function isNextWhitespace(body, i, isRoot) { + if (i === undefined) { + i = -1; + } + + var next = body[i + 1], + sibling = body[i + 2]; + if (!next) { + return isRoot; + } + + if (next.type === 'ContentStatement') { + return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); + } + } + + // Marks the node to the right of the position as omitted. + // I.e. {{foo}}' ' will mark the ' ' node as omitted. + // + // If i is undefined, then the first child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitRight(body, i, multiple) { + var current = body[i == null ? 0 : i + 1]; + if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { + return; + } + + var original = current.value; + current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); + current.rightStripped = current.value !== original; + } + + // Marks the node to the left of the position as omitted. + // I.e. ' '{{foo}} will mark the ' ' node as omitted. + // + // If i is undefined then the last child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitLeft(body, i, multiple) { + var current = body[i == null ? body.length - 1 : i - 1]; + if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { + return; + } + + // We omit the last node if it's whitespace only and not preceded by a non-content node. + var original = current.value; + current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); + current.leftStripped = current.value !== original; + return current.leftStripped; + } + + exports['default'] = WhitespaceControl; + module.exports = exports['default']; + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + function Visitor() { + this.parents = []; + } + + Visitor.prototype = { + constructor: Visitor, + mutating: false, + + // Visits a given value. If mutating, will replace the value if necessary. + acceptKey: function acceptKey(node, name) { + var value = this.accept(node[name]); + if (this.mutating) { + // Hacky sanity check: This may have a few false positives for type for the helper + // methods but will generally do the right thing without a lot of overhead. + if (value && !Visitor.prototype[value.type]) { + throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); + } + node[name] = value; + } + }, + + // Performs an accept operation with added sanity check to ensure + // required keys are not removed. + acceptRequired: function acceptRequired(node, name) { + this.acceptKey(node, name); + + if (!node[name]) { + throw new _exception2['default'](node.type + ' requires ' + name); + } + }, + + // Traverses a given array. If mutating, empty respnses will be removed + // for child elements. + acceptArray: function acceptArray(array) { + for (var i = 0, l = array.length; i < l; i++) { + this.acceptKey(array, i); + + if (!array[i]) { + array.splice(i, 1); + i--; + l--; + } + } + }, + + accept: function accept(object) { + if (!object) { + return; + } + + /* istanbul ignore next: Sanity code */ + if (!this[object.type]) { + throw new _exception2['default']('Unknown type: ' + object.type, object); + } + + if (this.current) { + this.parents.unshift(this.current); + } + this.current = object; + + var ret = this[object.type](object); + + this.current = this.parents.shift(); + + if (!this.mutating || ret) { + return ret; + } else if (ret !== false) { + return object; + } + }, + + Program: function Program(program) { + this.acceptArray(program.body); + }, + + MustacheStatement: visitSubExpression, + Decorator: visitSubExpression, + + BlockStatement: visitBlock, + DecoratorBlock: visitBlock, + + PartialStatement: visitPartial, + PartialBlockStatement: function PartialBlockStatement(partial) { + visitPartial.call(this, partial); + + this.acceptKey(partial, 'program'); + }, + + ContentStatement: function ContentStatement() /* content */{}, + CommentStatement: function CommentStatement() /* comment */{}, + + SubExpression: visitSubExpression, + + PathExpression: function PathExpression() /* path */{}, + + StringLiteral: function StringLiteral() /* string */{}, + NumberLiteral: function NumberLiteral() /* number */{}, + BooleanLiteral: function BooleanLiteral() /* bool */{}, + UndefinedLiteral: function UndefinedLiteral() /* literal */{}, + NullLiteral: function NullLiteral() /* literal */{}, + + Hash: function Hash(hash) { + this.acceptArray(hash.pairs); + }, + HashPair: function HashPair(pair) { + this.acceptRequired(pair, 'value'); + } + }; + + function visitSubExpression(mustache) { + this.acceptRequired(mustache, 'path'); + this.acceptArray(mustache.params); + this.acceptKey(mustache, 'hash'); + } + function visitBlock(block) { + visitSubExpression.call(this, block); + + this.acceptKey(block, 'program'); + this.acceptKey(block, 'inverse'); + } + function visitPartial(partial) { + this.acceptRequired(partial, 'name'); + this.acceptArray(partial.params); + this.acceptKey(partial, 'hash'); + } + + exports['default'] = Visitor; + module.exports = exports['default']; + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.SourceLocation = SourceLocation; + exports.id = id; + exports.stripFlags = stripFlags; + exports.stripComment = stripComment; + exports.preparePath = preparePath; + exports.prepareMustache = prepareMustache; + exports.prepareRawBlock = prepareRawBlock; + exports.prepareBlock = prepareBlock; + exports.prepareProgram = prepareProgram; + exports.preparePartialBlock = preparePartialBlock; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + function validateClose(open, close) { + close = close.path ? close.path.original : close; + + if (open.path.original !== close) { + var errorNode = { loc: open.path.loc }; + + throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode); + } + } + + function SourceLocation(source, locInfo) { + this.source = source; + this.start = { + line: locInfo.first_line, + column: locInfo.first_column + }; + this.end = { + line: locInfo.last_line, + column: locInfo.last_column + }; + } + + function id(token) { + if (/^\[.*\]$/.test(token)) { + return token.substring(1, token.length - 1); + } else { + return token; + } + } + + function stripFlags(open, close) { + return { + open: open.charAt(2) === '~', + close: close.charAt(close.length - 3) === '~' + }; + } + + function stripComment(comment) { + return comment.replace(/^\{\{~?!-?-?/, '').replace(/-?-?~?\}\}$/, ''); + } + + function preparePath(data, parts, loc) { + loc = this.locInfo(loc); + + var original = data ? '@' : '', + dig = [], + depth = 0; + + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i].part, + + // If we have [] syntax then we do not treat path references as operators, + // i.e. foo.[this] resolves to approximately context.foo['this'] + isLiteral = parts[i].original !== part; + original += (parts[i].separator || '') + part; + + if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { + if (dig.length > 0) { + throw new _exception2['default']('Invalid path: ' + original, { loc: loc }); + } else if (part === '..') { + depth++; + } + } else { + dig.push(part); + } + } + + return { + type: 'PathExpression', + data: data, + depth: depth, + parts: dig, + original: original, + loc: loc + }; + } + + function prepareMustache(path, params, hash, open, strip, locInfo) { + // Must use charAt to support IE pre-10 + var escapeFlag = open.charAt(3) || open.charAt(2), + escaped = escapeFlag !== '{' && escapeFlag !== '&'; + + var decorator = /\*/.test(open); + return { + type: decorator ? 'Decorator' : 'MustacheStatement', + path: path, + params: params, + hash: hash, + escaped: escaped, + strip: strip, + loc: this.locInfo(locInfo) + }; + } + + function prepareRawBlock(openRawBlock, contents, close, locInfo) { + validateClose(openRawBlock, close); + + locInfo = this.locInfo(locInfo); + var program = { + type: 'Program', + body: contents, + strip: {}, + loc: locInfo + }; + + return { + type: 'BlockStatement', + path: openRawBlock.path, + params: openRawBlock.params, + hash: openRawBlock.hash, + program: program, + openStrip: {}, + inverseStrip: {}, + closeStrip: {}, + loc: locInfo + }; + } + + function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { + if (close && close.path) { + validateClose(openBlock, close); + } + + var decorator = /\*/.test(openBlock.open); + + program.blockParams = openBlock.blockParams; + + var inverse = undefined, + inverseStrip = undefined; + + if (inverseAndProgram) { + if (decorator) { + throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram); + } + + if (inverseAndProgram.chain) { + inverseAndProgram.program.body[0].closeStrip = close.strip; + } + + inverseStrip = inverseAndProgram.strip; + inverse = inverseAndProgram.program; + } + + if (inverted) { + inverted = inverse; + inverse = program; + program = inverted; + } + + return { + type: decorator ? 'DecoratorBlock' : 'BlockStatement', + path: openBlock.path, + params: openBlock.params, + hash: openBlock.hash, + program: program, + inverse: inverse, + openStrip: openBlock.strip, + inverseStrip: inverseStrip, + closeStrip: close && close.strip, + loc: this.locInfo(locInfo) + }; + } + + function prepareProgram(statements, loc) { + if (!loc && statements.length) { + var firstLoc = statements[0].loc, + lastLoc = statements[statements.length - 1].loc; + + /* istanbul ignore else */ + if (firstLoc && lastLoc) { + loc = { + source: firstLoc.source, + start: { + line: firstLoc.start.line, + column: firstLoc.start.column + }, + end: { + line: lastLoc.end.line, + column: lastLoc.end.column + } + }; + } + } + + return { + type: 'Program', + body: statements, + strip: {}, + loc: loc + }; + } + + function preparePartialBlock(open, program, close, locInfo) { + validateClose(open, close); + + return { + type: 'PartialBlockStatement', + name: open.path, + params: open.params, + hash: open.hash, + program: program, + openStrip: open.strip, + closeStrip: close && close.strip, + loc: this.locInfo(locInfo) + }; + } + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + + /* eslint-disable new-cap */ + + 'use strict'; + + var _Object$create = __webpack_require__(34)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.Compiler = Compiler; + exports.precompile = precompile; + exports.compile = compile; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _utils = __webpack_require__(5); + + var _ast = __webpack_require__(45); + + var _ast2 = _interopRequireDefault(_ast); + + var slice = [].slice; + + function Compiler() {} + + // the foundHelper register will disambiguate helper lookup from finding a + // function in a context. This is necessary for mustache compatibility, which + // requires that context functions in blocks are evaluated by blockHelperMissing, + // and then proceed as if the resulting value was provided to blockHelperMissing. + + Compiler.prototype = { + compiler: Compiler, + + equals: function equals(other) { + var len = this.opcodes.length; + if (other.opcodes.length !== len) { + return false; + } + + for (var i = 0; i < len; i++) { + var opcode = this.opcodes[i], + otherOpcode = other.opcodes[i]; + if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { + return false; + } + } + + // We know that length is the same between the two arrays because they are directly tied + // to the opcode behavior above. + len = this.children.length; + for (var i = 0; i < len; i++) { + if (!this.children[i].equals(other.children[i])) { + return false; + } + } + + return true; + }, + + guid: 0, + + compile: function compile(program, options) { + this.sourceNode = []; + this.opcodes = []; + this.children = []; + this.options = options; + this.stringParams = options.stringParams; + this.trackIds = options.trackIds; + + options.blockParams = options.blockParams || []; + + options.knownHelpers = _utils.extend(_Object$create(null), { + helperMissing: true, + blockHelperMissing: true, + each: true, + 'if': true, + unless: true, + 'with': true, + log: true, + lookup: true + }, options.knownHelpers); + + return this.accept(program); + }, + + compileProgram: function compileProgram(program) { + var childCompiler = new this.compiler(), + // eslint-disable-line new-cap + result = childCompiler.compile(program, this.options), + guid = this.guid++; + + this.usePartial = this.usePartial || result.usePartial; + + this.children[guid] = result; + this.useDepths = this.useDepths || result.useDepths; + + return guid; + }, + + accept: function accept(node) { + /* istanbul ignore next: Sanity code */ + if (!this[node.type]) { + throw new _exception2['default']('Unknown type: ' + node.type, node); + } + + this.sourceNode.unshift(node); + var ret = this[node.type](node); + this.sourceNode.shift(); + return ret; + }, + + Program: function Program(program) { + this.options.blockParams.unshift(program.blockParams); + + var body = program.body, + bodyLength = body.length; + for (var i = 0; i < bodyLength; i++) { + this.accept(body[i]); + } + + this.options.blockParams.shift(); + + this.isSimple = bodyLength === 1; + this.blockParams = program.blockParams ? program.blockParams.length : 0; + + return this; + }, + + BlockStatement: function BlockStatement(block) { + transformLiteralToPath(block); + + var program = block.program, + inverse = block.inverse; + + program = program && this.compileProgram(program); + inverse = inverse && this.compileProgram(inverse); + + var type = this.classifySexpr(block); + + if (type === 'helper') { + this.helperSexpr(block, program, inverse); + } else if (type === 'simple') { + this.simpleSexpr(block); + + // now that the simple mustache is resolved, we need to + // evaluate it by executing `blockHelperMissing` + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + this.opcode('emptyHash'); + this.opcode('blockValue', block.path.original); + } else { + this.ambiguousSexpr(block, program, inverse); + + // now that the simple mustache is resolved, we need to + // evaluate it by executing `blockHelperMissing` + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + this.opcode('emptyHash'); + this.opcode('ambiguousBlockValue'); + } + + this.opcode('append'); + }, + + DecoratorBlock: function DecoratorBlock(decorator) { + var program = decorator.program && this.compileProgram(decorator.program); + var params = this.setupFullMustacheParams(decorator, program, undefined), + path = decorator.path; + + this.useDecorators = true; + this.opcode('registerDecorator', params.length, path.original); + }, + + PartialStatement: function PartialStatement(partial) { + this.usePartial = true; + + var program = partial.program; + if (program) { + program = this.compileProgram(partial.program); + } + + var params = partial.params; + if (params.length > 1) { + throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); + } else if (!params.length) { + if (this.options.explicitPartialContext) { + this.opcode('pushLiteral', 'undefined'); + } else { + params.push({ type: 'PathExpression', parts: [], depth: 0 }); + } + } + + var partialName = partial.name.original, + isDynamic = partial.name.type === 'SubExpression'; + if (isDynamic) { + this.accept(partial.name); + } + + this.setupFullMustacheParams(partial, program, undefined, true); + + var indent = partial.indent || ''; + if (this.options.preventIndent && indent) { + this.opcode('appendContent', indent); + indent = ''; + } + + this.opcode('invokePartial', isDynamic, partialName, indent); + this.opcode('append'); + }, + PartialBlockStatement: function PartialBlockStatement(partialBlock) { + this.PartialStatement(partialBlock); + }, + + MustacheStatement: function MustacheStatement(mustache) { + this.SubExpression(mustache); + + if (mustache.escaped && !this.options.noEscape) { + this.opcode('appendEscaped'); + } else { + this.opcode('append'); + } + }, + Decorator: function Decorator(decorator) { + this.DecoratorBlock(decorator); + }, + + ContentStatement: function ContentStatement(content) { + if (content.value) { + this.opcode('appendContent', content.value); + } + }, + + CommentStatement: function CommentStatement() {}, + + SubExpression: function SubExpression(sexpr) { + transformLiteralToPath(sexpr); + var type = this.classifySexpr(sexpr); + + if (type === 'simple') { + this.simpleSexpr(sexpr); + } else if (type === 'helper') { + this.helperSexpr(sexpr); + } else { + this.ambiguousSexpr(sexpr); + } + }, + ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { + var path = sexpr.path, + name = path.parts[0], + isBlock = program != null || inverse != null; + + this.opcode('getContext', path.depth); + + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + + path.strict = true; + this.accept(path); + + this.opcode('invokeAmbiguous', name, isBlock); + }, + + simpleSexpr: function simpleSexpr(sexpr) { + var path = sexpr.path; + path.strict = true; + this.accept(path); + this.opcode('resolvePossibleLambda'); + }, + + helperSexpr: function helperSexpr(sexpr, program, inverse) { + var params = this.setupFullMustacheParams(sexpr, program, inverse), + path = sexpr.path, + name = path.parts[0]; + + if (this.options.knownHelpers[name]) { + this.opcode('invokeKnownHelper', params.length, name); + } else if (this.options.knownHelpersOnly) { + throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); + } else { + path.strict = true; + path.falsy = true; + + this.accept(path); + this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path)); + } + }, + + PathExpression: function PathExpression(path) { + this.addDepth(path.depth); + this.opcode('getContext', path.depth); + + var name = path.parts[0], + scoped = _ast2['default'].helpers.scopedId(path), + blockParamId = !path.depth && !scoped && this.blockParamIndex(name); + + if (blockParamId) { + this.opcode('lookupBlockParam', blockParamId, path.parts); + } else if (!name) { + // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` + this.opcode('pushContext'); + } else if (path.data) { + this.options.data = true; + this.opcode('lookupData', path.depth, path.parts, path.strict); + } else { + this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped); + } + }, + + StringLiteral: function StringLiteral(string) { + this.opcode('pushString', string.value); + }, + + NumberLiteral: function NumberLiteral(number) { + this.opcode('pushLiteral', number.value); + }, + + BooleanLiteral: function BooleanLiteral(bool) { + this.opcode('pushLiteral', bool.value); + }, + + UndefinedLiteral: function UndefinedLiteral() { + this.opcode('pushLiteral', 'undefined'); + }, + + NullLiteral: function NullLiteral() { + this.opcode('pushLiteral', 'null'); + }, + + Hash: function Hash(hash) { + var pairs = hash.pairs, + i = 0, + l = pairs.length; + + this.opcode('pushHash'); + + for (; i < l; i++) { + this.pushParam(pairs[i].value); + } + while (i--) { + this.opcode('assignToHash', pairs[i].key); + } + this.opcode('popHash'); + }, + + // HELPERS + opcode: function opcode(name) { + this.opcodes.push({ + opcode: name, + args: slice.call(arguments, 1), + loc: this.sourceNode[0].loc + }); + }, + + addDepth: function addDepth(depth) { + if (!depth) { + return; + } + + this.useDepths = true; + }, + + classifySexpr: function classifySexpr(sexpr) { + var isSimple = _ast2['default'].helpers.simpleId(sexpr.path); + + var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); + + // a mustache is an eligible helper if: + // * its id is simple (a single part, not `this` or `..`) + var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr); + + // if a mustache is an eligible helper but not a definite + // helper, it is ambiguous, and will be resolved in a later + // pass or at runtime. + var isEligible = !isBlockParam && (isHelper || isSimple); + + // if ambiguous, we can possibly resolve the ambiguity now + // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. + if (isEligible && !isHelper) { + var _name = sexpr.path.parts[0], + options = this.options; + if (options.knownHelpers[_name]) { + isHelper = true; + } else if (options.knownHelpersOnly) { + isEligible = false; + } + } + + if (isHelper) { + return 'helper'; + } else if (isEligible) { + return 'ambiguous'; + } else { + return 'simple'; + } + }, + + pushParams: function pushParams(params) { + for (var i = 0, l = params.length; i < l; i++) { + this.pushParam(params[i]); + } + }, + + pushParam: function pushParam(val) { + var value = val.value != null ? val.value : val.original || ''; + + if (this.stringParams) { + if (value.replace) { + value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); + } + + if (val.depth) { + this.addDepth(val.depth); + } + this.opcode('getContext', val.depth || 0); + this.opcode('pushStringParam', value, val.type); + + if (val.type === 'SubExpression') { + // SubExpressions get evaluated and passed in + // in string params mode. + this.accept(val); + } + } else { + if (this.trackIds) { + var blockParamIndex = undefined; + if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) { + blockParamIndex = this.blockParamIndex(val.parts[0]); + } + if (blockParamIndex) { + var blockParamChild = val.parts.slice(1).join('.'); + this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); + } else { + value = val.original || value; + if (value.replace) { + value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, ''); + } + + this.opcode('pushId', val.type, value); + } + } + this.accept(val); + } + }, + + setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { + var params = sexpr.params; + this.pushParams(params); + + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + + if (sexpr.hash) { + this.accept(sexpr.hash); + } else { + this.opcode('emptyHash', omitEmpty); + } + + return params; + }, + + blockParamIndex: function blockParamIndex(name) { + for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { + var blockParams = this.options.blockParams[depth], + param = blockParams && _utils.indexOf(blockParams, name); + if (blockParams && param >= 0) { + return [depth, param]; + } + } + } + }; + + function precompile(input, options, env) { + if (input == null || typeof input !== 'string' && input.type !== 'Program') { + throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); + } + + options = options || {}; + if (!('data' in options)) { + options.data = true; + } + if (options.compat) { + options.useDepths = true; + } + + var ast = env.parse(input, options), + environment = new env.Compiler().compile(ast, options); + return new env.JavaScriptCompiler().compile(environment, options); + } + + function compile(input, options, env) { + if (options === undefined) options = {}; + + if (input == null || typeof input !== 'string' && input.type !== 'Program') { + throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); + } + + options = _utils.extend({}, options); + if (!('data' in options)) { + options.data = true; + } + if (options.compat) { + options.useDepths = true; + } + + var compiled = undefined; + + function compileInput() { + var ast = env.parse(input, options), + environment = new env.Compiler().compile(ast, options), + templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); + return env.template(templateSpec); + } + + // Template is only compiled on first use and cached after that point. + function ret(context, execOptions) { + if (!compiled) { + compiled = compileInput(); + } + return compiled.call(this, context, execOptions); + } + ret._setup = function (setupOptions) { + if (!compiled) { + compiled = compileInput(); + } + return compiled._setup(setupOptions); + }; + ret._child = function (i, data, blockParams, depths) { + if (!compiled) { + compiled = compileInput(); + } + return compiled._child(i, data, blockParams, depths); + }; + return ret; + } + + function argEquals(a, b) { + if (a === b) { + return true; + } + + if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { + for (var i = 0; i < a.length; i++) { + if (!argEquals(a[i], b[i])) { + return false; + } + } + return true; + } + } + + function transformLiteralToPath(sexpr) { + if (!sexpr.path.parts) { + var literal = sexpr.path; + // Casting to string here to make false and 0 literal values play nicely with the rest + // of the system. + sexpr.path = { + type: 'PathExpression', + data: false, + depth: 0, + parts: [literal.original + ''], + original: literal.original + '', + loc: literal.loc + }; + } + } + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$keys = __webpack_require__(13)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _base = __webpack_require__(4); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _utils = __webpack_require__(5); + + var _codeGen = __webpack_require__(53); + + var _codeGen2 = _interopRequireDefault(_codeGen); + + function Literal(value) { + this.value = value; + } + + function JavaScriptCompiler() {} + + JavaScriptCompiler.prototype = { + // PUBLIC API: You can override these methods in a subclass to provide + // alternative compiled forms for name lookup and buffering semantics + nameLookup: function nameLookup(parent, name /*, type */) { + return this.internalNameLookup(parent, name); + }, + depthedLookup: function depthedLookup(name) { + return [this.aliasable('container.lookup'), '(depths, "', name, '")']; + }, + + compilerInfo: function compilerInfo() { + var revision = _base.COMPILER_REVISION, + versions = _base.REVISION_CHANGES[revision]; + return [revision, versions]; + }, + + appendToBuffer: function appendToBuffer(source, location, explicit) { + // Force a source as this simplifies the merge logic. + if (!_utils.isArray(source)) { + source = [source]; + } + source = this.source.wrap(source, location); + + if (this.environment.isSimple) { + return ['return ', source, ';']; + } else if (explicit) { + // This is a case where the buffer operation occurs as a child of another + // construct, generally braces. We have to explicitly output these buffer + // operations to ensure that the emitted code goes in the correct location. + return ['buffer += ', source, ';']; + } else { + source.appendToBuffer = true; + return source; + } + }, + + initializeBuffer: function initializeBuffer() { + return this.quotedString(''); + }, + // END PUBLIC API + internalNameLookup: function internalNameLookup(parent, name) { + this.lookupPropertyFunctionIsUsed = true; + return ['lookupProperty(', parent, ',', JSON.stringify(name), ')']; + }, + + lookupPropertyFunctionIsUsed: false, + + compile: function compile(environment, options, context, asObject) { + this.environment = environment; + this.options = options; + this.stringParams = this.options.stringParams; + this.trackIds = this.options.trackIds; + this.precompile = !asObject; + + this.name = this.environment.name; + this.isChild = !!context; + this.context = context || { + decorators: [], + programs: [], + environments: [] + }; + + this.preamble(); + + this.stackSlot = 0; + this.stackVars = []; + this.aliases = {}; + this.registers = { list: [] }; + this.hashes = []; + this.compileStack = []; + this.inlineStack = []; + this.blockParams = []; + + this.compileChildren(environment, options); + + this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat; + this.useBlockParams = this.useBlockParams || environment.useBlockParams; + + var opcodes = environment.opcodes, + opcode = undefined, + firstLoc = undefined, + i = undefined, + l = undefined; + + for (i = 0, l = opcodes.length; i < l; i++) { + opcode = opcodes[i]; + + this.source.currentLocation = opcode.loc; + firstLoc = firstLoc || opcode.loc; + this[opcode.opcode].apply(this, opcode.args); + } + + // Flush any trailing content that might be pending. + this.source.currentLocation = firstLoc; + this.pushSource(''); + + /* istanbul ignore next */ + if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { + throw new _exception2['default']('Compile completed with content left on stack'); + } + + if (!this.decorators.isEmpty()) { + this.useDecorators = true; + + this.decorators.prepend(['var decorators = container.decorators, ', this.lookupPropertyFunctionVarDeclaration(), ';\n']); + this.decorators.push('return fn;'); + + if (asObject) { + this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]); + } else { + this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n'); + this.decorators.push('}\n'); + this.decorators = this.decorators.merge(); + } + } else { + this.decorators = undefined; + } + + var fn = this.createFunctionContext(asObject); + if (!this.isChild) { + var ret = { + compiler: this.compilerInfo(), + main: fn + }; + + if (this.decorators) { + ret.main_d = this.decorators; // eslint-disable-line camelcase + ret.useDecorators = true; + } + + var _context = this.context; + var programs = _context.programs; + var decorators = _context.decorators; + + for (i = 0, l = programs.length; i < l; i++) { + if (programs[i]) { + ret[i] = programs[i]; + if (decorators[i]) { + ret[i + '_d'] = decorators[i]; + ret.useDecorators = true; + } + } + } + + if (this.environment.usePartial) { + ret.usePartial = true; + } + if (this.options.data) { + ret.useData = true; + } + if (this.useDepths) { + ret.useDepths = true; + } + if (this.useBlockParams) { + ret.useBlockParams = true; + } + if (this.options.compat) { + ret.compat = true; + } + + if (!asObject) { + ret.compiler = JSON.stringify(ret.compiler); + + this.source.currentLocation = { start: { line: 1, column: 0 } }; + ret = this.objectLiteral(ret); + + if (options.srcName) { + ret = ret.toStringWithSourceMap({ file: options.destName }); + ret.map = ret.map && ret.map.toString(); + } else { + ret = ret.toString(); + } + } else { + ret.compilerOptions = this.options; + } + + return ret; + } else { + return fn; + } + }, + + preamble: function preamble() { + // track the last context pushed into place to allow skipping the + // getContext opcode when it would be a noop + this.lastContext = 0; + this.source = new _codeGen2['default'](this.options.srcName); + this.decorators = new _codeGen2['default'](this.options.srcName); + }, + + createFunctionContext: function createFunctionContext(asObject) { + // istanbul ignore next + + var _this = this; + + var varDeclarations = ''; + + var locals = this.stackVars.concat(this.registers.list); + if (locals.length > 0) { + varDeclarations += ', ' + locals.join(', '); + } + + // Generate minimizer alias mappings + // + // When using true SourceNodes, this will update all references to the given alias + // as the source nodes are reused in situ. For the non-source node compilation mode, + // aliases will not be used, but this case is already being run on the client and + // we aren't concern about minimizing the template size. + var aliasCount = 0; + _Object$keys(this.aliases).forEach(function (alias) { + var node = _this.aliases[alias]; + if (node.children && node.referenceCount > 1) { + varDeclarations += ', alias' + ++aliasCount + '=' + alias; + node.children[0] = 'alias' + aliasCount; + } + }); + + if (this.lookupPropertyFunctionIsUsed) { + varDeclarations += ', ' + this.lookupPropertyFunctionVarDeclaration(); + } + + var params = ['container', 'depth0', 'helpers', 'partials', 'data']; + + if (this.useBlockParams || this.useDepths) { + params.push('blockParams'); + } + if (this.useDepths) { + params.push('depths'); + } + + // Perform a second pass over the output to merge content when possible + var source = this.mergeSource(varDeclarations); + + if (asObject) { + params.push(source); + + return Function.apply(this, params); + } else { + return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); + } + }, + mergeSource: function mergeSource(varDeclarations) { + var isSimple = this.environment.isSimple, + appendOnly = !this.forceBuffer, + appendFirst = undefined, + sourceSeen = undefined, + bufferStart = undefined, + bufferEnd = undefined; + this.source.each(function (line) { + if (line.appendToBuffer) { + if (bufferStart) { + line.prepend(' + '); + } else { + bufferStart = line; + } + bufferEnd = line; + } else { + if (bufferStart) { + if (!sourceSeen) { + appendFirst = true; + } else { + bufferStart.prepend('buffer += '); + } + bufferEnd.add(';'); + bufferStart = bufferEnd = undefined; + } + + sourceSeen = true; + if (!isSimple) { + appendOnly = false; + } + } + }); + + if (appendOnly) { + if (bufferStart) { + bufferStart.prepend('return '); + bufferEnd.add(';'); + } else if (!sourceSeen) { + this.source.push('return "";'); + } + } else { + varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); + + if (bufferStart) { + bufferStart.prepend('return buffer + '); + bufferEnd.add(';'); + } else { + this.source.push('return buffer;'); + } + } + + if (varDeclarations) { + this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); + } + + return this.source.merge(); + }, + + lookupPropertyFunctionVarDeclaration: function lookupPropertyFunctionVarDeclaration() { + return '\n lookupProperty = container.lookupProperty || function(parent, propertyName) {\n if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n return parent[propertyName];\n }\n return undefined\n }\n '.trim(); + }, + + // [blockValue] + // + // On stack, before: hash, inverse, program, value + // On stack, after: return value of blockHelperMissing + // + // The purpose of this opcode is to take a block of the form + // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and + // replace it on the stack with the result of properly + // invoking blockHelperMissing. + blockValue: function blockValue(name) { + var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'), + params = [this.contextName(0)]; + this.setupHelperArgs(name, 0, params); + + var blockName = this.popStack(); + params.splice(1, 0, blockName); + + this.push(this.source.functionCall(blockHelperMissing, 'call', params)); + }, + + // [ambiguousBlockValue] + // + // On stack, before: hash, inverse, program, value + // Compiler value, before: lastHelper=value of last found helper, if any + // On stack, after, if no lastHelper: same as [blockValue] + // On stack, after, if lastHelper: value + ambiguousBlockValue: function ambiguousBlockValue() { + // We're being a bit cheeky and reusing the options value from the prior exec + var blockHelperMissing = this.aliasable('container.hooks.blockHelperMissing'), + params = [this.contextName(0)]; + this.setupHelperArgs('', 0, params, true); + + this.flushInline(); + + var current = this.topStack(); + params.splice(1, 0, current); + + this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); + }, + + // [appendContent] + // + // On stack, before: ... + // On stack, after: ... + // + // Appends the string value of `content` to the current buffer + appendContent: function appendContent(content) { + if (this.pendingContent) { + content = this.pendingContent + content; + } else { + this.pendingLocation = this.source.currentLocation; + } + + this.pendingContent = content; + }, + + // [append] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Coerces `value` to a String and appends it to the current buffer. + // + // If `value` is truthy, or 0, it is coerced into a string and appended + // Otherwise, the empty string is appended + append: function append() { + if (this.isInline()) { + this.replaceStack(function (current) { + return [' != null ? ', current, ' : ""']; + }); + + this.pushSource(this.appendToBuffer(this.popStack())); + } else { + var local = this.popStack(); + this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); + if (this.environment.isSimple) { + this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']); + } + } + }, + + // [appendEscaped] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Escape `value` and append it to the buffer + appendEscaped: function appendEscaped() { + this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')'])); + }, + + // [getContext] + // + // On stack, before: ... + // On stack, after: ... + // Compiler value, after: lastContext=depth + // + // Set the value of the `lastContext` compiler value to the depth + getContext: function getContext(depth) { + this.lastContext = depth; + }, + + // [pushContext] + // + // On stack, before: ... + // On stack, after: currentContext, ... + // + // Pushes the value of the current context onto the stack. + pushContext: function pushContext() { + this.pushStackLiteral(this.contextName(this.lastContext)); + }, + + // [lookupOnContext] + // + // On stack, before: ... + // On stack, after: currentContext[name], ... + // + // Looks up the value of `name` on the current context and pushes + // it onto the stack. + lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) { + var i = 0; + + if (!scoped && this.options.compat && !this.lastContext) { + // The depthed query is expected to handle the undefined logic for the root level that + // is implemented below, so we evaluate that directly in compat mode + this.push(this.depthedLookup(parts[i++])); + } else { + this.pushContext(); + } + + this.resolvePath('context', parts, i, falsy, strict); + }, + + // [lookupBlockParam] + // + // On stack, before: ... + // On stack, after: blockParam[name], ... + // + // Looks up the value of `parts` on the given block param and pushes + // it onto the stack. + lookupBlockParam: function lookupBlockParam(blockParamId, parts) { + this.useBlockParams = true; + + this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); + this.resolvePath('context', parts, 1); + }, + + // [lookupData] + // + // On stack, before: ... + // On stack, after: data, ... + // + // Push the data lookup operator + lookupData: function lookupData(depth, parts, strict) { + if (!depth) { + this.pushStackLiteral('data'); + } else { + this.pushStackLiteral('container.data(data, ' + depth + ')'); + } + + this.resolvePath('data', parts, 0, true, strict); + }, + + resolvePath: function resolvePath(type, parts, i, falsy, strict) { + // istanbul ignore next + + var _this2 = this; + + if (this.options.strict || this.options.assumeObjects) { + this.push(strictLookup(this.options.strict && strict, this, parts, type)); + return; + } + + var len = parts.length; + for (; i < len; i++) { + /* eslint-disable no-loop-func */ + this.replaceStack(function (current) { + var lookup = _this2.nameLookup(current, parts[i], type); + // We want to ensure that zero and false are handled properly if the context (falsy flag) + // needs to have the special handling for these values. + if (!falsy) { + return [' != null ? ', lookup, ' : ', current]; + } else { + // Otherwise we can use generic falsy handling + return [' && ', lookup]; + } + }); + /* eslint-enable no-loop-func */ + } + }, + + // [resolvePossibleLambda] + // + // On stack, before: value, ... + // On stack, after: resolved value, ... + // + // If the `value` is a lambda, replace it on the stack by + // the return value of the lambda + resolvePossibleLambda: function resolvePossibleLambda() { + this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); + }, + + // [pushStringParam] + // + // On stack, before: ... + // On stack, after: string, currentContext, ... + // + // This opcode is designed for use in string mode, which + // provides the string value of a parameter along with its + // depth rather than resolving it immediately. + pushStringParam: function pushStringParam(string, type) { + this.pushContext(); + this.pushString(type); + + // If it's a subexpression, the string result + // will be pushed after this opcode. + if (type !== 'SubExpression') { + if (typeof string === 'string') { + this.pushString(string); + } else { + this.pushStackLiteral(string); + } + } + }, + + emptyHash: function emptyHash(omitEmpty) { + if (this.trackIds) { + this.push('{}'); // hashIds + } + if (this.stringParams) { + this.push('{}'); // hashContexts + this.push('{}'); // hashTypes + } + this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); + }, + pushHash: function pushHash() { + if (this.hash) { + this.hashes.push(this.hash); + } + this.hash = { values: {}, types: [], contexts: [], ids: [] }; + }, + popHash: function popHash() { + var hash = this.hash; + this.hash = this.hashes.pop(); + + if (this.trackIds) { + this.push(this.objectLiteral(hash.ids)); + } + if (this.stringParams) { + this.push(this.objectLiteral(hash.contexts)); + this.push(this.objectLiteral(hash.types)); + } + + this.push(this.objectLiteral(hash.values)); + }, + + // [pushString] + // + // On stack, before: ... + // On stack, after: quotedString(string), ... + // + // Push a quoted version of `string` onto the stack + pushString: function pushString(string) { + this.pushStackLiteral(this.quotedString(string)); + }, + + // [pushLiteral] + // + // On stack, before: ... + // On stack, after: value, ... + // + // Pushes a value onto the stack. This operation prevents + // the compiler from creating a temporary variable to hold + // it. + pushLiteral: function pushLiteral(value) { + this.pushStackLiteral(value); + }, + + // [pushProgram] + // + // On stack, before: ... + // On stack, after: program(guid), ... + // + // Push a program expression onto the stack. This takes + // a compile-time guid and converts it into a runtime-accessible + // expression. + pushProgram: function pushProgram(guid) { + if (guid != null) { + this.pushStackLiteral(this.programExpression(guid)); + } else { + this.pushStackLiteral(null); + } + }, + + // [registerDecorator] + // + // On stack, before: hash, program, params..., ... + // On stack, after: ... + // + // Pops off the decorator's parameters, invokes the decorator, + // and inserts the decorator into the decorators list. + registerDecorator: function registerDecorator(paramSize, name) { + var foundDecorator = this.nameLookup('decorators', name, 'decorator'), + options = this.setupHelperArgs(name, paramSize); + + this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']); + }, + + // [invokeHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // Pops off the helper's parameters, invokes the helper, + // and pushes the helper's return value onto the stack. + // + // If the helper is not found, `helperMissing` is called. + invokeHelper: function invokeHelper(paramSize, name, isSimple) { + var nonHelper = this.popStack(), + helper = this.setupHelper(paramSize, name); + + var possibleFunctionCalls = []; + + if (isSimple) { + // direct call to helper + possibleFunctionCalls.push(helper.name); + } + // call a function from the input object + possibleFunctionCalls.push(nonHelper); + if (!this.options.strict) { + possibleFunctionCalls.push(this.aliasable('container.hooks.helperMissing')); + } + + var functionLookupCode = ['(', this.itemsSeparatedBy(possibleFunctionCalls, '||'), ')']; + var functionCall = this.source.functionCall(functionLookupCode, 'call', helper.callParams); + this.push(functionCall); + }, + + itemsSeparatedBy: function itemsSeparatedBy(items, separator) { + var result = []; + result.push(items[0]); + for (var i = 1; i < items.length; i++) { + result.push(separator, items[i]); + } + return result; + }, + // [invokeKnownHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // This operation is used when the helper is known to exist, + // so a `helperMissing` fallback is not required. + invokeKnownHelper: function invokeKnownHelper(paramSize, name) { + var helper = this.setupHelper(paramSize, name); + this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); + }, + + // [invokeAmbiguous] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of disambiguation + // + // This operation is used when an expression like `{{foo}}` + // is provided, but we don't know at compile-time whether it + // is a helper or a path. + // + // This operation emits more code than the other options, + // and can be avoided by passing the `knownHelpers` and + // `knownHelpersOnly` flags at compile-time. + invokeAmbiguous: function invokeAmbiguous(name, helperCall) { + this.useRegister('helper'); + + var nonHelper = this.popStack(); + + this.emptyHash(); + var helper = this.setupHelper(0, name, helperCall); + + var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); + + var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; + if (!this.options.strict) { + lookup[0] = '(helper = '; + lookup.push(' != null ? helper : ', this.aliasable('container.hooks.helperMissing')); + } + + this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); + }, + + // [invokePartial] + // + // On stack, before: context, ... + // On stack after: result of partial invocation + // + // This operation pops off a context, invokes a partial with that context, + // and pushes the result of the invocation back. + invokePartial: function invokePartial(isDynamic, name, indent) { + var params = [], + options = this.setupParams(name, 1, params); + + if (isDynamic) { + name = this.popStack(); + delete options.name; + } + + if (indent) { + options.indent = JSON.stringify(indent); + } + options.helpers = 'helpers'; + options.partials = 'partials'; + options.decorators = 'container.decorators'; + + if (!isDynamic) { + params.unshift(this.nameLookup('partials', name, 'partial')); + } else { + params.unshift(name); + } + + if (this.options.compat) { + options.depths = 'depths'; + } + options = this.objectLiteral(options); + params.push(options); + + this.push(this.source.functionCall('container.invokePartial', '', params)); + }, + + // [assignToHash] + // + // On stack, before: value, ..., hash, ... + // On stack, after: ..., hash, ... + // + // Pops a value off the stack and assigns it to the current hash + assignToHash: function assignToHash(key) { + var value = this.popStack(), + context = undefined, + type = undefined, + id = undefined; + + if (this.trackIds) { + id = this.popStack(); + } + if (this.stringParams) { + type = this.popStack(); + context = this.popStack(); + } + + var hash = this.hash; + if (context) { + hash.contexts[key] = context; + } + if (type) { + hash.types[key] = type; + } + if (id) { + hash.ids[key] = id; + } + hash.values[key] = value; + }, + + pushId: function pushId(type, name, child) { + if (type === 'BlockParam') { + this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); + } else if (type === 'PathExpression') { + this.pushString(name); + } else if (type === 'SubExpression') { + this.pushStackLiteral('true'); + } else { + this.pushStackLiteral('null'); + } + }, + + // HELPERS + + compiler: JavaScriptCompiler, + + compileChildren: function compileChildren(environment, options) { + var children = environment.children, + child = undefined, + compiler = undefined; + + for (var i = 0, l = children.length; i < l; i++) { + child = children[i]; + compiler = new this.compiler(); // eslint-disable-line new-cap + + var existing = this.matchExistingProgram(child); + + if (existing == null) { + this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children + var index = this.context.programs.length; + child.index = index; + child.name = 'program' + index; + this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); + this.context.decorators[index] = compiler.decorators; + this.context.environments[index] = child; + + this.useDepths = this.useDepths || compiler.useDepths; + this.useBlockParams = this.useBlockParams || compiler.useBlockParams; + child.useDepths = this.useDepths; + child.useBlockParams = this.useBlockParams; + } else { + child.index = existing.index; + child.name = 'program' + existing.index; + + this.useDepths = this.useDepths || existing.useDepths; + this.useBlockParams = this.useBlockParams || existing.useBlockParams; + } + } + }, + matchExistingProgram: function matchExistingProgram(child) { + for (var i = 0, len = this.context.environments.length; i < len; i++) { + var environment = this.context.environments[i]; + if (environment && environment.equals(child)) { + return environment; + } + } + }, + + programExpression: function programExpression(guid) { + var child = this.environment.children[guid], + programParams = [child.index, 'data', child.blockParams]; + + if (this.useBlockParams || this.useDepths) { + programParams.push('blockParams'); + } + if (this.useDepths) { + programParams.push('depths'); + } + + return 'container.program(' + programParams.join(', ') + ')'; + }, + + useRegister: function useRegister(name) { + if (!this.registers[name]) { + this.registers[name] = true; + this.registers.list.push(name); + } + }, + + push: function push(expr) { + if (!(expr instanceof Literal)) { + expr = this.source.wrap(expr); + } + + this.inlineStack.push(expr); + return expr; + }, + + pushStackLiteral: function pushStackLiteral(item) { + this.push(new Literal(item)); + }, + + pushSource: function pushSource(source) { + if (this.pendingContent) { + this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); + this.pendingContent = undefined; + } + + if (source) { + this.source.push(source); + } + }, + + replaceStack: function replaceStack(callback) { + var prefix = ['('], + stack = undefined, + createdStack = undefined, + usedLiteral = undefined; + + /* istanbul ignore next */ + if (!this.isInline()) { + throw new _exception2['default']('replaceStack on non-inline'); + } + + // We want to merge the inline statement into the replacement statement via ',' + var top = this.popStack(true); + + if (top instanceof Literal) { + // Literals do not need to be inlined + stack = [top.value]; + prefix = ['(', stack]; + usedLiteral = true; + } else { + // Get or create the current stack name for use by the inline + createdStack = true; + var _name = this.incrStack(); + + prefix = ['((', this.push(_name), ' = ', top, ')']; + stack = this.topStack(); + } + + var item = callback.call(this, stack); + + if (!usedLiteral) { + this.popStack(); + } + if (createdStack) { + this.stackSlot--; + } + this.push(prefix.concat(item, ')')); + }, + + incrStack: function incrStack() { + this.stackSlot++; + if (this.stackSlot > this.stackVars.length) { + this.stackVars.push('stack' + this.stackSlot); + } + return this.topStackName(); + }, + topStackName: function topStackName() { + return 'stack' + this.stackSlot; + }, + flushInline: function flushInline() { + var inlineStack = this.inlineStack; + this.inlineStack = []; + for (var i = 0, len = inlineStack.length; i < len; i++) { + var entry = inlineStack[i]; + /* istanbul ignore if */ + if (entry instanceof Literal) { + this.compileStack.push(entry); + } else { + var stack = this.incrStack(); + this.pushSource([stack, ' = ', entry, ';']); + this.compileStack.push(stack); + } + } + }, + isInline: function isInline() { + return this.inlineStack.length; + }, + + popStack: function popStack(wrapped) { + var inline = this.isInline(), + item = (inline ? this.inlineStack : this.compileStack).pop(); + + if (!wrapped && item instanceof Literal) { + return item.value; + } else { + if (!inline) { + /* istanbul ignore next */ + if (!this.stackSlot) { + throw new _exception2['default']('Invalid stack pop'); + } + this.stackSlot--; + } + return item; + } + }, + + topStack: function topStack() { + var stack = this.isInline() ? this.inlineStack : this.compileStack, + item = stack[stack.length - 1]; + + /* istanbul ignore if */ + if (item instanceof Literal) { + return item.value; + } else { + return item; + } + }, + + contextName: function contextName(context) { + if (this.useDepths && context) { + return 'depths[' + context + ']'; + } else { + return 'depth' + context; + } + }, + + quotedString: function quotedString(str) { + return this.source.quotedString(str); + }, + + objectLiteral: function objectLiteral(obj) { + return this.source.objectLiteral(obj); + }, + + aliasable: function aliasable(name) { + var ret = this.aliases[name]; + if (ret) { + ret.referenceCount++; + return ret; + } + + ret = this.aliases[name] = this.source.wrap(name); + ret.aliasable = true; + ret.referenceCount = 1; + + return ret; + }, + + setupHelper: function setupHelper(paramSize, name, blockHelper) { + var params = [], + paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); + var foundHelper = this.nameLookup('helpers', name, 'helper'), + callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})'); + + return { + params: params, + paramsInit: paramsInit, + name: foundHelper, + callParams: [callContext].concat(params) + }; + }, + + setupParams: function setupParams(helper, paramSize, params) { + var options = {}, + contexts = [], + types = [], + ids = [], + objectArgs = !params, + param = undefined; + + if (objectArgs) { + params = []; + } + + options.name = this.quotedString(helper); + options.hash = this.popStack(); + + if (this.trackIds) { + options.hashIds = this.popStack(); + } + if (this.stringParams) { + options.hashTypes = this.popStack(); + options.hashContexts = this.popStack(); + } + + var inverse = this.popStack(), + program = this.popStack(); + + // Avoid setting fn and inverse if neither are set. This allows + // helpers to do a check for `if (options.fn)` + if (program || inverse) { + options.fn = program || 'container.noop'; + options.inverse = inverse || 'container.noop'; + } + + // The parameters go on to the stack in order (making sure that they are evaluated in order) + // so we need to pop them off the stack in reverse order + var i = paramSize; + while (i--) { + param = this.popStack(); + params[i] = param; + + if (this.trackIds) { + ids[i] = this.popStack(); + } + if (this.stringParams) { + types[i] = this.popStack(); + contexts[i] = this.popStack(); + } + } + + if (objectArgs) { + options.args = this.source.generateArray(params); + } + + if (this.trackIds) { + options.ids = this.source.generateArray(ids); + } + if (this.stringParams) { + options.types = this.source.generateArray(types); + options.contexts = this.source.generateArray(contexts); + } + + if (this.options.data) { + options.data = 'data'; + } + if (this.useBlockParams) { + options.blockParams = 'blockParams'; + } + return options; + }, + + setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { + var options = this.setupParams(helper, paramSize, params); + options.loc = JSON.stringify(this.source.currentLocation); + options = this.objectLiteral(options); + if (useRegister) { + this.useRegister('options'); + params.push('options'); + return ['options=', options]; + } else if (params) { + params.push(options); + return ''; + } else { + return options; + } + } + }; + + (function () { + var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); + + var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; + + for (var i = 0, l = reservedWords.length; i < l; i++) { + compilerWords[reservedWords[i]] = true; + } + })(); + + /** + * @deprecated May be removed in the next major version + */ + JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { + return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); + }; + + function strictLookup(requireTerminal, compiler, parts, type) { + var stack = compiler.popStack(), + i = 0, + len = parts.length; + if (requireTerminal) { + len--; + } + + for (; i < len; i++) { + stack = compiler.nameLookup(stack, parts[i], type); + } + + if (requireTerminal) { + return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ', ', JSON.stringify(compiler.source.currentLocation), ' )']; + } else { + return stack; + } + } + + exports['default'] = JavaScriptCompiler; + module.exports = exports['default']; + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + + /* global define */ + 'use strict'; + + var _Object$keys = __webpack_require__(13)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var SourceNode = undefined; + + try { + /* istanbul ignore next */ + if (false) { + // We don't support this in AMD environments. For these environments, we asusme that + // they are running on the browser and thus have no need for the source-map library. + var SourceMap = require('source-map'); + SourceNode = SourceMap.SourceNode; + } + } catch (err) {} + /* NOP */ + + /* istanbul ignore if: tested but not covered in istanbul due to dist build */ + if (!SourceNode) { + SourceNode = function (line, column, srcFile, chunks) { + this.src = ''; + if (chunks) { + this.add(chunks); + } + }; + /* istanbul ignore next */ + SourceNode.prototype = { + add: function add(chunks) { + if (_utils.isArray(chunks)) { + chunks = chunks.join(''); + } + this.src += chunks; + }, + prepend: function prepend(chunks) { + if (_utils.isArray(chunks)) { + chunks = chunks.join(''); + } + this.src = chunks + this.src; + }, + toStringWithSourceMap: function toStringWithSourceMap() { + return { code: this.toString() }; + }, + toString: function toString() { + return this.src; + } + }; + } + + function castChunk(chunk, codeGen, loc) { + if (_utils.isArray(chunk)) { + var ret = []; + + for (var i = 0, len = chunk.length; i < len; i++) { + ret.push(codeGen.wrap(chunk[i], loc)); + } + return ret; + } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { + // Handle primitives that the SourceNode will throw up on + return chunk + ''; + } + return chunk; + } + + function CodeGen(srcFile) { + this.srcFile = srcFile; + this.source = []; + } + + CodeGen.prototype = { + isEmpty: function isEmpty() { + return !this.source.length; + }, + prepend: function prepend(source, loc) { + this.source.unshift(this.wrap(source, loc)); + }, + push: function push(source, loc) { + this.source.push(this.wrap(source, loc)); + }, + + merge: function merge() { + var source = this.empty(); + this.each(function (line) { + source.add([' ', line, '\n']); + }); + return source; + }, + + each: function each(iter) { + for (var i = 0, len = this.source.length; i < len; i++) { + iter(this.source[i]); + } + }, + + empty: function empty() { + var loc = this.currentLocation || { start: {} }; + return new SourceNode(loc.start.line, loc.start.column, this.srcFile); + }, + wrap: function wrap(chunk) { + var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; + + if (chunk instanceof SourceNode) { + return chunk; + } + + chunk = castChunk(chunk, this, loc); + + return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); + }, + + functionCall: function functionCall(fn, type, params) { + params = this.generateList(params); + return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); + }, + + quotedString: function quotedString(str) { + return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 + .replace(/\u2029/g, '\\u2029') + '"'; + }, + + objectLiteral: function objectLiteral(obj) { + // istanbul ignore next + + var _this = this; + + var pairs = []; + + _Object$keys(obj).forEach(function (key) { + var value = castChunk(obj[key], _this); + if (value !== 'undefined') { + pairs.push([_this.quotedString(key), ':', value]); + } + }); + + var ret = this.generateList(pairs); + ret.prepend('{'); + ret.add('}'); + return ret; + }, + + generateList: function generateList(entries) { + var ret = this.empty(); + + for (var i = 0, len = entries.length; i < len; i++) { + if (i) { + ret.add(','); + } + + ret.add(castChunk(entries[i], this)); + } + + return ret; + }, + + generateArray: function generateArray(entries) { + var ret = this.generateList(entries); + ret.prepend('['); + ret.add(']'); + + return ret; + } + }; + + exports['default'] = CodeGen; + module.exports = exports['default']; + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/www/static/test/1.9.2/test/lib/morphdom-umd.js b/www/static/test/1.9.2/test/lib/morphdom-umd.js new file mode 100644 index 000000000..21fdc3a9a --- /dev/null +++ b/www/static/test/1.9.2/test/lib/morphdom-umd.js @@ -0,0 +1,763 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.morphdom = factory()); +}(this, function () { 'use strict'; + + var DOCUMENT_FRAGMENT_NODE = 11; + + function morphAttrs(fromNode, toNode) { + var toNodeAttrs = toNode.attributes; + var attr; + var attrName; + var attrNamespaceURI; + var attrValue; + var fromValue; + + // document-fragments dont have attributes so lets not do anything + if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) { + return; + } + + // update attributes on original DOM element + for (var i = toNodeAttrs.length - 1; i >= 0; i--) { + attr = toNodeAttrs[i]; + attrName = attr.name; + attrNamespaceURI = attr.namespaceURI; + attrValue = attr.value; + + if (attrNamespaceURI) { + attrName = attr.localName || attrName; + fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName); + + if (fromValue !== attrValue) { + if (attr.prefix === 'xmlns'){ + attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix + } + fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue); + } + } else { + fromValue = fromNode.getAttribute(attrName); + + if (fromValue !== attrValue) { + fromNode.setAttribute(attrName, attrValue); + } + } + } + + // Remove any extra attributes found on the original DOM element that + // weren't found on the target element. + var fromNodeAttrs = fromNode.attributes; + + for (var d = fromNodeAttrs.length - 1; d >= 0; d--) { + attr = fromNodeAttrs[d]; + attrName = attr.name; + attrNamespaceURI = attr.namespaceURI; + + if (attrNamespaceURI) { + attrName = attr.localName || attrName; + + if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) { + fromNode.removeAttributeNS(attrNamespaceURI, attrName); + } + } else { + if (!toNode.hasAttribute(attrName)) { + fromNode.removeAttribute(attrName); + } + } + } + } + + var range; // Create a range object for efficently rendering strings to elements. + var NS_XHTML = 'http://www.w3.org/1999/xhtml'; + + var doc = typeof document === 'undefined' ? undefined : document; + var HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template'); + var HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange(); + + function createFragmentFromTemplate(str) { + var template = doc.createElement('template'); + template.innerHTML = str; + return template.content.childNodes[0]; + } + + function createFragmentFromRange(str) { + if (!range) { + range = doc.createRange(); + range.selectNode(doc.body); + } + + var fragment = range.createContextualFragment(str); + return fragment.childNodes[0]; + } + + function createFragmentFromWrap(str) { + var fragment = doc.createElement('body'); + fragment.innerHTML = str; + return fragment.childNodes[0]; + } + + /** + * This is about the same + * var html = new DOMParser().parseFromString(str, 'text/html'); + * return html.body.firstChild; + * + * @method toElement + * @param {String} str + */ + function toElement(str) { + str = str.trim(); + if (HAS_TEMPLATE_SUPPORT) { + // avoid restrictions on content for things like `Hi` which + // createContextualFragment doesn't support + //